QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#874025#4809. Maximum Rangexjx2009WA 76ms55184kbC++144.0kb2025-01-27 12:02:132025-01-27 12:02:17

Judging History

你现在查看的是最新测评结果

  • [2025-01-27 12:02:17]
  • 评测
  • 测评结果:WA
  • 用时:76ms
  • 内存:55184kb
  • [2025-01-27 12:02:13]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000010;
const ll INF=0x3f3f3f3f3f3f3f3f;

ll n,m;
ll e[N<<1],ne[N<<1],h[N],tot,l[N<<1];
ll ev[N<<1],nev[N<<1],hv[N],totv,lv[N<<1];
ll ec[N<<1],nec[N<<1],hc[N],totc;

ll dfn[N],low[N],cnt;
ll Max[N],Min[N];
ll b[N],bri[N],tc;

ll a1,b1,a2,b2,id1,id2;
ll ans,p1;
ll s,t;
ll d[N],top,nw[N];
ll q[N<<1],L,R;
ll l1[N],r1[N];
vector<ll> v;
ll s1[N];

ll tmp;

void add(ll x,ll y,ll z){
	e[++tot]=y;
	ne[tot]=h[x];
	h[x]=tot;
	l[tot]=z;
}

void addv(ll x,ll y,ll z,ll w){
//	cout<<x<<" "<<y<<" "<<z<<endl;
	ev[++totv]=y;nev[totv]=hv[x];hv[x]=totv;lv[totv]=z;
	ev[++totv]=x;nev[totv]=hv[y];hv[y]=totv;lv[totv]=w;
}

void addc(ll x,ll y){
	tmp++;
//	cout<<x<<" "<<y<<endl;
	ec[++totc]=y;nec[totc]=hc[x];hc[x]=totc;
	ec[++totc]=x;nec[totc]=hc[y];hc[y]=totc;
}

void tarjan(ll u,ll fa){
	dfn[u]=low[u]=++cnt;
	for(int i=h[u];i!=0;i=ne[i]){
		if(e[i]==fa) continue;
		if(!dfn[e[i]]){
			tarjan(e[i],u);
			low[u]=min(low[u],low[e[i]]);
			if(low[e[i]]>dfn[u]){
				bri[i]=bri[i^1]=1;
			}
		}
		else{
			low[u]=min(low[u],dfn[e[i]]);
		}
	}
}

void dfs(ll u,ll fa,ll col){
	b[u]=col;
	for(int i=h[u];i!=0;i=ne[i]){
		if(b[e[i]]==b[u]){
			Max[col]=max(Max[col],l[i]);
			Min[col]=min(Min[col],l[i]);
		}
		if(e[i]==fa||bri[i]||b[e[i]]) continue;
		dfs(e[i],u,col);
	}
}

bool bfs(){
	memset(d,0,sizeof(d));
	L=1;R=0;
	q[++R]=s;d[s]=1;nw[s]=hv[s];
	while(L<=R){
		ll u=q[L++];
		for(int i=hv[u];i!=0;i=nev[i]){
			if(lv[i]&&(!d[ev[i]])){
				d[ev[i]]=d[u]+1;
				nw[ev[i]]=hv[ev[i]];
				if(ev[i]==t) return 1;
				q[++R]=ev[i];
			}
		}
	}
	return 0;
}

ll dinic(ll u,ll flow){
	if(u==t) return flow;
	ll y=0;
	for(int i=nw[u];i!=0&&flow;i=nev[i]){
		nw[u]=i;
		if(lv[i]&&d[ev[i]]==d[u]+1){
			ll x=dinic(ev[i],min(lv[i],flow));
			if(!x) d[ev[i]]=0;
			flow-=x;y+=x;
			lv[i]-=x;lv[i^1]+=x;
		}
	}
	return y;
}

void dfs3(ll u,ll num){
	ll tag=0;
	for(int i=hc[u];i!=0;i=nec[i]){
		if(s1[i]) continue;
		s1[i]=s1[i^1]=1;
		dfs3(ec[i],num+1);
		tag=1;
//		return;
	}
	if(!tag) return;
	v.push_back(u);
	return;
}

int main(){
	tot=totv=totc=1;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		ll x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	for(int i=1;i<=n;i++){
		Max[i]=-INF;Min[i]=INF;
		if(!dfn[i]) tarjan(i,0);
	}
	for(int i=1;i<=n;i++){
		if(!b[i]) dfs(i,0,++tc);
	}
//	cout<<Max[1]<<" "<<Min[1]<<" "<<tc<<endl;
	
	p1=0,ans=-1;
	for(int i=1;i<=tc;i++){
		if(Max[i]-Min[i]>ans){
			ans=Max[i]-Min[i];
			p1=i;
		}
	}
	
	top=n+1;
	s=++top;t=++top;
//	cout<<endl;
	for(int i=1;i<=n;i++){
		if(b[i]!=p1) continue;
		for(int j=h[i];j!=0;j=ne[j]){
			if(b[e[j]]!=b[i]) continue;
			if((!a1)&&l[j]==Min[p1]){
				a1=i;b1=e[j];id1=j;
			}
			else if((!a2)&&l[j]==Max[p1]){
				a2=i;b2=e[j];id2=j;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(b[i]!=p1) continue;
		for(int j=h[i];j!=0;j=ne[j]){
			if(b[e[j]]!=b[i]) continue;
			if(i==a1&&e[j]==b1) continue;
			if(i==b1&&e[j]==a1) continue;
			if(i==a2&&e[j]==b2) continue;
			if(i==b2&&e[j]==a2) continue;
			
			if(i<e[j]){
				addv(i,e[j],1,1);
			}
		}
	}
	
	addv(s,a1,1,0);addv(s,b1,1,0);
	addv(a2,t,1,0);addv(b2,t,1,0);
	
	ll res=0;
	while(bfs()){
		ll x=0;
		while(x=dinic(s,INF)) res+=x;
	}
//	cout<<res<<endl;
	
//	cout<<endl;
	for(int i=2;i<=totv;i+=2){
		if(lv[i]!=1){
			ll x=ev[i],y=ev[i^1];
			if(x==s||x==t||y==s||y==t) continue;
			addc(x,y);
		}
	}
	addc(a1,b1);addc(a2,b2);
	if(m==100000) cout<<tmp<<endl;
	cout<<ans<<endl;
	dfs3(a1,1);
	cout<<v.size()<<endl;
	for(int i=0;i<v.size();i++){
		cout<<v[i]<<" ";
	}
	return 0;
}
/*
5 7
1 2 1
1 3 -2
2 3 1
3 4 3
4 5 1
1 5 -1
2 5 2

7 9
1 2 0
2 6 0
3 7 -100
6 7 0
1 4 100
4 5 0
2 5 0
5 6 0
2 3 0

5 6
1 3 100
1 4 0
3 4 0
4 2 0
4 5 0
5 2 -100
1 1 1 1 1 200

6 7
1 2 0
1 3 100
2 3 0
2 5 -10000
4 5 0
2 4 0
5 6 200

5 6
4 5 114
2 3 -100
1 2 0
1 5 0
1 4 0
3 4 0
*/

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 46008kb

input:

5 7
1 2 1
1 3 -2
2 3 1
3 4 3
4 5 1
1 5 -1
2 5 2

output:

5
4
5 4 3 1 

result:

ok ok

Test #2:

score: -100
Wrong Answer
time: 76ms
memory: 55184kb

input:

99997 100000
12238 99016 352755196
99016 25485 -412473602
25485 2440 991507552
2440 31171 -181894654
36970 2440 -800167579
2440 41865 -148191946
96629 31171 847888506
36970 95740 395546542
27992 2440 647886610
99016 29557 369124914
80795 27992 -673871966
36970 3509 573208857
57672 29557 874406776
41...

output:

37
1959330954
37
2440 25485 99016 29557 57672 69259 68883 44442 4697 96048 94991 86274 74677 92617 86665 76022 72089 22074 96230 87712 51491 72825 3463 84407 67966 89628 84997 54073 68523 30288 88289 37694 96778 46301 34883 95092 31171 

result:

wrong answer Integer 1959330954 violates the range [1, 100000]