社区讨论

为什么在codeforces上和本地输出不同

学术版参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo7j03kb
此快照首次捕获于
2023/10/27 02:36
2 年前
此快照最后确认于
2023/10/27 02:36
2 年前
查看原帖
错误展示: 错误数据:
3 3 3
1 2
2 3
3 1
a 1 1 1
b 2 1 3
c 3 1 2
b 1 1 2
c 2 1 3
a 3 1 1
我的代码:
C
#include<iostream>
#include<bitset>
#include<queue>
#include<cstring>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define ull unsigned long long
using namespace std;
using namespace __gnu_pbds;
const int N=1e3+5;
struct ed{ int last,to;}edge[N<<1];
int tot,n,num,m,k,h[N],vis[N],fa[N],pos[N],xx[N],yy[N];
ull w1[N],w2[N],w3[N],sum1[N],sum2[N],sum3[N],tmp[N],ans,res;
bitset<N> near[N],e[N];
gp_hash_table<string,int> um;
void add(int x,int y)
{
  edge[++num].last=h[x];
  edge[num].to=y; h[x]=num;
}
int find(int x){ if(fa[x]==x)return x; return fa[x]=find(fa[x]);}
void dfs(int u,int id)
{
  if(vis[u]&&find(vis[u])!=id)
    {
      int top=fa[vis[u]]; fa[top]=id;
      e[id]=e[top]=e[id]|e[top]; near[id]=near[top]=near[id]|near[top];
      for(int eid=near[id]._Find_first();eid!=near[id].size();eid=near[id]._Find_next(eid))
        {
          if(e[id][eid])near[id][eid]=0;
          else { near[id][eid]=1; continue;}
          int node=find(fa[vis[xx[eid]]])==id?yy[eid]:xx[eid];
          dfs(node,id);
        }
    }
  vis[u]=id;
  for(int i=h[u];i;i=edge[i].last)
    {
      int v=edge[i].to,eid=i+1>>1;
      if(vis[v]==id)continue;
      if(e[id][eid])near[id][eid]=0,dfs(v,id);
      else near[id][eid]=1;
    }  
}
int main()
{
  ios::sync_with_stdio(0),cin.tie(0); cin>>n>>m>>k;
  for(int i=1;i<=k;++i)w3[i]=rand(),fa[i]=i; for(int i=1;i<=n;++i)w2[i]=rand(); 
  for(int i=1;i<=m;++i)
    {
      int x,y; cin>>x>>y; w1[i]=rand();
      add(x,y),add(y,x); xx[i]=x; yy[i]=y;
    }
  for(int i=1;i<=k;++i)
    {
      string s; int cnt; cin>>s>>pos[i]>>cnt; if(!um[s])um[s]=++tot;
      for(int j=1;j<=cnt;++j){ int x; cin>>x; e[um[s]][x]=1; tmp[um[s]]+=w1[x];}
    }
  for(int u=1;u<=k;++u)for(int i=h[pos[u]];i;i=edge[i].last)near[u][i+1>>1]=1;
  for(int i=1;i<=k;++i)dfs(pos[i],i); for(int i=1;i<=n;++i)vis[i]=find(vis[i]);
  for(int i=1;i<=k;++i)sum3[vis[pos[i]]]+=w3[i],sum1[vis[pos[i]]]+=tmp[i];
  for(int i=1;i<=n;++i)sum2[vis[i]]+=w2[i]; for(int i=1;i<=n;++i)if(vis[i]==i)ans+=sum1[i]*sum2[i]*sum3[i];
  
  memset(sum1,0,sizeof(sum1)); memset(sum2,0,sizeof(sum2)); memset(sum3,0,sizeof(sum3));
  memset(vis,0,sizeof(vis)); memset(tmp,0,sizeof(tmp));
  for(int i=1;i<=k;++i)near[i]=e[i]=0; for(int i=1;i<=k;++i)fa[i]=i;  
  
  for(int i=1;i<=k;++i)
    {
      string s; int cnt; cin>>s>>pos[um[s]]>>cnt;
      for(int j=1;j<=cnt;++j){ int x; cin>>x; e[um[s]][x]=1; tmp[um[s]]+=w1[x];}
    }
  for(int u=1;u<=k;++u)for(int i=h[pos[u]];i;i=edge[i].last)near[u][i+1>>1]=1;
  for(int i=1;i<=k;++i)dfs(pos[i],i);
  for(int i=1;i<=n;++i)vis[i]=find(vis[i]);
  for(int i=1;i<=k;++i)sum3[vis[pos[i]]]+=w3[i],sum1[vis[pos[i]]]+=tmp[i];
  for(int i=1;i<=n;++i)sum2[vis[i]]+=w2[i]; for(int i=1;i<=n;++i)if(vis[i]==i)res+=sum1[i]*sum2[i]*sum3[i];
  if(res==ans)cout<<"YES"<<'\n';
  else cout<<"NO"<<'\n';
  return 0;
}         

回复

5 条回复,欢迎继续交流。

正在加载回复...