社区讨论

玄关求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mkjokrbr
此快照首次捕获于
2026/01/18 19:56
上个月
此快照最后确认于
2026/01/22 15:40
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int _,n,m,f,ff,fu,hao,ans,cnt;
int l[N],r[N],a[N],vis[N],dis[N],bfs[N],k[N],b[N],d[N*2];
map<pair<int,int>,int> ma;
vector<pair<int,int> > g[N];
priority_queue<int,vector<int>,greater<int> > q;
struct node{
	int l,r;
}c[N];
void init(){
	f=0; ma.clear(); ans=0;
	for(int i=1;i<=n;i++){
		g[i].clear();
		a[i]=1e18;
		bfs[i]=vis[i]=dis[i]=k[i]=b[i]=0;
	}
}
void dfs(int u,int fa){
	if(a[u]!=1e18) ff=2,hao=u;
	if(vis[u]) return ;
	vis[u]=1; 
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].second;
		if(v==fa) continue;
		dfs(v,u);
	}
}
void dfs1(int u,int fa,int zhi){
	if(a[u]!=1e18 && a[u]!=zhi) fu=1; 
	if(bfs[u]) return ;
	bfs[u]=1;
	a[u]=zhi;
	if(l[u]<=zhi && zhi<=r[u]) ans++;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].second,w=g[u][i].first;
		if(v==fa) continue;
		dfs1(v,u,w-zhi);
	}
}
void dfs2(int u,int fr,int kk,int bb){
	if(dis[u]){
		if(kk==k[u] && bb!=b[u]) fu=1;
		if(kk!=k[u]){
			if((b[u]-bb)%(kk-k[u])!=0) fu=1;
			else hao=(b[u]-bb)/(kk-k[u]);
		}
		return ;
	}
	dis[u]=1;
	k[u]=kk,b[u]=bb;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].second,w=g[u][i].first;
		if(v==fr) continue;
		dfs2(v,u,-kk,w-bb);
	}
}
void jie(int l,int r,int k,int b){
	if(k>0) d[++cnt]=l-b,d[++cnt]=r-b,c[cnt/2]={l-b,r-b};
	else d[++cnt]=b-r,d[++cnt]=b-l,c[cnt/2]={b-r,b-l};
}
void dfs3(int u,int fr,int kk,int bb){
	if(bfs[u]) return ;
	bfs[u]=1;
	jie(l[u],r[u],kk,bb);
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].second,w=g[u][i].first;
		if(v==fr) continue;
		dfs3(v,u,-kk,w-bb);
	}
}
bool cmp(node x,node y){
	return x.l<y.l;
}
void free(int j){
	cnt=0;
	dfs3(j,0,1,0);
	while(!q.empty()) q.pop();
	sort(d+1,d+1+cnt);
	sort(c+1,c+1+cnt/2,cmp);
	int h=0,num=0;
	for(int i=1;i<=cnt;i++){
		while(c[h+1].l<=d[i] && h+1<=cnt/2) h++,q.push(c[h].r);
		while(q.top()<d[i]) q.pop();
		int u=q.size();
		num=max(num,u);
	}
	ans+=num;
}
void work(){
	cin>>n>>m; 
	init();
	for(int i=1;i<=n;i++) cin>>l[i];
	for(int i=1;i<=n;i++) cin>>r[i];
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		if(x>y) swap(x,y);
		if(x==y){
			if(z%2) f=1;
			else a[i]=z/2;
		}
		if(ma.count({x,y}) && ma[{x,y}]!=z) f=1;
		else ma[{x,y}]=z;
	}
	if(f){
		cout<<-1<<'\n';
		return ;
	}
	map<pair<int,int>,int>::iterator it;
	for(it=ma.begin();it!=ma.end();it++){
		pair<int,int> x=it->first;
		int w=it->second;
		g[x.first].push_back({w,x.second});
		g[x.second].push_back({w,x.first});
	}
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		ff=0; dfs(i,0); fu=0;
		if(ff==2){
			dfs1(hao,0,a[hao]);
			if(fu){
				cout<<-1<<'\n';
				return ;
			}
		}else{
			hao=1e18,fu=0;
			dfs2(i,0,1,0);
			if(fu){
				cout<<-1<<'\n';
				return ;
			}
			if(hao==1e18) free(i);
			else dfs1(i,0,hao);
		}
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>_;
	while(_--) work();
	return 0;
}

回复

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

正在加载回复...