为什么在codeforces上和本地输出不同
  • 板块学术版
  • 楼主_8762
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/11/17 20:47
  • 上次更新2023/10/27 02:36:42
查看原帖
为什么在codeforces上和本地输出不同
370829
_8762楼主2022/11/17 20:47

错误展示: 错误数据:

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

我的代码:

#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;
}         
2022/11/17 20:47
加载中...