直接进行树链剖分,每次对路径区间内的所有点值+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. Python之路,Day3- Python基础(转载Alex)

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  2. linux追加中文字库,解决imagemagick 中文乱码的问题。

    Windows下的字体丰富多样,而且显示的工整.漂亮. 所以自己想把windows上的字体移到Ubuntu下来.Windows下字体库的位置为C:\Windows\fonts,这里面包含所有windo ...

  3. java-多线程的入门_进阶总结

    多线程 概述图 1.概述 进程:正在执行中的程序,其实时应用程序在内存中运行的那片空间. 线程:进程中的一个执行单元,负责进程中的程序的运行,一个进程中至少要有一个线程. (进程可以理解为是一个QQ程 ...

  4. Leetcode671.Second Minimum Node In a Binary Tree二叉树中的第二小结点

    给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中 ...

  5. Django与HTML业务基本结合--基本的用户名密码提交方法1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. php require_once的使用方法

    学习笔记 require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含. equire_once() 为了避免重复加载文件. ...

  7. Codeforces 375A

    这是一道数学题,真是很考验数学思维,之前也遇到过相似的问题,但是依然是想不到点子上,就这提而言,最重要的就是 能否发现由 1, 6, 8,9这四个数字组成的排列对7取模是可以得到0, 1, 2, 3, ...

  8. Neo4j文档

    Neo4j 图数据库 主要有节点和关系,关系是有向边,节点和关系都有属性,属性是键值对 Neo4j使用CQL语句,代表Cypher查询语言 相当于SQL 统一声明 在所有的语句中均有结构 <no ...

  9. 【转载】ubuntu下编写字符设备驱动程序-入门篇

    在ubuntu初学驱动,觉得挺有用的. http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html

  10. iOS开发 底层抛析运行循环—— RunLoop

    http://blog.csdn.net/zc639143029/article/details/50012527 一.RunLoop基本概念 概念:程序的运行循环,通俗的来说就是跑圈. 1. 基本作 ...