萌新刚学OI,一直#31T了,求调
  • 板块CF891C Envy
  • 楼主RiceFruit
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/2 08:27
  • 上次更新2023/10/24 02:07:39
查看原帖
萌新刚学OI,一直#31T了,求调
541916
RiceFruit楼主2023/2/2 08:27

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
inline int max(int x,int y){return x>y?x:y;}
const int N=5e5+5;
inline int read();
int n,m,q,u,v,w;
int ru[N],rv[N],rw[N];
struct sa{
	int nxt;
	int to;
	int w;
}e[N];
int h[N],cnt;
void add(int u,int v,int w){
	e[++cnt]=(sa){h[u],v,w};
	h[u]=cnt;
	return;
}
int fa[N],rnk[N];
struct Edge{
	int u;
	int v;
	int w;
}E[N];
inline bool cmpEdge(Edge a,Edge b){
	return a.w<b.w;
}
int len[N],tmp[N];
inline bool cmptmp(int a,int b){
	return rw[a]<rw[b];
}
struct node{
	int x;
	int y;
	int fx;
	int fy;
	int rk;
};
vector<node>lst;
inline int find(int x){
	if(x==fa[x])return x;
	return find(fa[x]);
}
inline void merge(int fx,int fy){
	int x=find(fx),y=find(fy);
	if(x==y)return;
	if(rnk[x]>rnk[y])swap(x,y);
	lst.push_back((node){fx,fy,x,y,rnk[fy]});
	fa[x]=y;
	rnk[y]=max(rnk[y],rnk[x]+1);
	return;
}
struct query{
	int from;
	int siz;
	vector<int>v;
}Q[N];
int sum;
inline void del(){
	int x=lst.back().x,y=lst.back().y,fx=lst.back().fx,fy=lst.back().fy,rk=lst.back().rk;
	lst.pop_back();
	fa[fx]=fx;
	rnk[fy]=rk;
	return;
}
inline bool cmpquery(query a,query b){
	if(rw[a.v[0]]!=rw[b.v[0]]) 
		return rw[a.v[0]]<rw[b.v[0]];
	return a.from<b.from;
}
int now=1;
bool ok[N];
int flag;
signed main(){
	n=read(),m=read();
	for(register int i=1;i<=m;++i){
		u=read(),v=read(),w=read();
		ru[i]=u,rv[i]=v,rw[i]=w;
		E[i]=(Edge){u,v,w};
		add(u,v,w);
	}
	sort(E+1,E+m+1,cmpEdge);
	for(register int i=1;i<=n;++i){
		fa[i]=i;
		rnk[i]=1;
	}
	q=read();
	for(register int i=1;i<=q;++i){
		len[i]=read(),ok[i]=1;
		for(register int j=1;j<=len[i];++j)
			tmp[j]=read();
		sort(tmp+1,tmp+len[i]+1,cmptmp);
		for(register int j=1;j<=len[i];++j){
			if(j==1||rw[tmp[j]]!=rw[tmp[j-1]]){
				Q[++sum].from=i;
			}
			Q[sum].v.push_back(tmp[j]);
			Q[sum].siz++;
		}
	}
	sort(Q+1,Q+sum+1,cmpquery);
	for(register int i=1;i<=sum;++i){
		while(now<=m&&E[now].w<rw[Q[i].v[0]])merge(E[now].u,E[now].v),now++;
		flag=1;
		for(register int j=0;j<Q[i].siz;++j){
			int id=Q[i].v[j];
			u=ru[id],v=rv[id];
			if(find(u)==find(v))
				flag=0;
			else
				merge(u,v);
		}
		for(register int j=Q[i].siz-1;j>=0;--j){
			int id=Q[i].v[j];
			u=ru[id],v=rv[id];
			if(lst.size()&&lst.back().x==u&&lst.back().y==v)
				del();
		}
		ok[Q[i].from]&=flag;
	}
	for(register int i=1;i<=q;++i){
		if(ok[i])
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}

悬赏3个关注

2023/2/2 08:27
加载中...