社区讨论
玄关求调
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 条回复,欢迎继续交流。
正在加载回复...