求hack
查看原帖
求hack
631550
liuziqin楼主2024/10/20 11:41

求能hack掉我这个代码的数据,虽然我不知道样例是怎么过的

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
const int INF=1e9;
int n,m;
struct edge{
	int to,nxt,w;
}e[N<<1];
int head[N],cur;
void add_edge(int u,int v,int w){
	e[++cur].to=v;
	e[cur].nxt=head[u];
	e[cur].w=w;
	head[u]=cur;
}
struct tree{
	struct segtree{
		int mx[N<<2],mx_sec[N<<2],mn[N<<2],mn_sec[N<<2],mx_cnt[N<<2],mn_cnt[N<<2];
		int sum[N<<2],si[N<<2],lazy_add[N<<2],lazy_max[N<<2],lazy_min[N<<2];
		void pushup(int p){
			sum[p]=sum[p*2]+sum[p*2+1];
			si[p]=si[p*2]+si[p*2+1];
			if(mx[p*2]==mx[p*2+1]){
				mx[p]=mx[p*2];
				mx_sec[p]=max(mx_sec[p*2],mx_sec[p*2+1]);
				mx_cnt[p]=mx_cnt[p*2]+mx_cnt[p*2+1];
			}
			else if(mx[p*2]>mx[p*2+1]){
				mx[p]=mx[p*2];
				mx_cnt[p]=mx_cnt[p*2];
				mx_sec[p]=max(mx[p*2+1],mx_sec[p*2]);
			}
			else {
				mx[p]=mx[p*2+1];
				mx_sec[p]=max(mx[p*2],mx_sec[p*2+1]);
				mx_cnt[p]=mx_cnt[p*2+1];
			}//mx
			if(mn[p*2]==mn[p*2+1]){
				mn[p]=mn[p*2];
				mn_sec[p]=min(mn_sec[p*2],mn_sec[p*2+1]);
				mn_cnt[p]=mn_cnt[p*2]+mn_cnt[p*2+1];
			}
			else if(mn[p*2]<mn[p*2+1]){
				mn[p]=mn[p*2];
				mn_sec[p]=min(mn_sec[p*2],mn[p*2+1]);
				mn_cnt[p]=mn_cnt[p*2];
			}
			else {
				mn[p]=mn[p*2+1];
				mn_sec[p]=min(mn_sec[p*2+1],mn[p*2]);
				mn_cnt[p]=mn_cnt[p*2+1];
			}//mn
		}
		void a_lazy_add(int p,int v){
			lazy_add[p]+=v;
			sum[p]+=v*si[p];
			mx[p]+=v;
			mn[p]+=v;
			if(mx_sec[p]!=-INF)mx_sec[p]+=v;
			if(mn_sec[p]!=INF)mn_sec[p]+=v;
			if(lazy_max[p]!=-INF)lazy_max[p]+=v;
			if(lazy_min[p]!=INF)lazy_min[p]+=v;
		}
		void a_lazy_max(int p,int v){
			if(mn[p]>v)return ;
			sum[p]+=(v-mn[p])*mn_cnt[p];
			if(mx_sec[p]==mn[p])mx_sec[p]=v;
			if(mx[p]==mn[p])mx[p]=v;
			if(lazy_min[p]<v)lazy_min[p]=v;
			mn[p]=lazy_max[p]=v;
		}
		void a_lazy_min(int p,int v){
			if(mx[p]<=v)return ;
			sum[p]+=(v-mx[p])*mx_cnt[p];
			if(mn_sec[p]==mx[p])mn_sec[p]=v;
			if(mn[p]==mx[p])mn[p]=v;
			if(lazy_max[p]>v)lazy_max[p]=v;
			mx[p]=lazy_min[p]=v;
		}
		void push_down_add(int p){
			if(lazy_add[p]==0)return ;
			a_lazy_add(p*2,lazy_add[p]);
			a_lazy_add(p*2+1,lazy_add[p]);
			lazy_add[p]=0;
		}
		void push_down_max(int p){
			if(lazy_max[p]==-INF)return ;
			a_lazy_max(p*2,lazy_max[p]);
			a_lazy_max(p*2+1,lazy_max[p]);
			lazy_max[p]=-INF;
		}
		void push_down_min(int p){
			if(lazy_min[p]==INF)return ;
			a_lazy_min(p*2,lazy_min[p]);
			a_lazy_min(p*2+1,lazy_min[p]);
			lazy_min[p]=INF;
		}
		void push_down(int p){
			push_down_add(p);
			push_down_min(p);
			push_down_max(p);
		}
		void add_sum(int p,int l,int r,int x,int y,int v){
			if(l>=x&&r<=y){
				a_lazy_add(p,v);
				return ;
			}
			int mid=(l+r)>>1;
			push_down(p);
			if(mid>=x)add_sum(p*2,l,mid,x,y,v);
			if(mid<y)add_sum(p*2+1,mid+1,r,x,y,v);
			pushup(p);
		}
		void build(int p,int l,int r){
			lazy_max[p]=-INF;
			lazy_min[p]=INF;
			if(l==r){
				mx[p]=mn[p]=sum[p]=INF;
				mx_sec[p]=-INF;
				mn_sec[p]=INF;
				mx_cnt[p]=mn_cnt[p]=1;
				si[p]=1;
				return ;
			}
			int mid=(l+r)>>1;
			build(p*2,l,mid);
			build(p*2+1,mid+1,r);
			pushup(p);
		}
		void add_max(int p,int l,int r,int x,int y,int v){
			if(mn[p]>=v)return ;
			if(l>=x&&r<=y&&mn_sec[p]>v){
				a_lazy_max(p,v);
				return ;
			}
			push_down(p);
			int mid=(l+r)>>1;
			if(mid>=x)add_max(p*2,l,mid,x,y,v);
			if(mid<y)add_max(p*2+1,mid+1,r,x,y,v);
			pushup(p);
		}
		void add_min(int p,int l,int r,int x,int y,int v){
			if(mx[p]<=v)return ;
			if(l>=x&&r<=y&&mx_sec[p]<v){
				a_lazy_min(p,v);
				return ;
			}
			int mid=(l+r)>>1;
			push_down(p);
			if(mid>=x)add_min(p*2,l,mid,x,y,v);
			if(mid<y)add_min(p*2+1,mid+1,r,x,y,v);
			pushup(p);
		}
		int query_sum(int p,int l,int r,int x,int y){
			if(l>=x&&r<=y)return sum[p];
			int mid=(l+r)>>1,ans=0;
			push_down(p);
			if(mid>=x)ans+=query_sum(p*2,l,mid,x,y);
			if(mid<y)ans+=query_sum(p*2+1,mid+1,r,x,y);
			return ans;
		}
		int query_mx(int p,int l,int r,int x,int y){
			if(l>=x&&r<=y)return mx[p];
			int mid=(l+r)>>1,ans=-INF;
			push_down(p);
			if(mid>=x)ans=max(ans,query_mx(p*2,l,mid,x,y));
			if(mid<y)ans=max(ans,query_mx(p*2+1,mid+1,r,x,y));
			return ans;
		}
		int query_mn(int p,int l,int r,int x,int y){
			if(l>=x&&r<=y)return mn[p];
			int mid=(l+r)>>1,ans=INF;
			push_down(p);
			if(mid>=x)ans=min(ans,query_mn(p*2,l,mid,x,y));
			if(mid<y)ans=min(ans,query_mn(p*2+1,mid+1,r,x,y));
			return ans;
		}
	}st;
	int son[N],dfn[N],rnk[N],dep[N],fa[N],siz[N],top[N],cnt;
	void dfs1(int u,int ft){
		siz[u]=1;
		son[u]=-1;
		dep[u]=dep[ft]+1;
		fa[u]=ft;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(v==ft)continue;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
		}
	}
	void dfs2(int u,int tp){
		top[u]=tp;
		cnt++;
		dfn[u]=cnt;
		rnk[cnt]=u;
		if(son[u]!=-1)dfs2(son[u],tp);
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(v==son[u]||v==fa[u])continue;
			dfs2(v,v);
		}
	}
	void add(int x,int y,int v){
		int fx=top[x],fy=top[y];
		while(fx!=fy){
			if(dep[fx]>=dep[fy])st.add_min(1,1,n,dfn[fx],dfn[x],v),x=fa[fx];
			else st.add_min(1,1,n,dfn[fy],dfn[y],v),y=fa[fy];
			fx=top[x];
			fy=top[y];
		}
		if(dfn[x]<dfn[y])st.add_min(1,1,n,dfn[x]+1,dfn[y],v);
		else st.add_min(1,1,n,dfn[y]+1,dfn[x],v);
	}
	int query(int u,int v){
		int lca=max(dfn[u],dfn[v]);
		return st.query_mn(1,1,n,lca,lca);
	}
}s1;
struct LCA{
	int fa[N][25],mx[N][25],dep[N];
	void dfs(int u,int ft){
		dep[u]=dep[ft]+1;
		fa[u][0]=ft;
		for(int i=1;i<=20;i++){
			fa[u][i]=fa[fa[u][i-1]][i-1];
			mx[u][i]=max(mx[u][i-1],mx[fa[u][i-1]][i-1]);
		}
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to,w=e[i].w;
			if(v==ft)continue;
			mx[v][0]=w;
			dfs(v,u);
		}
	}
	int get_lca(int x,int y){
		if(dep[x]<dep[y])swap(x,y);
		for(int i=20;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
		if(x==y)return x;
		for(int i=20;i>=0;i--)
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
		return fa[x][0];
	}
	int get_mx(int x,int y){
		int lca=get_lca(x,y);
		int ans=0;
		for(int i=20;i>=0;i--){
			if(dep[fa[x][i]]>=dep[lca])ans=max(ans,mx[x][i]),x=fa[x][i];
			if(dep[fa[y][i]]>=dep[lca])ans=max(ans,mx[y][i]),y=fa[y][i];
		}
		return ans;
	}
}s2;
struct node{
	int u,v,w,id;
}in[N],a[N];
bool used[N];
bool cmp(node a,node b){
	return a.w<b.w;
}
int fa[N];
int  find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool merge(int x,int y){
	int p=find(x),q=find(y);
	if(p==q)return 0;
	fa[p]=q;
	return 1;
}
void krukstra(){
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(!merge(a[i].u,a[i].v))continue;
		add_edge(a[i].u,a[i].v,a[i].w);
		add_edge(a[i].v,a[i].u,a[i].w);
		used[a[i].id]=1;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>in[i].u>>in[i].v>>in[i].w;
		a[i].u=in[i].u;
		a[i].v=in[i].v;
		a[i].w=in[i].w;
		a[i].id=i;
	}
	krukstra();
	s1.dfs1(1,0);
	s1.dfs2(1,1);
	s1.st.build(1,1,n);
	s2.dfs(1,0);
	for(int i=1;i<=m;i++){
		if(used[i])continue;
		int u=in[i].u,v=in[i].v,w=in[i].w;
		s1.add(u,v,w);
	} 
	int q;
	cin>>q;
	while(q--){
		int i,s,t;
		cin>>i>>s>>t;
		if(!used[i]){
			cout<<"0\n";
			continue;
		}
		int u=in[i].u,v=in[i].v,w=in[i].w;
		int ft=s2.get_lca(s,t);
		if((s2.get_lca(u,s)==ft||s2.get_lca(u,t)==ft)&&(s2.get_lca(v,s)==ft||s2.get_lca(v,t)==ft)){
			int mx=s2.get_mx(s,t);
			int tmp=s1.query(u,v);
			if(w<mx){
				cout<<"0\n";
				continue;
			}
			cout<<min(1,tmp-w)<<"\n";
			continue;
		}
		cout<<"0\n";
	}
	return 0;
}

提交记录

2024/10/20 11:41
加载中...