社区讨论
为什么在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 条回复,欢迎继续交流。
正在加载回复...