#include<bits/stdc++.h>
using namespace std;
int n,a[5005],fa[5005],vis[5005],siz[5005],x,y,h;
long long c;
long long ans=0,cnt;
basic_string<pair<int,int> > e[1000005];
inline int getf(int x){
if(x==fa[x]) return x;
return fa[x]=getf(fa[x]);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++) siz[i]=1;
cin>>x>>y>>h>>h;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){c=(c*x+y)%h;if(i<=j) e[c]+=pair<int,int>{i,j};}
for(int i=0;i<=999999;i++){
for(auto it=e[i].begin();it!=e[i].end();it++){
int u=it->first;
int v=it->second;
if(u==v&&!vis[u]) ans+=i*(a[u]-1),vis[u]=1,cnt+=a[u]-1;
else{
int fau=getf(u);
int fav=getf(v);
if(fau!=fav){
if(siz[fau]<siz[fav]) fa[fau]=fav,siz[fav]+=siz[fau];
else fa[fav]=fau,siz[fau]+=siz[fav];
if(vis[u]&&vis[v]) ans+=i,cnt++;
else if(vis[u]) ans+=1ll*i*a[v],vis[v]=1,cnt+=a[v];
else if(vis[v]) ans+=1ll*i*a[u],vis[u]=1,cnt+=a[u];
else ans+=1ll*i*(a[v]+a[u]-1),vis[u]=vis[v]=1,cnt+=a[v]+a[u]-1;
}
}
if(cnt==n-1) break;
}
}
cout<<ans;
return 0;
}
为何以下代码 pair<int,int> 改为pair<short,short> 就从TLE变AC了。
int的效率不是比short高吗