社区讨论
本题正解是什么?
P9216 [入门赛 #11] 写大作业 (Hard Version)参与者 9已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @lo2r7kon
- 此快照首次捕获于
- 2023/10/23 18:27 2 年前
- 此快照最后确认于
- 2023/10/23 18:27 2 年前
RT,写了个启发式合并维护哈希被卡了,不知道是不是哈希的问题?
CPP#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define int long long
const int MAXN=100005,F1=1e18,F2=1e9;
int mod[]={0,F1+7,F1+9,F1-7,F2+7,998244353},mul[]={0,F2+9,F2+7,19260817,114513,1919809},k=5;
int val[6][MAXN];
set<pii> s[MAXN];
void merge(int x,int y){
for(set<pii>::iterator it=s[x].begin();it!=s[x].end();it++){
set<pii>::iterator jt=s[y].lower_bound(make_pair(it->first,0));
int cnt;
if(jt==s[y].end() || jt->first!=it->first) cnt=0;
else cnt=jt->second,s[y].erase(jt);
s[y].insert(make_pair(it->first,cnt+(it->second)));
}
for(int i=1;i<=k;i++) val[i][y]=0;
for(set<pii>::iterator it=s[y].begin();it!=s[y].end();it++){
for(int i=1;i<=k;i++) val[i][y]=(1ll*val[i][y]*mul[i]%mod[i]+1ll*(it->first)*(it->second)%mod[i])%mod[i];
}
s[x].clear();
}
signed main(){
int n,m,q; read(n,q);
for(int i=1;i<=n;i++){
read(m);
for(int x,j=1;j<=m;j++){
read(x);
set<pii>::iterator it=s[i].lower_bound(make_pair(x,0));
int cnt;
if(it==s[i].end() || (it->first)!=x) cnt=0;
else cnt=it->second,s[i].erase(it);
s[i].insert(make_pair(x,cnt+1));
}
for(set<pii>::iterator it=s[i].begin();it!=s[i].end();it++){
for(int j=1;j<=k;j++) val[j][i]=(1ll*val[j][i]*mul[j]%mod[j]+1ll*(it->first)*(it->second)%mod[j])%mod[j];
}
}
int ans=0;
for(int t=1;t<=q;t++){
int op,l,r; read(op,l,r);
if(op==1) merge(l,r);
else{
bool flag=1;
for(int i=1;i<=k;i++) flag&=(val[i][l]==val[i][r]);
if(flag) ans^=t;
}
}
wrt(ans);
return flush(),0;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...