bzoj 2588: Spoj 10628. Count on a tree

news/2025/2/27 8:48:46

DFS序在树上建出主席树,然后。。。。。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<algorithm>
  7 #define ll long long
  8 #define M 200009
  9 using namespace std;
 10 ll read()
 11 {
 12   ll x=0,f=1;
 13   char ch=getchar();
 14   for(;ch<'0'||ch>'9';ch=getchar())
 15     if(ch=='-')
 16       f=-1;
 17   for(;ch>='0'&&ch<='9';ch=getchar())
 18     x=x*10+ch-'0';
 19   return x*f;
 20 }
 21 int lc[M][20],head[M],next[M],u[M],cnt,n,m,v[M],v1[M],n1,deep[M],pos[M],num[M],T,root[M];
 22 int tot,lastans;
 23 struct data
 24 {
 25     int l,r,sum;
 26 }a[20*M];
 27 void jia(int a1,int a2)
 28 {
 29     next[++cnt]=head[a1];
 30     head[a1]=cnt;
 31     u[cnt]=a2;
 32 }
 33 void dfs(int x)
 34 {
 35     num[++T]=x;
 36     pos[x]=T;
 37     for(int i=1;(1<<i)<=deep[x];i++)
 38         lc[x][i]=lc[lc[x][i-1]][i-1];
 39     for(int i=head[x];i;i=next[i])
 40       if(u[i]!=lc[x][0])
 41       {
 42           deep[u[i]]=deep[x]+1;
 43           lc[u[i]][0]=x;
 44           dfs(u[i]);
 45       }
 46 }
 47 void geng(int l,int r,int x,int &y,int z)
 48 {
 49     y=++tot;
 50     a[y].sum=a[x].sum+1;
 51     if(l==r)
 52       return;
 53     a[y].l=a[x].l;
 54     a[y].r=a[x].r;
 55     int mid=(l+r)>>1;
 56     if(mid>=z)
 57         geng(l,mid,a[x].l,a[y].l,z);
 58     else
 59         geng(mid+1,r,a[x].r,a[y].r,z);
 60 }
 61 int lca(int a1,int a2)
 62 {
 63     if(deep[a1]<deep[a2])
 64         swap(a1,a2);
 65     int a3=deep[a1]-deep[a2];
 66     for(int i=0;i<=16;i++)
 67         if(a3&(1<<i))
 68           a1=lc[a1][i];
 69     for(int i=16;i>=0;i--)
 70         if(lc[a1][i]!=lc[a2][i])
 71       {
 72           a1=lc[a1][i];
 73           a2=lc[a2][i];
 74       }
 75     if(a1==a2)
 76         return a1;
 77     return lc[a1][0];
 78 }
 79 int cha(int u,int v,int t,int k)
 80 {
 81     int a1=root[pos[u]],a2=root[pos[v]],a3=root[pos[t]],a4=root[pos[lc[t][0]]];
 82     int l=1,r=n1-1,ans;
 83     for(;;)
 84       {
 85           if(l==r)
 86               return v1[l];
 87           int mid=(l+r)>>1;
 88           int a5=a[a[a1].l].sum+a[a[a2].l].sum-a[a[a3].l].sum-a[a[a4].l].sum;
 89           if(a5>=k)
 90             {
 91                 r=mid;
 92                 a1=a[a1].l;
 93                 a2=a[a2].l;
 94                 a3=a[a3].l;
 95                 a4=a[a4].l;
 96             }
 97           else
 98             {
 99                 k-=a5;
100                 l=mid+1;
101                 a1=a[a1].r;
102                 a2=a[a2].r;
103                 a3=a[a3].r;
104                 a4=a[a4].r;
105             }
106       }
107 }
108 int main()
109 {
110     n=read();
111     m=read(); 
112     for(int i=1;i<=n;i++)
113       v1[i]=v[i]=read();
114     sort(v1+1,v1+n+1);
115     n1=unique(v1+1,v1+n+1)-v1;
116     for(int i=1;i<=n;i++)
117       v[i]=lower_bound(v1+1,v1+n1,v[i])-v1;
118     for(int i=1;i<n;i++)
119       {
120           int a1=read(),a2=read();
121           jia(a1,a2);
122           jia(a2,a1);
123       }
124     dfs(1);
125     for(int i=1;i<=n;i++)
126       geng(1,n1-1,root[pos[lc[num[i]][0]]],root[i],v[num[i]]);
127     for(int i=1;i<=m;i++)
128       {
129           int u=read()^lastans,v=read(),k=read();
130           int t=lca(u,v);
131           printf("%d",lastans=cha(u,v,t,k));
132           if(i!=m)
133             printf("\n");
134       }
135     return 0;
136 }

 

转载于:https://www.cnblogs.com/xiw5/p/5618481.html


http://www.niftyadmin.cn/n/1941902.html

相关文章

noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

T21&#xff1a;单词替换 描述 输入一个字符串&#xff0c;以回车结束&#xff08;字符串长度<100&#xff09;。该字符串由若干个单词组成&#xff0c;单词之间用一个空格隔开&#xff0c;所有单词区分大小写。现需要将其中的某个单词替换成另一个单词&#xff0c;并输出替…

功能全面超实用Android下(上)拉刷新库

下拉刷新、上拉加载更多几乎是每个app的必用功能&#xff0c;LightRefresh提供了上拉和下拉功能&#xff0c;主要亮点是自动回弹功能&#xff0c;还支持自定义界面&#xff0c;功能可谓强大。 可以不要刷新头&#xff08;支持拉动回弹效果&#xff0c;类似于qq的下拉刷新&#…

撕不撕?如何撕?跟谁撕?权力游戏致胜手册

本文为原创文章&#xff0c;转载请联系作者Gracia上篇枫叶国观感发布后&#xff0c;大家纷纷表示很喜欢。都说理论联系实际&#xff0c;我想结合真实感受&#xff0c;写个续篇&#xff0c;往前多走半步&#xff0c;介绍一本书&#xff0c;谈谈政治、权力与日常生活的关系。 作为…

计算机休眠自动开机,win7电脑休眠后会自动开机,睡眠原因?怎么处理?

可能用户没有正确设置关闭休眠功能。什么是休眠&#xff1a;休眠功能是在电脑进入休眠状态时将数据保存到硬盘中&#xff0c;进入休眠状态后&#xff0c;电脑相当于断电了&#xff0c;所以功耗几乎为零!而在休眠状态时不会影响已经保存的数据&#xff0c;当电脑唤醒时&#xff…

【转】【Android】对话框 AlertDialog -- 不错不错

原文网址&#xff1a;http://blog.csdn.net/feng88724/article/details/6171450 本讲介绍一下Android基本组件&#xff1a;对话框AlertDialog。 API&#xff1a; java.lang.Object ↳android.app.AlertDialog.Builder使用AlertDialog.Builder创建对话框需要了解以下几个方法&…

Linux基础入门学习笔记之四

环境变量与文件查找 环境变量 变量所谓shell变量&#xff0c;就是计算机中用于记录一个值&#xff08;不一定是数值&#xff0c;也可以是字符或字符串&#xff09;的符号&#xff0c;而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系&#xff0c;可以通过表达式读…

源码包---linux软件安装与管理

源代码推荐保存位置:   /usr/local/src 软件安装位置: /usr/local 如何确定安装过程报错: 安装过程停止并出现error / warning / no 的提示./configure 软件配置与检查    源码包如无特殊情况,一定要指定其安装目录 定义需要的功能选项检查系统环境是否符合安装要求把定义…

DPDK(二):准备5---cache 颠簸

1、每一个运行中的任务/线程&#xff0c;用了一组CPU寄存器,包含各种内部状态的数据,如当前正在执行的指令所在的内存地址,当前正在执行操作的操作数和/或操作结果,栈指针等等.所有的这些信息被统称为"上下文"。任何抢占式操作系统都必须具备几乎在任何时刻停止一个正…