[SYZOI Round1]滑稽♂树

来源:互联网 发布:网络诈骗案一般关多久 编辑:程序博客网 时间:2024/05/21 08:40

【题目描述】


zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到。虽然我们看不到,但是还是知道一些信息:

这真的是一棵树,由n个节点,n-1条边联通。一号滑稽果同时也是整棵滑稽树的树根。滑稽树上每个节点有一个滑稽果,每个滑稽果有它的重量。

雪甜甜公主是神犇当然看得到那棵滑稽树啦,现在她感兴趣的是这样三件事

1:滑稽树太大啦,雪甜甜公主有的时候只想知道,在以某一个滑稽果为根的子滑稽树里面,重量第k小的果子的重量是多少?

2:除了重量第k小的果子,雪甜甜还想知道以某个滑稽果为根的子滑稽树里面,重量在[a, b]这个范围内的滑稽果有多少个。

3:雪甜甜还喜欢吃滑稽果,但是吃完,原来滑稽果的位置上还会长出一个新的滑稽果,只是重量可能不一样。


【输入格式】

第一行一个正整数n,表示滑稽树有n个节点。

第二行n个正整数,分别描述1号,2号,,,,n号节点滑稽果的重量。

接下来n-1行,每行2个正整数u, v ∈ [1, n],表示滑稽果u与滑稽果v之间有树枝连接。

接下来一个正整数q,表示雪甜甜有q次行动

之后q行,有这样3种形式

1 u k 雪甜甜公主询问以u为根的子滑稽树中,重量第k小的滑稽果的重量。

2 u a b 雪甜甜公主想知道,以u为根的子滑稽树中,重量在[a, b]范围内的滑稽果有多少个。

3 u x 雪甜甜公主吃掉了编号为u的滑稽果,但是在原位置上立刻长出来了一个重量为x的滑稽果。因为位置没有变,所以编号还是u。

【输出格式】

对于每次询问,输出结果。

【样例输入】

5

3 4 6 1 2

1 2

1 3

3 4

3 5

7

1 1 4

2 1 1 5

3 4 5

1 1 4

2 3 3 6

3 5 7

1 3 3

【样例输出】

4

4

5

2

7

【数据范围以及提示】

N:

对于前35%的数据满足,N <= 5000

对于前50%的数据满足,N <= 10000

对于前100%的数据满足,N <= 30000

滑稽果的重量:对于100%d的数据满足 滑稽果的重量 <= 10000

询问:询问的个数Q:

对于前50%的数据满足 Q <= 10000

对于前100%的数据满足 Q <= 50000

对于前25%的数据,只有第一种询问。

对于前65%的数据,有第1,2种询问。

对于100%的数据第1,2,3种询问都存在。

对于前35%的数据,满足一个特殊的限制条件:每次询问的滑稽果u = 1保证询问k小重量的滑稽果的时候,k值∈ [1, 子树的节点数]

来自 http://syzoj.com/problem/279

树状数组套dfs序主席树,比较裸

代码:

#include <iostream>#include <cstdio>#include <vector>using namespace std;const int maxn=200000+10;vector<int>A[maxn];int w[maxn];int root[maxn*50],ls[maxn*50],rs[maxn*50];int sum[maxn*50];int L[110],R[110];int tid[maxn],size[maxn];int n,m;int sz=0,ti=0;int c,d;inline int lowbit(int x){return x&(-x);}inline void insert(int &x,int y,int l,int r,int c,int v){x=++sz;sum[x]=sum[y]+v;if(l==r)return ;ls[x]=ls[y];rs[x]=rs[y];int mid=(l+r)>>1;if(mid>=c)insert(ls[x],ls[y],l,mid,c,v);else insert(rs[x],rs[y],mid+1,r,c,v);}inline int query1(int l,int r,int ql,int qr){int a[110],b[110];int suml=0,sumr=0;for(int i=1;i<=c;i++)suml+=sum[L[i]];for(int i=1;i<=d;i++)sumr+=sum[R[i]];for(int i=1;i<=c;i++)a[i]=L[i];for(int i=1;i<=d;i++)b[i]=R[i];if(l>=ql&&r<=qr)return sumr-suml;if(l==r)return 0;int mid=(l+r)>>1;int ans=0;if(mid>=ql){for(int i=1;i<=c;i++)L[i]=ls[L[i]];for(int i=1;i<=d;i++)R[i]=ls[R[i]];ans+=query1(l,mid,ql,qr);for(int i=1;i<=c;i++)L[i]=a[i];for(int i=1;i<=d;i++)R[i]=b[i];}if(mid<qr){for(int i=1;i<=c;i++)L[i]=rs[L[i]];for(int i=1;i<=d;i++)R[i]=rs[R[i]];ans+=query1(mid+1,r,ql,qr);for(int i=1;i<=c;i++)L[i]=a[i];for(int i=1;i<=d;i++)R[i]=b[i];}return ans;}inline int query2(int l,int r,int k){int a[110],b[110];int suml=0,sumr=0;for(int i=1;i<=c;i++)suml+=sum[ls[L[i]]];for(int i=1;i<=d;i++)sumr+=sum[ls[R[i]]];for(int i=1;i<=c;i++)a[i]=L[i];for(int i=1;i<=d;i++)b[i]=R[i];if(l==r)return l;int mid=(l+r)>>1;if(sumr-suml>=k){for(int i=1;i<=c;i++)L[i]=ls[L[i]];for(int i=1;i<=d;i++)R[i]=ls[R[i]];return query2(l,mid,k);for(int i=1;i<=c;i++)L[i]=a[i];for(int i=1;i<=d;i++)R[i]=b[i];}else {for(int i=1;i<=c;i++)L[i]=rs[L[i]];for(int i=1;i<=d;i++)R[i]=rs[R[i]];return query2(mid+1,r,k-sumr+suml);for(int i=1;i<=c;i++)L[i]=a[i];for(int i=1;i<=d;i++)R[i]=b[i];}}inline void dfs(int x,int f){tid[x]=++ti;size[x]=1;for(int i=0;i<A[x].size();i++){int u=A[x][i];if(u==f)continue;dfs(u,x);size[x]+=size[u];}}int main(){freopen("hjtree.in","r",stdin);freopen("hjtree.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&w[i]);int x,y;for(int i=1;i<n;i++){scanf("%d %d",&x,&y);A[x].push_back(y);A[y].push_back(x);}dfs(1,0);for(int i=1;i<=n;i++)for(int j=tid[i];j<=n;j+=lowbit(j))insert(root[j],root[j],1,10000,w[i],1);scanf("%d",&m);int z,p;//for(int i=1;i<=sz;i++)//printf("%d\n",sum[i]);while(m--){scanf("%d",&x);if(x==1){scanf("%d %d",&y,&z);c=d=0;for(int i=tid[y]-1;i>=1;i-=lowbit(i))L[++c]=root[i];for(int i=tid[y]+size[y]-1;i>=1;i-=lowbit(i))R[++d]=root[i];printf("%d\n",query2(1,10000,z));}else if(x==2){scanf("%d %d %d",&y,&z,&p);c=d=0;for(int i=tid[y]-1;i>=1;i-=lowbit(i))L[++c]=root[i];for(int i=tid[y]+size[y]-1;i>=1;i-=lowbit(i))R[++d]=root[i];printf("%d\n",query1(1,10000,z,p));}else {scanf("%d %d",&y,&z);for(int i=tid[y];i<=n;i+=lowbit(i))insert(root[i],root[i],1,10000,w[y],-1);for(int i=tid[y];i<=n;i+=lowbit(i))insert(root[i],root[i],1,10000,z,1);w[y]=z;}}return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办 神经损伤小便少尿不出来怎么办 手指夹伤出血了怎么办 手指夹破流血了怎么办 喂了宝宝熊胆粉怎么办 不小心擦伤了皮怎么办 吃了减肥药拉肚子怎么办 遇到他心通的人怎么办 被茅山术害了怎么办 鱼缸鱼身上烂了怎么办 鳄鱼龟皮肤烂了怎么办 墨水渗透进皮肤里了怎么办 中药渗透到皮肤里怎么办 甘露醇渗透到皮肤下怎么办 水银弄到眼睛里怎么办 水银粘到皮肤上怎么办