直接进行树链剖分,每次对路径区间内的所有点值+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 树链剖分的更多相关文章

  1. 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest

    目录 Contest Info Solutions B. Counting Inversion C. Divisors of the Divisors of An Integer E. Helping ...

  2. 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 ...

  3. Gym - 102040F Path Intersection (树链剖分+线段树)

    题意:给出棵树上的k条路径,求这些路径的公共点数量. 将每条路径上的点都打上标记,被标记过k次的点就是公共点了.由于公共点形成的区间是连续的,因此直接在线段树上暴搜即可在$O(logn)$求出一条链上 ...

  4. 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 ...

  5. 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest

    https://codeforces.com/gym/101981 Problem A. Adrien and Austin 贪心,注意细节 f[x]=1:先手必赢. f[x]: 分成两部分(或一部分 ...

  6. 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 ...

  7. 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 ...

  8. 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest Solution

    A. Rikka with Minimum Spanning Trees 题意: 给出一个图,求最小生成树的个数和权值 思路: 因为数据随机,只有一个MST #include <bits/std ...

  9. 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 ...

随机推荐

  1. 2019.10.21 csp-s模拟测试81 反思总结

    T1: 把每一行状压,按行DP.设fi,j,k,i表示第几行,j是当前行的1覆盖状态,k是当前行选择按钮的状态.转移的时候枚举j和k,再枚举下一层的按钮选择情况l.如果l和j可以全覆盖当前层则转移合法 ...

  2. 洛谷P1002 过河卒 [2017年4月计划 动态规划15]

    P1002 过河卒 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之 ...

  3. CentOS安装fortune+cowsay

    1.先找下看有没 2.安装 yum -y install fortune-mod 3.执行fortune 应该可以输出了,接着去弄中文词库,阮一峰的: git clone git@github.com ...

  4. 五.反馈(Hopfield)神经网络

    前馈网络一般指前馈神经网络或前馈型神经网络.它是一种最简单的神经网络,各神经元分层排列.每个神经元只与前一层的神经元相连.接收前一层的输出,并输出给下一层,数据正想流动,输出仅由当前的输入和网络权值决 ...

  5. CSS-画三角

    要实现三角的效果有很多方法: 例如下面的页面就需要三角: 其中, <!DOCTYPE html> <html lang="en"> <head> ...

  6. selenium(5):常用的8种元素定位

    selenium的webdriver提供了18种(注意不是8种)的元素定位方法,比较常用的定位方法是如下8种,xpath和css定位更加灵活,需要重点掌握其中一个. 经常会用到的8种定位:1.id定位 ...

  7. 清除SQL数据库文本字段中的回车、换行符的方法

    清除SQL数据库中文本字段的回车.换行符的方法 清除回车符: update tableName set columnName = rtrim(ltrim(replace(columnName ,cha ...

  8. font-family:黑体;导致css定义全部不起作用

    css文件里font-family: "黑体";这句会导致后面的css定义全部不起作用了. 只要把font-family: "黑体"; 改成 font-fami ...

  9. Spring Boot → 06:项目实战-账单管理系统

    Spring Boot → 06:项目实战-账单管理系统

  10. spring中 使用说明

    在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...