社区讨论

RE#4~13,求调

P14978[USACO26JAN1] Mooclear Reactor S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm1uiwwe
此快照首次捕获于
2026/02/25 17:42
2 周前
此快照最后确认于
2026/02/26 23:55
2 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+2;
int T,n,m,l[N],r[N],k[N],x[N],b[N],xx,yy,zz;
vector<int>g[N],lsh;
int cf[N],ll[N],rr[N];
int clac(int mf){
	for(int i=0;i<g[mf].size();++i){
		ll[i]=(l[g[mf][i]]-b[g[mf][i]])*k[g[mf][i]],rr[i]=(r[g[mf][i]]-b[g[mf][i]])*k[g[mf][i]];
		if(ll[i]>rr[i]) swap(ll[i],rr[i]);
		lsh.push_back(ll[i]),lsh.push_back(rr[i]),lsh.push_back(rr[i]+1);
	} 
	sort(lsh.begin(),lsh.end());
	lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
	for(int i=0;i<g[mf].size();++i){
		++cf[lower_bound(lsh.begin(),lsh.end(),ll[i])-lsh.begin()+1];
		--cf[lower_bound(lsh.begin(),lsh.end(),rr[i])-lsh.begin()+2];
	}
	int res=0;
	for(int i=1;i<=lsh.size();++i){
		cf[i]+=cf[i-1];
		res=max(res,cf[i]);
	}
	memset(cf,0,sizeof(cf));
	vector<int>().swap(g[mf]);
	vector<int>().swap(lsh);
	return res;
}
int solve(){
	int ans=0;
	for(int i=0;i<=n;++i) k[i]=1,x[i]=i,b[i]=0,g[i].push_back(i),g[0].push_back(-i);
	for(int i=1;i<=m;++i){
		cin>>xx>>yy>>zz;
		if(x[xx]==x[yy]){
			if(!x[xx]){
				if(b[xx]+b[yy]!=zz) return -1;
				continue;
			}
			if(k[xx]==k[yy]){
				int bb=zz-b[xx]-b[yy];
				if(bb&1) return -1;
				bb=bb/2*k[xx];
				int mfmf=x[xx]; 
				for(int jj:g[mfmf]) b[jj]=k[jj]*bb+b[jj],x[jj]=0;
				vector<int>().swap(g[mfmf]);
				continue;
			}
			if(b[xx]+b[yy]!=zz) return -1;
			continue;
		}
		if(g[x[xx]].size()>g[x[yy]].size()) swap(xx,yy); 
		int nx=x[xx],nk=-k[xx]*k[yy],bb=(zz-b[xx]-b[yy])*k[xx];
		for(int jj:g[nx]) b[jj]=k[jj]*bb+b[jj],k[jj]*=nk,x[jj]=x[yy],g[x[yy]].push_back(jj);
		vector<int>().swap(g[nx]);
	} 
	for(int i=1;i<=n;++i){
		if(!x[i]) ans+=(b[i]>=l[i]&&b[i]<=r[i]);
		if(g[i].size()) ans+=clac(i);
	}
	return ans;
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>T;
	for(int MF=1;MF<=T;++MF){	
		cin>>n>>m;
		for(int i=1;i<=n;++i) cin>>l[i];
		for(int i=1;i<=n;++i) cin>>r[i];
		cout<<solve()<<'\n';
		for(int i=0;i<=n;++i) vector<int>().swap(g[i]);
	}
	return 0;
} 

回复

0 条回复,欢迎继续交流。

正在加载回复...