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 ...
随机推荐
- ES6中async和await说明和用法
昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await 已经被标准化,是时候学习一下了. 先说一下async的用法,它作为一个 ...
- thinkcmf 导航高亮制作方法(适用于多级导航)(通用)
平时用thinkcmf网站开发经常需要导航点击之后高亮,就写了一些实现方法分享一下. 思路很简单,先获取当前页面的顶级栏目的地址,然后与导航中的地址比较,相同的就加上一个class,把下面函数理解了不 ...
- listView中的button控件获取索引
1.在listitem中初始化button的时候,给该button添加一个setTag方法,将此时的索引值传进去,然后在button的onclick事件中调用view的getTag方法,即可将list ...
- Springboot项目下mybatis报错:Invalid bound statement (not found)
mybatis报错:Invalid bound statement (not found)的原因很多,但是正如报错提示一样,找不到xml中的sql语句,报错的情况分为三种: 第一种:语法错误 Java ...
- Spring MVC使用ModelAndView进行重定向(转)
1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...
- PHP学习(函数)
可变函数,即通过变量的值来调用函数,因为变量的值是可变的,所以可以通过改变一个变量的值来实现调用不同的函数. 经常会用在回调函数.函数列表,或者根据动态参数来调用不同的函数.可变函数的调用方法为变量名 ...
- iOS block 用法
1.定义Block /* 回传void ,参数也是void 的block*/ void (^blockReturningVoidWithVoidArgument)( void ); /* 回传整数,两 ...
- 【Leetcode Top-K问题 BFPRT】第三大的数(414)
题目 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示 ...
- [C#] 使用WebSocket进行通讯
客户端 客户端很简单 string url = "ws://localhost:24900/" + "test.ashx"; try { System.Net. ...
- DCOJ5117 set
题目描述 给定一个数集 A,要求构造一个数集 B,满足: • 对于 A 集合中任意的数 x,x 属于 B,即 A ⊆ B: • 对于 B 集合中任意的数 a, b,(a + b) mod p 属于 B ...