首页 > 其他分享 >2022牛客多校 第9场 C Global Positioning System(讨论+lca+树上差分)

2022牛客多校 第9场 C Global Positioning System(讨论+lca+树上差分)

时间:2022-08-29 21:24:57浏览次数:107  
标签:cnt ch int Global Positioning 多校 回路 include id

传送门

若干条路径生成了一个无向连通图,只有所有简单回路对应的向量为\(0\)向量时合法。

需要改变的边是满足这个边是所有不为\(0\)回路的交且不属于所有为\(0\)的回路。

因为题目满足一定有合法解,所以若存在不为\(0\)回路,上文所说的所有边都是答案。

若全部回路都为\(0\),所有割边都是答案。

具体的,就是先随便建出一棵生成树,然后对于非树边考虑其与树边构成的简单回路。然后讨论就可以了。

需要注意的是非树边的泰伦,因为满足一定存在合法解,若存在多个不为\(0\)的回路,非树边一定不为答案。若存在一个不为\(0\)回路,这个非树边一定为答案。(这个结论要考虑重合回路和非重合回路的多个回路)。

可以对图\(dfs\)求得生成树,每一条非树边就是返租边可以优化求\(lca\)的过程。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const int N=5e5+550;
struct edge{
	int to,nxt,x,y,z,id;
}e[N*2];
int cnt,head[N];
void add_edge(int u,int v,int x,int y,int z,int id){
	cnt++;
	e[cnt].nxt=head[u];
	e[cnt].to=v;
	e[cnt].x=x;
	e[cnt].y=y;
	e[cnt].z=z;
	e[cnt].id=id;
	head[u]=cnt;
}
int sum[N][10];
int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return sum*f;
}
int f[N][22],dep[N];
void dfs(int u,int F){
	f[u][0]=F;
	dep[u]=dep[F]+1;
	for(int i=1;i<=20;i++)f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==F)continue;
		sum[v][0]=sum[u][0]+e[i].x;
		sum[v][1]=sum[u][1]+e[i].y;
		sum[v][2]=sum[u][2]+e[i].z;
		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[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=20;i>=0;i--)
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
struct qu_edge{
	int u,v,x,y,z,id;
}qu_e[N]; 
int num,tmp;
int fa[N];
int find(int x){
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}
int ans[N];
void get_ans(int u,int f,int type,int id){
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f)continue;
		get_ans(v,u,type,e[i].id);
		sum[u][type]+=sum[v][type];
	}
	if(sum[u][type]==tmp&&id)ans[++ans[0]]=id;
} 
signed main(){
	int n=read(),m=read();
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		int f_u=find(u),f_v=find(v);
		int x=read(),y=read(),z=read();
		if(f_u==f_v){
			qu_e[++num].x=x;
			qu_e[num].y=y;
			qu_e[num].z=z;
			qu_e[num].u=u;
			qu_e[num].v=v; 
			qu_e[num].id=i;
		} 
		else{
			fa[f_u]=f_v;
			add_edge(u,v,x,y,z,i);
			add_edge(v,u,-x,-y,-z,i);
		}
	}
	dfs(1,0);
	tmp=0;
	int e_id=0;
	for(int i=1;i<=num;i++){
		int u=qu_e[i].u,v=qu_e[i].v;
		int lca=get_lca(u,v);
		sum[u][4]++,sum[v][4]++;
		sum[lca][4]-=2;
		if(sum[u][0]-sum[v][0]==-qu_e[i].x&&sum[u][1]-sum[v][1]==-qu_e[i].y&&sum[u][2]-sum[v][2]==-qu_e[i].z){
			sum[u][3]-=1e9;
			sum[v][3]-=1e9;
			sum[lca][3]+=2e9;
			continue;
		}
		e_id=qu_e[i].id;
		tmp++;
		sum[u][3]++,sum[v][3]++;
		sum[lca][3]-=2;
	}
	if(tmp==1)ans[++ans[0]]=e_id;
	get_ans(1,0,3,0);
	if(ans[0]==0)get_ans(1,0,4,0);
	sort(ans+1,ans+1+ans[0]);
	cout<<ans[0]<<endl;
	for(int i=1;i<=ans[0];i++)cout<<ans[i]<<" "; 
	return 0;
} 

标签:cnt,ch,int,Global,Positioning,多校,回路,include,id
From: https://www.cnblogs.com/Xu-daxia/p/16637389.html

相关文章

  • "蔚来杯"2022牛客暑期多校训练营10 E.Reviewer Assignment
    E.eviewerAssignment题目大意有m篇论文和n个审稿人,给出每个审稿人能审论文的集合,要求给没个审稿人安排一篇论文。令f(i)表示被至少i个审稿人审过的论文数量,要求求出一种......
  • 2022 HDU多校5
    PandaemoniumAsphodelos:TheFirstCircle(Savage)(数据结构)Problem有一行长度为\(n\)个格子,一开始每个格子的颜色都是\(0\),并且权值都也是\(0\),现在有\(q\)次操作,每......
  • vue——全局事件总线(GlobalEventBus)
    一.什么是全局事件总线?1.一种组件间通信的方式,适用于任意组件间通信。是根据VueComponent.prototype.__proto__=Vue.prototype的原理来进行全局引用二.全局事件总线......
  • 2022 杭电多校解题报告 第一场
    B.Dragonslayer(二进制枚举+bfs)题意:给定一个n*m的网格,视格子中间为点,格线为墙,指定x堵墙(x<=15),穿过一堵墙耗费一体力,问从起点到终点的最小体力为多少分析:注意到......
  • 2022 HDU多校4
    LinkwithBracketSequenceII(区间DP)Problem有一个长度为\(n\)的括号序列,括号种类有\(m\)种,现在这个括号序列丢失了一些括号,问可能的合法括号序列个数(和)可以匹配......
  • 2022HDU多校第五场 - 1007 Count Set
    置换群+生成函数+NTT+启发式合并/分治题意给一个1-n的排列p和一个非负整数k,求大小为k的{1,2,3,...n}的子集合T的数量,满足即T的元素按p置换一轮后......
  • ”npm Warn config global `--global`, `--local` are deprecated. Use `--location=
    查找nodejs安装目录,找到如下四个文件分别用记事本打开,替换文档中的prefix-g为prefix--location=global重新打开cmd窗口测试......
  • 2022牛客暑期多校集训解题报告 第一场
    A.Villages:Landlines题意:给定n-1个建筑和一个发电站,分布在一个一维的数轴上,这n-1个建筑都有各自的电力接受范围,不连通的建筑可以通过电相连,问使每个建筑都通上电......
  • 蔚来杯2022牛客暑期多校训练营10 题解
    D.MiReDoSiLa?SoFa![NOI2016]优秀的拆分原题。枚举周期\(k\),并将位置为\(k\)的倍数的点设为关键点。枚举相邻两个点\(i,i+k\),并求出\(lcp(S[i...n],S[i+k......
  • php变量 global/static
    通常,函数内定义的变量,在函数内生效,函数执行完毕销毁global全局变量,函数外可以调用 functiontestGlobal(){  global$a;  $a=1;}//testGlobal();/......