又是因为傻逼错误浪费了半天时间

原题:

给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。
N,M<=100000
暴力自重。。。
树上煮席树,我和rapiz讨论了一段时间觉得区间不连续咋做啊
然后去膜黄学长的代码,顺间get到正解(然后瞬间写出程序,然后一个傻逼错误调了3h
在线段上搞煮席树搞得是前缀和,树上也可以搞一个树上前缀和然后搞煮席树
大概就是每个节点都在这个节点爸爸的基础上修改一个新版本
设要查询a和b,c=lca(a,b),d=father(lca(a,b)),在煮席树查询的时候只需要比较sum(a.lchild)+sum(b.lchild)-sum(c.lchild)-sum(d.lchild)即可
注意d要是c的爸爸而不能直接c<<1,lca也要算进去
傻逼错误就是建树的时候存的单项边
实力真的越来越弱了
代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 using namespace std;
  7 int read(){int z=0,mark=1;  char ch=getchar();
  8     while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
  9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
 10     return z*mark;
 11 }
 12 struct ddd{int next,y;}e[210000];  int LINK[110000],ltop=0;
 13 inline void insert(int x,int y){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;}
 14 int n,m,a[110000];  int b[110000],disperse[110000],disperse_cnt=0;
 15 int ancestor[110000][20],deep[110000];
 16 int dfs_order[110000],order_cnt=0;
 17 struct dcd{int sleft,sright,mid,lchild,rchild,svalue;}tree[4100000];
 18 int roots[110000],tree_cnt=0;
 19 int get_SegmentTree(int x,int _left,int _right){
 20     tree[x].sleft=_left,tree[x].sright=_right,tree[x].mid=(_left+_right)>>1;
 21     tree[x].svalue=0;
 22     if(_left!=_right){
 23         tree[x].lchild=get_SegmentTree(++tree_cnt,_left,tree[x].mid);
 24         tree[x].rchild=get_SegmentTree(++tree_cnt,tree[x].mid+1,_right);
 25     }
 26     return x;
 27 }
 28 int modify(int x,int y){
 29     tree[++tree_cnt]=tree[x];  x=tree_cnt;  tree[x].svalue++;
 30     if(tree[x].sleft==y && tree[x].sright==y)  return x;
 31     if(y<=tree[x].mid)  tree[x].lchild=modify(tree[x].lchild,y);
 32     else  tree[x].rchild=modify(tree[x].rchild,y);
 33     return x;
 34 }
 35 /*int query(int x,int y,int z){
 36     if(tree[x].sleft==tree[x].sright)  return tree[x].sleft;
 37     else if(z<=tree[tree[y].lchild].svalue-tree[tree[x].lchild].svalue)
 38         return query(tree[x].lchild,tree[y].lchild,z);
 39     else  return query(tree[x].rchild,tree[y].rchild,
 40                        z-tree[tree[x].lchild].svalue+tree[tree[x].lchild].svalue);
 41 }*/
 42 int query(int x,int y,int z,int zz,int _value){
 43     if(tree[x].sleft==tree[x].sright)  return tree[x].sleft;
 44     int value_sum=tree[tree[x].lchild].svalue+tree[tree[y].lchild].svalue
 45         -tree[tree[z].lchild].svalue-tree[tree[zz].lchild].svalue;
 46     if(_value<=value_sum)  return query(tree[x].lchild,tree[y].lchild,tree[z].lchild,tree[zz].lchild,_value);
 47     else  return query(tree[x].rchild,tree[y].rchild,tree[z].rchild,tree[zz].rchild,_value-value_sum);
 48 }
 49 int binary_search(int x){
 50     int _left=1,_right=disperse_cnt,mid;
 51     while(_left+1<_right){
 52         mid=(_left+_right)>>1;
 53         if(disperse[mid]<=x)  _left=mid;
 54         else  _right=mid;
 55     }
 56     return (disperse[_right]==x)?_right:_left;
 57 }
 58 void dfs(int x){
 59     dfs_order[++order_cnt]=x;
 60     for(int i=1;(1<<i)<=deep[x];++i)  ancestor[x][i]=ancestor[ancestor[x][i-1]][i-1];
 61     for(int i=LINK[x];i;i=e[i].next)if(e[i].y!=ancestor[x][0]){
 62         ancestor[e[i].y][0]=x;  deep[e[i].y]=deep[x]+1;
 63         //roots[e[i].y]=modify(roots[x],binary_search(a[e[i].y]));
 64         dfs(e[i].y);
 65     }
 66 }
 67 int lca(int x,int y){
 68     if(deep[x]<deep[y])  swap(x,y);
 69     int _deep=deep[x]-deep[y];
 70     for(int i=0;i<=16;++i)if((1<<i)&_deep)  x=ancestor[x][i];
 71     for(int i=16;i>=0;--i)if(ancestor[x][i]!=ancestor[y][i])
 72         x=ancestor[x][i],y=ancestor[y][i];
 73     if(x==y)  return x;
 74     else return ancestor[x][0];
 75 }
 76 int main(){//freopen("ddd.in","r",stdin);
 77     cin>>n>>m;
 78     for(int i=1;i<=n;++i)  b[i]=a[i]=read();
 79     sort(b+1,b+n+1);
 80     for(int i=1;i<=n;++i)if(b[i]!=b[i-1])  disperse[++disperse_cnt]=b[i];
 81     int _left,_right,_value;
 82     for(int i=1;i<n;++i){
 83         _left=read(),_right=read();
 84         insert(_left,_right),insert(_right,_left);
 85     }
 86     roots[0]=get_SegmentTree(tree_cnt=0,1,disperse_cnt);
 87     insert(0,1);
 88     dfs(0);
 89     for(int i=1;i<=order_cnt;++i){
 90         int temp=dfs_order[i];
 91         roots[temp]=modify(roots[ancestor[temp][0]],binary_search(a[temp]));
 92     }
 93     int last=0;
 94     while(m --> 0){//趋向于
 95         _left=read(),_right=read(),_value=read();
 96         _left^=last;
 97         last=disperse[query(roots[_left],roots[_right],
 98                             roots[lca(_left,_right)],roots[ancestor[lca(_left,_right)][0]],_value)];
 99         printf("%d",last);
100         if(m)  printf("\n");
101     }
102     return 0;
103 }

View Code

转载于:https://www.cnblogs.com/JSL2018/p/6393165.html

【BZOJ2558】Count on a tree相关推荐

  1. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  2. 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA

    传送门 写在前面:一天下来就写了两道主席树的题--(codevs上的一道智障天梯不算) 思路: 才知道原来主席树不仅可以通过dfs序维护子树区间,还可以直接维护一条到根的链-- 我们建好主席树后,每次 ...

  3. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)

    [优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...

  4. 【机器学习】决策树(Decision Tree)

    [机器学习]k近邻算法(KNN) [机器学习]决策树(Decision Tree) [机器学习]朴素贝叶斯(Naive Bayes) 一.概述 决策树(Decision Tree)是有监督学习中的一种 ...

  5. 【ML】决策树(Decision tree)原理 + 实践 (基于sklearn)

    [ML]决策树(Decision tree)原理 + 实践 (基于sklearn) 原理介绍 简要介绍 原理 得分函数(信息熵) 实战 数据集 数据处理 训练 预测+评估 绘制决策树 原理介绍 简要介 ...

  6. 【Leetcode】431. Encode N-ary Tree to Binary Tree(困难)

    一.题目 1.题目描述 Design an algorithm to encode an N-ary tree into a binary tree and decode the binary tre ...

  7. 【VK Cup 2016 - Round 1 (Div 2 Edition)C】【构造】Bear and Forgotten Tree 3 构造一棵树直径为d且点1的深度为h

    Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. 【UOJ170】Picks loves segment tree VIII

    [题目链接] 点击打开链接 [前置阅读] [BZOJ4695]最假女选手 [BZOJ3064][TYVJ1518]CPU监控 [UOJ169][UR #11]元旦老人与数列 [思路要点] 前置阅读中的 ...

  9. 【SPOJ COT2】Count on a tree II,树上莫队

    Time:2016.09.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 第一次写树上莫队 被char哥怒裱一通 实际上还是比较简单的 序列的相关维护问题转移到树上一般都要涉及 ...

最新文章

  1. 阿里云云盾-风险识别-增强版模式发布
  2. 贷款利率最高多少合法?
  3. c++11 Type Alias
  4. IT从业的迷思与破解之道(更新)
  5. jaxb 处理_休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程
  6. 【开源项目】使用FFMPEG解析H264编码为YUV格式
  7. CSS3的常用属性(一)
  8. 目录指南中的Python列表文件-listdir VS system(“ ls”)通过示例进行解释
  9. 论文中要用到的SPSS基础分析
  10. Hillstone设备管理-许可证安装
  11. javascript的模块开发方法;
  12. 朋友圈我快看不下去了!
  13. 打造极致Material Design动画风格Button
  14. Java实现对文件的读与写
  15. 【逗老师带你学IT】Yeastar PSTN网关对接FreePBX网关的各种坑-国内VOIP发展感叹
  16. python伪装ip_Python爬虫如何用高质量代理IP伪装?
  17. 浅谈UAC ByPass
  18. 生物信息百Jia软件(22):featureCounts
  19. 在虚拟机上使用SoftRoCE部署SPDK NVMe-oF
  20. 消灭糟糕的办公环境,解决桌面文件会乱问题

热门文章

  1. 数据结构 链表(一)
  2. ios 自己创建的动态frameworks 怎么发布_iPadOS/iOS 13.1 正式发布,这才是真正的 iOS 13 系统...
  3. python字符串单个替换_如何用变量替换列表中的单个字符串?
  4. mysql myisam存储引擎_MySQL浅谈MyISAM存储引擎
  5. dblinq mysql_DBLinq mysql辅助脚本
  6. 前端获取浏览器标识_浏览器缓存机制
  7. Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
  8. 2019河南对口高职高专计算机,2019年河南普通高招最后一个批次 高职高专批正式投档...
  9. python第三方插件登录网易音乐_python3-使用requests模拟登录网易云音乐
  10. linux命令的详情描述,linux 常用基础命令 tail 详细介绍