bzoj 3720 Gty的妹子树

2023-12-19 03:40
文章标签 bzoj 妹子 gty 3720

本文主要是介绍bzoj 3720 Gty的妹子树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

我曾在弦歌之中听过你,

檀板声碎,半出折子戏。

舞榭歌台被风吹去,

岁月深处尚有余音一缕……


Gty神(xian)犇(chong)从来不缺妹子……

他来到了一棵妹子树下,发现每个妹子有一个美丽度……

由于Gty很哲♂学,他只对美丽度大于某个值的妹子感兴趣。

他想知道某个子树中美丽度大于k的妹子个数。

某个妹子的美丽度可能发生变化……

树上可能会出现一只新的妹子……


维护一棵初始有n个节点的有根树(根节点为1),树上节点编号为1-n,每个点有一个权值wi。

支持以下操作:

0 u x          询问以u为根的子树中,严格大于x的值的个数。(u^=lastans,x^=lastans)

1 u x          把u节点的权值改成x。(u^=lastans,x^=lastans)

2 u x          添加一个编号为"当前树中节点数+1"的节点,其父节点为u,其权值为x。(u^=lastans,x^=lastans)

最开始时lastans=0。

Input

输入第一行包括一个正整数n(1<=n<=30000),代表树上的初始节点数。

接下来n-1行,每行2个整数u,v,为树上的一条无向边。

任何时刻,树上的任何权值大于等于0,且两两不同。

接下来1行,包括n个整数wi,表示初始时每个节点的权值。

接下来1行,包括1个整数m(1<=m<=30000),表示操作总数。

接下来m行,每行包括三个整数 op,u,v:

op,u,v的含义见题目描述。

保证题目涉及的所有数在int内。

Output

对每个op=0,输出一行,包括一个整数,意义见题目描述。

Sample Input

2
1 2
10 20
1
0 1 5

Sample Output

2

HINT

 

 2017.9.28新加数据一组by GXZlegend,未重测

思路: 吐槽一下题目的数据范围有误,n好像要比30000大。 

这题可以按照size的大小分块,如果父亲所在的块的点的数量小于sz,那么就把当前节点加到父亲所在的块里面。 

这样分块的方法可以保证块的大小和直径,但是不能保证块的数量。(感觉要被卡,逃 。。。) 

块里面用普通的一维数组记录每个不同的权值,插入和修改的时候用暴力的插入排序维护。 

时间复杂度$O(n*\sqrt{n}*\log n)$,时间复杂度比较高,但是可以卡过。 

本题最好的方法是用替罪羊树套treap来写。  

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define rep(i,a,b) for(int i=a;i<=b;i++)
  4 #define Rep(i,a,b) for(int i=a;i>=b;i--)
  5 #define ms(i,a)    memset(a,i,sizeof(a))
  6 int const N = 100000 + 3;
  7 template<class T>void read(T &x) {
  8     x = 0;
  9     char c = 0;
 10     while(!isdigit((c))) c = getchar();
 11     while(isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
 12 }
 13 struct edge {
 14     int to, nt;
 15 } e[N << 2];
 16 struct block {
 17     int a[300], num;
 18     void ins(int x) {
 19         num++;
 20         int j = num - 1;
 21         while(j && a[j] > x) a[j + 1] = a[j], j--;
 22         a[j + 1] = x;
 23     }
 24     void modify(int x, int y) {
 25         int t = lower_bound(a + 1, a + num + 1, x) - a;
 26         rep(i, t + 1, num) a[i - 1] = a[i];
 27         num--;
 28         ins(y);
 29     }
 30     int query(int x) {
 31         return num - (upper_bound(a + 1, a + num + 1, x) - a) + 1;
 32     }
 33 } b[10000];
 34 int h[N], cnt, H[N], bl[N], n, m, a[N], sz, sum, ans,f[N];
 35 void add(int a, int b) {
 36     e[++cnt].to = b;
 37     e[cnt].nt = h[a];
 38     h[a] = cnt;
 39 }
 40 void Add(int a, int b) {
 41     e[++cnt].to = b;
 42     e[cnt].nt = H[a];
 43     H[a] = cnt;
 44 }
 45 void dfs(int x) {
 46     if(b[bl[f[x]]].num >= sz) {
 47         bl[x] = ++sum;
 48         b[sum].ins(a[x]);
 49         Add(bl[f[x]], sum);
 50     } else {
 51         bl[x] = sum;
 52         b[sum].ins(a[x]);
 53     }
 54     for(int i = h[x]; i; i = e[i].nt) {
 55         int v = e[i].to;
 56         if(v == f[x]) continue;
 57         f[v]=x;
 58         dfs(v);
 59     }
 60 }
 61 void getblock(int x, int y) {
 62     ans += b[x].query(y);
 63     for(int i = H[x]; i; i = e[i].nt) {
 64         int v = e[i].to;
 65         getblock(v, y);
 66     }
 67 }
 68 void getans(int x, int y) {
 69     if(a[x] > y) ans++;
 70     for(int i = h[x]; i; i = e[i].nt) {
 71         int v = e[i].to;
 72         if(v == f[x]) continue;
 73         if(bl[v] == bl[x]) getans(v, y);
 74         else getblock(bl[v], y);
 75     }
 76 }
 77 int main() {
 78     read(n);
 79     sz = sqrt(n);
 80     rep(i, 1, n - 1) {
 81         int x, y;
 82         read(x);
 83         read(y);
 84         add(x, y);
 85         add(y, x);
 86     }
 87     rep(i, 1, n) read(a[i]);
 88     dfs(1);
 89     read(m);
 90     while(m--) {
 91         int k, x, y;
 92         read(k);
 93         read(x);
 94         read(y);
 95         x ^= ans;
 96         y ^= ans;
 97         if(k == 0) {
 98             ans = 0;
 99             getans(x,y);
100             printf("%d\n", ans);
101         }
102         if(k == 1) {
103             b[bl[x]].modify(a[x], y);
104             a[x] = y;
105         }
106         if(k == 2) {
107             a[++n] = y;
108             f[n]=x;
109             add(x, n);
110             if(b[bl[x]].num >= sz) {
111                 bl[n] = ++sum;
112                 b[sum].ins(y);
113                 Add(bl[x], sum);
114             } else {
115                 bl[n] = bl[x];
116                 b[bl[n]].ins(y);
117             }
118         }
119     }
120     return 0;
121 }
View Code

 

 

转载于:https://www.cnblogs.com/ZJXXCN/p/10694336.html

这篇关于bzoj 3720 Gty的妹子树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510782

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

hdu5172 GTY's gay friends

题意:一个数列,有m组询问l,r,需回答l-r是否为一个1-r-l+1的排列。 分析:n个数为1-n的一个排列需满足两个条件,1.和为(n+1)*n/2,2.所有数不相同。1预处理前缀和即可,2先需处理每个数左边与其最近的相同数的位置pre[i],用线段树维护区间l-r各个数pre[i]的最大值mx,若mx<l则满足条件。 #include<iostream>#include<strin

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ 2152 聪聪可可 (树上点分治)

题目地址:BZOJ 2152 找有多少对权值和为3的倍数的点。最简单的点分治。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#incl

BZOJ 3530 数数【AC自动机+数位dp】

[Sdoi2014]数数 简单数位dp+简单AC自动机 反正数位DP是队友写的 AC自动机要记录两个值,一个是是否为一个串的结束,即不合法状态,一个是前缀零的情况。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostr

BZOJ 3531 旅行【树链剖分】

[Sdoi2014] 简单的树链剖分 以每个信仰应该建一个线段树,空间复杂度为 O(5×1010) O(5\times 10^{10}) 因此会爆空间,所以需要动态申请空间。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <