社区讨论

本题正解是什么?

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 条回复,欢迎继续交流。

正在加载回复...