20182019-acmicpc-asia-dhaka-regional F .Path Intersection 树链剖分
直接进行树链剖分,每次对路径区间内的所有点值+1,线段树进行维护,然后查询线段树的最大值的个数!!!
查询线段树区间最大值个数,可以先维护区间和,在维护区间最值,如果区间和等于区间最值乘以区间长度,那么直接返回长度!!!
清空的时候,直接减去,不要直接重新建树
#include<bits/stdc++.h>
#define LL long long
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int MAXN = 2e5+;
struct node{
int l,r;
int sum,laze;
int maxx;
}tree[MAXN<<];
struct edge{
int Next,to;
}e[MAXN<<];
int head[MAXN];
int siz[MAXN];
int top[MAXN];
int son[MAXN];
int d[MAXN];
int fa[MAXN];
int id[MAXN];
int sz[MAXN];
int uu[],vv[];
int cnt,tot;
void add(int x,int y){
e[++tot].Next=head[x];
e[tot].to=y;
head[x]=tot;
}
void dfs1(int u,int f,int depth){
d[u]=depth;
fa[u]=f;
siz[u]=;
for (int i=head[u];i;i=e[i].Next){
int v=e[i].to;
if (v==f)
continue;
dfs1(v,u,depth+);
siz[u]+=siz[v];
if (siz[v]>siz[son[u]])
son[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t;
id[u]=++cnt;
if (!son[u])
return;
dfs2(son[u],t);
for (int i=head[u];i;i=e[i].Next)
{
int v=e[i].to;
if (v!=son[u] && v!=fa[u])
dfs2(v,v);
}
}
void push_down(int rt){
if (tree[rt].laze){
tree[lson].sum+=(tree[lson].r-tree[lson].l+)*tree[rt].laze;
tree[rson].sum+=(tree[rson].r-tree[rson].l+)*tree[rt].laze;
tree[lson].maxx+=tree[rt].laze;
tree[rson].maxx+=tree[rt].laze;
tree[lson].laze+=tree[rt].laze;
tree[rson].laze+=tree[rt].laze;
tree[rt].laze=;
}
}
void buildtree(int rt,int l,int r){
tree[rt].l=l;
tree[rt].r=r;
tree[rt].sum=;
tree[rt].laze=;
tree[rt].maxx=;
int mid=(l+r)>>;
if (l==r){
return;
}
buildtree(lson,l,mid);
buildtree(rson,mid+,r);
}
void update(int rt,int ul,int ur,int w){
if (ul>ur)return;
int l=tree[rt].l;
int r=tree[rt].r;
if (ul<=l && r<=ur){
tree[rt].laze+=w;
tree[rt].maxx+=w;
tree[rt].sum+=(r-l+)*w;
return;
}
push_down(rt);
int mid=(l+r)>>;
if (ur<=mid){
update(lson,ul,ur,w);
}else if (ul>mid){
update(rson,ul,ur,w);
}else {
update(lson,ul,ur,w);
update(rson,ul,ur,w);
}
tree[rt].maxx=max(tree[lson].maxx,tree[rson].maxx);
tree[rt].sum=tree[lson].sum+tree[rson].sum;
}
void qRange(int x,int y,int k){
while(top[x]!=top[y]){
if (d[top[x]]<d[top[y]])swap(x,y);
update(,id[top[x]],id[x],k);
x=fa[top[x]];
}
if (d[x]>d[y])swap(x,y);
update(,id[x],id[y],k);
}
int query(int rt,int ql,int qr,int w){
int l=tree[rt].l;
int r=tree[rt].r;
if (tree[rt].sum==w*(r-l+)){
return r-l+;
}
if (l==r){
return ;
}
push_down(rt);
int mid=(l+r)>>;
int ans=;
if (tree[lson].maxx==w){
ans+=query(lson,ql,qr,w);
}
if (tree[rson].maxx==w){
ans+=query(rson,ql,qr,w);
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
int n;
int ca=;
while(t--){
memset(head,,sizeof(head));
memset(id,,sizeof(id));
memset(top,,sizeof(top));
memset(siz,,sizeof(siz));
memset(fa,,sizeof(fa));
memset(son,,sizeof(son));
memset(d,,sizeof(d));
scanf("%d",&n);
cnt=;
tot=;
int u,v;
for (int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
int r,op,k;
dfs1(,,);
dfs2(,);
scanf("%d",&op);
printf("Case %d:\n",++ca);
buildtree(,,n);
for (int i=;i<=op;i++){
scanf("%d",&k);
for (int i=;i<=k;i++){
scanf("%d%d",&uu[i],&vv[i]);
qRange(uu[i],vv[i],);
}
int ans=query(,,n,k);
for (int i=;i<=k;i++){
qRange(uu[i],vv[i],-);
}
printf("%d\n",ans);
}
}
return ;
}
20182019-acmicpc-asia-dhaka-regional F .Path Intersection 树链剖分的更多相关文章
- 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest
目录 Contest Info Solutions B. Counting Inversion C. Divisors of the Divisors of An Integer E. Helping ...
- 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest C.Divisors of the Divisors of An Integer (数论)
题意:求\(n!\)的每个因子的因子数. 题解:我们可以对\(n!\)进行质因数分解,这里可以直接用推论快速求出:https://5ab-juruo.blog.luogu.org/solution-p ...
- Gym - 102040F Path Intersection (树链剖分+线段树)
题意:给出棵树上的k条路径,求这些路径的公共点数量. 将每条路径上的点都打上标记,被标记过k次的点就是公共点了.由于公共点形成的区间是连续的,因此直接在线段树上暴搜即可在$O(logn)$求出一条链上 ...
- 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest- H. Rikka with A Long Colour Palette -思维+贪心
2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest- H. Rikka with A Long Colour Palette -思维+贪心 [Proble ...
- 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest
https://codeforces.com/gym/101981 Problem A. Adrien and Austin 贪心,注意细节 f[x]=1:先手必赢. f[x]: 分成两部分(或一部分 ...
- Gym 102028C - Supreme Command - [思维题][2018-2019 ACM-ICPC Asia Jiaozuo Regional Contest Problem C]
题目链接:https://codeforces.com/gym/102028/problem/C Lewis likes playing chess. Now he has n rooks on th ...
- Gym 101981I - Magic Potion - [最大流][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem I]
题目链接:http://codeforces.com/gym/101981/attachments There are n heroes and m monsters living in an isl ...
- 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest Solution
A. Rikka with Minimum Spanning Trees 题意: 给出一个图,求最小生成树的个数和权值 思路: 因为数据随机,只有一个MST #include <bits/std ...
- 2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest
目录 Contest Info Solutions A. Xu Xiake in Henan Province D. Keiichi Tsuchiya the Drift King E. Resist ...
随机推荐
- 神奇的CSS形状
在StackOverflow上有这么一个问题,有位同学在 http://css-tricks.com/examples/ShapesOfCSS/ 找到一些使用CSS做的形状,其中一位同学对下面的这个形 ...
- 未压缩的jQuery
/*! * jQuery JavaScript Library v3.4.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzle ...
- linux目录结构详细说明
Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...
- SaaS launch Kit成回收宝和友盟云合作纽带,帮助提升3倍上云效率
导语:叶飞表示,全球二手手机市场未来几年将发生巨大变革, 回收宝正进行积极布局.与阿里云开展紧密技术合作,回收宝期待成为这一变革的引领者. 7月26日,在阿里云上海峰会上,阿里云了发布SaaS生态战略 ...
- 【python之路9】类型定义与转换
一.整型(int),int的作用 1.创建int类型并赋值 n = 10 或者 n = int(10) #只要是类名加括号,都会去执行类中的 __init__()方法 n = 10,实际内部会去执 ...
- DesktopLayer.exe专杀
这两天发现电脑卡慢. 同事电脑发现病毒,而后装上杀软后(一直在裸奔~~~),发现自己电脑也存在. DesktopLayer.exe 会有以下几个行为: 第一,会在C:\Program Files (x ...
- java 3类的继承
模板类 泛型程序设计方法 类的组合 类的继承 java只有单继承 隐藏和覆盖 用super.x调用 访问静态属性 静态属性不继承 静态成员只有一个,不会有副本 静态成员只有一个所有的超类和子类 方法的 ...
- transform的兼容性写法
大多数浏览器都有自己的私有前缀,IE的私有前缀是 -ms- 但是大多数CSS3属性对IE低版本就不友好了,所以一般IE9+才能用上transform:rotate(7deg); -ms-transfo ...
- day39-Spring 19-今天的内容总结
- [React Native] 解析JSON文件
在编写代码时,开发者有时需要存储一些比较多,在应用程序运行时不需要更改的数据.文件大不便于写在代码中,可以把这些数据存储到JSON文件中. 优点非常明显: 1. 数据存放在单独的文件中,代码精简有条理 ...