bzoj3720 Gty的妹子树

  树分块,每个点如果其父亲的块还未满,则并入,否则自己新建一个块,询问时完整包含于一个子树的块二分,不完整包含的块直接暴力找。

  代码

  

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<vector>
  4 #define fi first
  5 #define sc second
  6 #define mp make_pair
  7 #define pb push_back
  8 #define lb(x) (x&-x)
  9 using namespace std;
 10 const int N = 1000010;
 11 const int inf=(1<<30)-1+(1<<30);
 12 typedef long long ll;
 13 typedef pair<int,int> P;
 14 int dp,pre[N],p[N],tt[N],w[N],f[N],id[N],B,tot,ans;
 15 int n,m,i,a,b,j;
 16 vector<P> vec[N];
 17 vector<int> edge[N];
 18 void link(int x,int y)
 19 {
 20     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
 21 }
 22 void dfs(int x,int fa)
 23 {
 24     int i=p[x];
 25     f[x]=fa;
 26     while (i)
 27     {
 28         if (tt[i]!=fa)
 29         {
 30             if (vec[id[x]].size()<B)
 31             {
 32                 id[tt[i]]=id[x];
 33                 vec[id[tt[i]]].pb(mp(w[tt[i]],tt[i]));
 34             }
 35             else
 36             {
 37                 id[tt[i]]=++tot;
 38                 vec[id[tt[i]]].pb(mp(w[tt[i]],tt[i]));
 39                 edge[id[x]].pb(id[tt[i]]);
 40             }
 41             dfs(tt[i],x);
 42         }
 43         i=pre[i];
 44     }
 45 }
 46 void sgao(int x,int v)
 47 {
 48     int m,l,r,i;
 49     l=0;r=vec[x].size()-1;
 50     while (l<=r)
 51     {
 52         m=(l+r)>>1;
 53         if (vec[x][m].fi<=v) l=m+1;else r=m-1;
 54     }
 55     ans+=vec[x].size()-l;
 56     for (i=0;i<edge[x].size();i++)
 57     sgao(edge[x][i],v);
 58 }
 59 void gao(int x,int fa,int v)
 60 {
 61     if (w[x]>v) ans++;
 62     int i=p[x];
 63     while (i)
 64     {
 65         if (tt[i]!=fa)
 66         {
 67             if (id[tt[i]]==id[x])
 68             gao(tt[i],x,v);
 69             else
 70             sgao(id[tt[i]],v);
 71         }
 72         i=pre[i];
 73     }
 74 }
 75 int main()
 76 {
 77     scanf("%d",&n);
 78     B=400;
 79     for (i=1;i<n;i++)
 80     {
 81         scanf("%d%d",&a,&b);
 82         link(a,b);link(b,a);
 83     }
 84     for (i=1;i<=n;i++)
 85     scanf("%d",&w[i]);
 86     vec[id[1]].pb(mp(w[1],1));
 87     dfs(1,0);
 88     for (i=0;i<=tot;i++)
 89     sort(vec[i].begin(),vec[i].end());
 90     scanf("%d",&m);
 91     for (i=1;i<=m;i++)
 92     {
 93         int typ;
 94         scanf("%d%d%d",&typ,&a,&b);
 95         a^=ans;b^=ans;
 96         if (typ==0)
 97         {
 98             ans=0;
 99             gao(a,f[a],b);
100             printf("%d\n",ans);
101         }
102         else
103         if (typ==1)
104         {
105             w[a]=b;
106             for (j=0;j<vec[id[a]].size();j++)
107             if (vec[id[a]][j].sc==a) vec[id[a]][j].fi=b;
108             sort(vec[id[a]].begin(),vec[id[a]].end());
109         }
110         else
111         {
112             n++;f[n]=a;w[n]=b;
113             link(a,n);
114             if (vec[id[a]].size()<B)
115                 id[n]=id[a];
116             else
117             {
118                 id[n]=++tot;
119                 edge[id[a]].pb(id[n]);
120             }
121             vec[id[n]].pb(mp(w[n],n));
122             sort(vec[id[n]].begin(),vec[id[n]].end());
123         }
124     }
125 }
时间: 2024-10-12 13:20:07

bzoj3720 Gty的妹子树的相关文章

BZOJ3720 Gty的妹子树Solution

题目大意: 维护一棵初始有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)

Luogu2137/Bzoj3720 Gty的妹子树

题面: https://www.luogu.org/problemnew/show/P2137 https://www.lydsy.com/JudgeOnline/problem.php?id=3720 原文地址:https://www.cnblogs.com/wifimonster/p/10326790.html

BZOJ 3720: Gty的妹子树

3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1493  Solved: 502[Submit][Status][Discuss] Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每个妹子有一个美丽度…… 由于Gty很哲♂学,他只对美丽度大于某个值的妹子感兴趣. 他想知道

3720: Gty的妹子树

3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1440  Solved: 482[Submit][Status][Discuss] Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每个妹子有一个美丽度…… 由于Gty很哲♂学,他只对美丽度大于某个值的妹子感兴趣. 他想知道

BZOJ3720 Gty的妹子树 【树分块】

题目 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每个妹子有一个美丽度-- 由于Gty很哲♂学,他只对美丽度大于某个值的妹子感兴趣. 他想知道某个子树中美丽度大于k的妹子个数. 某个妹子的美丽度可能发生变化-- 树上可能会出现一只新的妹子-- 维护一棵初始有n个节点的有根树(根节点为1),树上节点编号为1-n,每个点有一个权值wi. 支持以下操作: 0 u x 询问以

【块状树】bzoj3731 Gty的超级妹子树

带 加点 删边的块状树. 加点在 bzoj3720 说过. 删边其实就是块顶打标记,记录其属于哪棵树,防止在dfs搜集答案时跑到别的树上. 然后暴力把所在块拆开. 好像用邻接表存图,直接在vector里删边也行? 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<vector> 5 using namespace std; 6 #define maxn 200001 7

bzoj3731: Gty的超级妹子树

一代神题啊orz(至少是以前年代的神题吧) 块状树 复杂度nsqrtnlogn 真是exciting 还没有卡时限 话不多说直接上代码 (最近解锁了记事本写代码的技能...感觉越来越依赖OJ调试了...啊感觉写代码准确率高了不少qwq) #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <

bzoj 3744: Gty的妹子序列 主席树+分块

3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成了一个序列,每个妹子有一个美丽度. Bakser神犇与他打算研究一下这个妹子序列,于是Bakse

【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成了一个序列,每个妹子有一个美丽度. Bakser神犇与他打算研究一下这个妹子序列,于是Bakser神犇问道:"你知道区间 [l,r]中妹子们美丽度的逆序对数吗?" 蒟蒻Autumn只会离线乱搞啊……但是Bakser神犇说道:"强制在线." 请你帮助一下Autumn吧.