首页 > 其他分享 >洛谷 P3128 [USACO15DEC] Max Flow P 做题记录

洛谷 P3128 [USACO15DEC] Max Flow P 做题记录

时间:2024-10-23 15:42:34浏览次数:7  
标签:dep cnt 洛谷 USACO15DEC int Max fa read define

因为一次添加会对点和边都造成影响,而点一次能加两个,于是最大值一定在点上。由于只有一次询问,考虑树上差分。
设一次询问给出的两点为 \(x,y\),那么我们在 \(x\) 和 \(y\) 处分别加 \(1\),在 \(\operatorname{lca}(x,y)\) 处减 \(1\),因为该点本身也有增加,于是我们在它的父节点再减去 \(1\) 即可。\(\operatorname{lca}\) 用倍增法求即可,时间复杂度 \(O(k\log n)\)。

点击查看代码
#include<bits/stdc++.h>

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();

#define ll long long
#define i128 __int128

using namespace std;
inline int read() {
	int xx= 0;int f= 1;
	char c = getchar();
	while(c<'0'||c>'9') { 
		if(c=='-') f= -1;
		c= getchar();
	}
	while(c>='0'&&c<='9') {
		xx= (xx<<1)+(xx<<3)+(c^48);
		c= getchar();
	}
	return xx*f;
}
#define maxn 50050
int n,k;
vector<int>G[maxn];
int fa[maxn][26],dep[maxn];
int lg2(int x) {
	int res=0;
	if(x&0xffff0000) x>>=16,res+=16;
	if(x&0x0000ff00) x>>=8,res+=8;
	if(x&0x000000f0) x>>=4,res+=4;
	if(x&0x0000000c) x>>=2,res+=2;
	if(x&0x00000002) x>>=1,res+=1;
	return res;
}
void dfs(int u,int fath) {
	fa[u][0]=fath;
	dep[u]=dep[fath]+1;
	int sz=lg2(dep[u]);
	For(i,1,sz) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(auto v:G[u]) if(v!=fath) dfs(v,u);
}
int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=fa[x][lg2(dep[x]-dep[y])];
	if(x==y) return x;
	int k=lg2(dep[x]);
	Rep(i,k,0) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int cnt[maxn],ans;
void dfs2(int u,int fa) {
	for(auto v:G[u]) if(v!=fa) {
		dfs2(v,u);
		cnt[u]+=cnt[v];
	}
	ans=max(ans,cnt[u]);
}
signed main() {
	in2(n,k);
	For(i,1,n-1) {
		int x,y;
		in2(x,y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dfs(1,0);
	For(i,1,k) {
		int x,y;
		in2(x,y);
		int l=lca(x,y);
		cnt[x]++,cnt[y]++;
		cnt[l]--,cnt[fa[l][0]]--;
	}
	dfs2(1,0);
	cout<<ans;
}

标签:dep,cnt,洛谷,USACO15DEC,int,Max,fa,read,define
From: https://www.cnblogs.com/CodingGoat/p/18496577

相关文章

  • Ansys Zemax | 什么是有限元分析(FEA)?
    前言通常,制造延迟和生产成本增加将导致公司需要寻找方法来维持新产品的交付,以应对紧迫的时间表。“构建并推翻”的设计模型形式推高了成本,因为样机需要在多次迭代中构建和测试。精确的多物理场仿真可以帮助工程和设计团队预测系统在各种使用情况下的性能,并仿真可能的条件,以在......
  • 洛谷 P2572 [SCOI2010] 序列操作 做题记录
    其实和小白逛公园差不多,编写代码的难度远大于思路难度,难点是调试:注意在区间异或\(1\)的时候分清代码里的最长连续\(1\)的长度和\(1\)的个数。注意查询最长\(1\)的时候要用结构体上传,如果用到了定值len的话要赋值。注意如果只用一个tag的话,遇到区间异或要对原先......
  • 从质谱样本制备到MaxQuant搜库
    代谢组数据分析零:从质谱样本制备到MaxQuant搜库-CSDN博客代谢组数据分析一:代谢组数据准备-CSDN博客代谢组数据分析二:数据预处理-CSDN博客代谢组数据分析三:降维分析-CSDN博客代谢组数据分析四:差异分析-CSDN博客代谢组数据分析五:功能分析-CSDN博客代谢组数据分析六:基于报告......
  • 20241022每日一题洛谷P1223
    普及洛谷P1223接水问题有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小第一行为一个整数n,第二行n个整数,第i个整数Ti表示第i个人的接水时间Ti输出两行,第一行为一种平均时间最短的排队顺......
  • 迈从AX5 PRO MAX
    买了好多鼠标,个人而言觉得这个鼠标反应快定位准。也是我的主力鼠标。之前我已经写过一篇关于AX5PROMAX鼠标的文章,现在单独开一篇文章说说它的缺点。1、塑料底盘用料一般,容易坏,但是只要你不经常拆,问题不大,我后面会说说为什么觉得他的塑料材质不行。2、蓝牙模式问题:如果在2.4G模式......
  • 洛谷P3850 [TJOI2007] 书架 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P3850主要操作就是:插入+查询第k值。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1.1e5+5,maxb=20;structNode{ints[2],p,sz;stringname;Node(){}Node(string_n......
  • 洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个......
  • 洛谷管理员语录(不完整)
    ......
  • P10724 [GESP202406 七级] 区间乘积,洛谷id:sxshm
    题解一、分析看看标签:数论,再看题目:完全平方。这不是质因数分解的标配吗?继续看数据范围:1≤ai......
  • 洛谷 P1197 [JSOI2008] 星球大战 做题记录
    我不会做摧毁,于是反着做,就变成了合并连通块,倒序加边即可,时间复杂度\(O((n+m)\alpha(n))\)。(大抵是吧点击查看代码#include<bits/stdc++.h>#definemem(aqwqawa,bqwqawa)memset((aqwqawa),(bqwqawa),sizeof(aqwqawa))#definem0(aqwqawa)memset((aqwqawa),0,sizeof(aqwqaw......