社区讨论

萌新TLE 求调

CF891CEnvy参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@loiiheb2
此快照首次捕获于
2023/11/03 19:07
2 年前
此快照最后确认于
2023/11/03 20:53
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+9;
int n,m,q,l;
struct Edge{
	int from,to,val;
	int idx;
	int p;
}f[N],g[N],e[N*2];
int vis[N];
int ans[N];
struct dsu{
	int stk[N],topa=0;
	int fa[N],sz[N];
	inline void init(){
		topa=0;
		for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
	}
	int find(int x){
		return fa[x]==x? x:find(fa[x]);
	}
	inline void merge(int x,int y){
		if(x==y)return;
//		cout<<"#!!!#!#$"<<x<<' '<<y<<'\n';
		if(sz[x]<sz[y])swap(x,y);
		sz[x]+=sz[y];
		fa[y]=x;
		stk[++topa]=y;
		return;
	}
	inline void del(){
		if(!topa)return;
		int u=stk[topa];
		--topa;
		sz[fa[u]]-=sz[u];
		fa[u]=u;
		return;
	}
	inline void roll(int x=0){
		while(topa>x)del();
		return;
	}
}d;
inline bool cmp(Edge a,Edge b){
	return a.val<b.val;
}
inline bool cmp2(Edge a,Edge b){
	if(a.idx==b.idx)return a.val<b.val;
	return a.idx<b.idx;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	d.init();
	for(int i=1;i<=m;i=-~i){
		cin>>f[i].from>>f[i].to>>f[i].val;
		f[i].idx=i;
		g[i]=f[i];
	}
	sort(f+1,f+m+1,cmp);
	cin>>q;
	for(int i=1;i<=q;i=-~i){
		int len;
		ans[i]=1;
		cin>>len;
		for(int j=1;j<=len;j=-~j){
			int x;
			cin>>x;
			e[++l]=g[x];
			e[l].idx=i;
			e[l].p=x;
		}
	}
	sort(e+1,e+l+1,cmp2);
	int pos=1;
	int las=0;
	int num=0;
//	for(int i=1;i<=l;i++){
//		if(e[i].val)
//		num++;
//	}
	for(int i=1;i<=l;i=-~i){
		if(!ans[e[i].idx])continue;
		if(i>1&&e[i-1].idx!=e[i].idx){
			d.roll();
			pos=1;
//			if(e[i-1].idx<e[i].idx)cout<<'\n';
		}
		while(pos<=m&&f[pos].val<g[e[i].p].val){
//			cout<<"????"<<pos<<' '<<f[pos].from<<' '<<f[pos].to<<' '<<d.find(f[pos].from)<<' '<<d.find(f[pos].to)<<'\n';
			d.merge(d.find(f[pos].from),d.find(f[pos].to));
			pos++;
		}
//		cout<<'#'<<pos<<' '<<g[e[i].p].from<<' '<<g[e[i].p].to<<' '<<d.find(g[e[i].p].from)<<' '<<d.find(g[e[i].p].to)<<'\n';
		int fx=d.find(g[e[i].p].from);
		int fy=d.find(g[e[i].p].to);
		if(fx==fy)ans[e[i].idx]=0;
		else d.merge(fx,fy);
	}
	for(int i=1;i<=q;i=-~i){
		ans[i]?puts("YES"):puts("NO");
	}
	return 0;
}
/*
5 7
1 2 2
1 3 2
2 3 1
2 4 1
3 4 1
3 5 2
4 5 2
5
2 3 4
3 3 4 5
2 1 7
2 1 2
2 2 4
*/

回复

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

正在加载回复...