为啥开 4e5 的数组过不了 5e5 才能过啊?
查看原帖
为啥开 4e5 的数组过不了 5e5 才能过啊?
332123
LHLeisus楼主2024/10/12 19:54
#include<bits/stdc++.h>
bool M1;
//#define int long long
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define ROF(i,a,b) for(int i=(a);i>=(b);--i)
#define mp(a,b) make_pair(a,b)
#define pll pair<long long,long long>
#define pii pair<int,int>
#define fi first
#define se second
#define eb emplace_back
#define ep emplace
#define pc __builtin_popcount
using namespace std;
typedef long long ll;
typedef double db;
const int N=5e5+5;
const int M=4e6;
const int inf=0x3f3f3f3f;
const int INF=0x7f7f7f7f;
const int mod=19260817;
inline int read();
int n,m,k;
int fac[M+5];
int fp(int a,int b){
	int ans=1;
	for(;b;b>>=1){
		if(b&1)ans=1ll*ans*a%mod;
		a=1ll*a*a%mod;
	}
	return ans;
}
int C(int n,int m){
	return 1ll*fac[n]*fp(fac[m],mod-2)%mod*fp(fac[n-m],mod-2)%mod;
}
int f[N];ll sz[N];
int Get(int k){return f[k]==k?k:f[k]=Get(f[k]);}
int num[N],c[N];
struct node{
	int opt,x,num,col;
}q[N];
struct ed{
	int u,v;
}e[N];
bool vis[N];
int ans[N];
map<int,ll>buc[N];
int sum[N];
void Merge(int u,int v){
	int fu=Get(u),fv=Get(v);
	if(fu==fv)return;
	if(sum[fu]<sum[fv])swap(fu,fv);
	f[fv]=fu;sz[fu]+=sz[fv];
	for(auto x:buc[fv]){
		int _a=x.fi;ll _b=x.se;
		if(buc[fu][_a]==0)sum[fu]++;
		buc[fu][_a]+=_b;
	}
}
bool M2;
signed main()
{
	n=read(),m=read();int Q=read();assert(n<=N-5&&m<=N-5&&Q<=N-5);
	FOR(i,1,n){
		f[i]=i;
		num[i]=read();sz[i]+=num[i];
		c[i]=read();
		if(buc[i][c[i]]==0)sum[i]++;
		buc[i][c[i]]+=num[i];
	}
	FOR(i,1,m)e[i]={read(),read()};
	FOR(i,1,Q){
		q[i].opt=read();
		if(q[i].opt==1){
			q[i].x=read(),q[i].num=read(),q[i].col=read();
			if(buc[q[i].x][q[i].col]==0)sum[q[i].x]++;
			buc[q[i].x][q[i].col]+=q[i].num;
			sz[q[i].x]+=q[i].num;
		}
		else if(q[i].opt==2){
			q[i].x=read();
			vis[q[i].x]=1;
		}
		else{
			q[i].x=read(),q[i].num=read(),q[i].col=read();
		}
	}
	fac[0]=1;
	FOR(i,1,M)fac[i]=1ll*fac[i-1]*i%mod;
	FOR(i,1,m){
		if(vis[i])continue;
		int u=e[i].u,v=e[i].v;
//		for(auto x:buc[u])printf("%lld:%lld\n",x.fi,x.se);
//		for(auto x:buc[v])printf("%lld:%lld\n",x.fi,x.se);
		Merge(u,v);
//		for(auto x:buc[Get(u)])printf("%lld:%lld\n",x.fi,x.se);
	}
	ROF(i,Q,1){
		int opt=q[i].opt,x=q[i].x,Num=q[i].num,col=q[i].col;
		if(opt==1){
			int fu=Get(x);
			sz[fu]-=Num;
			buc[fu][col]-=Num;
			if(!buc[fu][col])sum[fu]--;
		}
		else if(opt==2){
			int u=e[x].u,v=e[x].v;
			Merge(u,v);
		}
		else{
			int fu=Get(x);int g=buc[fu][col];
			int down=C(sz[fu],Num),up=C(g,Num);
			down=fp(down,mod-2);
			ans[i]=(1ll*up*down%mod);
		}
	}
	FOR(i,1,Q)if(q[i].opt==3)printf("%d\n",ans[i]);
//	for(int x:ans)printf("%d\n",x);
	cerr<<"\n"<<abs(&M1-&M2)/1024.0/1024.0<<"MB";
	return 0;
	//あまりに短い夏だけで何を残していけるのかな?
}


inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f*x;
}

2024/10/12 19:54
加载中...