2017.9.23 Count on a tree 思考记录
这个题就是把区间第k大搬到了树上、、
于是想到链剖、但链剖是要支持区间合并的,第k大显然不可以合并,那怎么办呢
所以就可以容斥,,把所有重链起点终点用两个rt截下来,再把每个+和每个-离散下来,然后由于主席树查找是logn的,离散的点最多有logn对,
所以复杂度是(2*nlog^2n) 可以卡过、
网上的题解是dfs序。。感觉dfs序好想比较神奇,,但已经不知道用多少链剖水过dfs了、
虽然很难写,但写完了比较好调,毕竟难点不在分类讨论、终于1A主席树+链剖辣
码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 100005
#include<map>
using namespace std;
int fu[N],sz[N],a,syg[N],cnt,zj[100],sd[100],b,m,n,c,d[N],siz[N*30],sta1[100][100],sta2[100][100],ch[N*30][2],dui[N],ans,fd[N],tot,top[N],rt[N],hson[N];
vector<int>v[N];
void dfs1(int o,int fa,int dis)
{int i;fu[o]=fa;sz[o]=1;d[o]=dis;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fa)continue;dfs1(nd,o,dis+1);if(sz[hson[o]]<sz[nd])hson[o]=nd;sz[o]+=sz[nd]; }
}
void up(int o)
{siz[o]=siz[ch[o][0]]+siz[ch[o][1]];
}
void jia(int o,int l,int r,int last)
{if(l==r){siz[o]=1; return ;}int mid=(l+r)>>1;if(c<=mid){ch[o][0]=++tot;jia(ch[o][0],l,mid,ch[last][0]);ch[o][1]=ch[last][1];}if(c>mid){ch[o][1]=++tot;jia(ch[o][1],mid+1,r,ch[last][1]);ch[o][0]=ch[last][0];}up(o);
}
int wr;
void dfs2(int o,int tap)
{int i;top[o]=tap;syg[o]=wr;rt[o]=++tot;//cout<<o<<" --> "<<rt[o]<<endl;c=dui[o];jia(rt[o],1,n,rt[wr]);wr=o;if(hson[o]!=0)dfs2(hson[o],tap);for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fu[o]||nd==hson[o])continue;dfs2(nd,nd);}
}
void cha(int l,int r)
{if(l==r){ans=fd[l];return; }int mid=(l+r)>>1;int i,lin=0;for(i=1;i<=cnt;i++)lin+=siz[ch[sta1[tot][i]][0]];for(i=1;i<=cnt;i++)lin-=siz[ch[sta2[tot][i]][0]];if(lin<c)
{c-=lin;++tot;for(i=1;i<=cnt;i++)sta1[tot][i]=ch[sta1[tot-1][i]][1],sta2[tot][i]=ch[sta2[tot-1][i]][1];cha(mid+1,r);}else
{++tot;for(i=1;i<=cnt;i++)sta1[tot][i]=ch[sta1[tot-1][i]][0],sta2[tot][i]=ch[sta2[tot-1][i]][0];cha(l,mid);
}--tot;}
void work(int x,int y)
{ans=0;cnt=0;while(top[x]!=top[y]){if(d[top[x]]<d[top[y]])swap(x,y);sd[++cnt]=syg[top[x]];zj[cnt]=x;x=fu[top[x]];} if(d[x]>d[y])swap(x,y);sd[++cnt]=syg[x];zj[cnt]=y; // cout<<cnt;tot=0;++tot;int i;for(i=1;i<=cnt;i++)sta1[tot][i]=rt[zj[i]],sta2[tot][i]=rt[sd[i]];cha(1,n);
}
struct woc
{int a,id;
}s[N];
bool cmp(woc a,woc b)
{return a.a<b.a;
}
int main()
{int i,x,y,z;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)
{
scanf("%d",&s[i].a);s[i].id=i;
}
sort(s+1,s+1+n,cmp);
for(i=1;i<=n;i++)
{
dui[s[i].id]=i;
fd[i]=s[i].a;
}for(i=1;i<n;i++){scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a); }dfs1(1,0,1);dfs2(1,1);for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&c);x=x^ans;work(x,y);
if(i!=m)printf("%d\n",ans);
else printf("%d",ans);}
}
2017.9.23 Count on a tree 思考记录相关推荐
- 2017.4.23 税收与补贴问题 思考记录
题目理解起来很坑,对了好几遍才明白 听说搜索就可以过,所以我用了数学方法. 设增量为x则对于每一个非政府要求价,都有: f(要求)-f(非要求)>=0 f(x)=(价+x)*件数=价*件数+x* ...
- 2017.3.6~2017.3.7 Harry And Magic Box 思考记录(特别不容易)
英文题,看翻译做 看到这个题竟然一下找到了思路: 组合数+容斥:: 但是容斥不太懂 好像要做这个题必须先推容斥.... 试一试吧. 然并卵,花了一个晚上,还是求不出来. 根据题目的重复关系,确实 ...
- 2017.9.2 最大半联通子图 思考记录
这个题一看上去似乎很难,, 半联通子图根本就没听说过啊 但经过一段时间的思考之后似乎模型挺直接的. 但是其实,他就是问你一个选点最多的路径. 因为如果这些点如果不能能构成一条路径的话,不在路径上的 ...
- 2017.10.17 CF#441 F题 思考记录
.果然没有题解做题感觉是不一样的. 这个F题可能是最像往常B题的题了(往常B题就是dp,还一般都不难) 首先这个是|,所以|的数越多,它一定是不降的 那么合法的一定是一个数到一个数往后的数所构成的所有 ...
- 2017.10.8 球形空间产生器sphere 思考记录
圆心上的点到各点之间的距离相等,所以根据距离公式 sqrt ( (x-x1)^2 +(y-y1)^2 + (z-z1)^2) 可以由相邻两个式子列等式拆平方得到一元一次方程 然后消元求方程的解 ...
- 2017.10.7 最长上升子序列 思考记录
由于他添加的数字单调上升,所以答案只会在插入的那个数的f值上更新.. 由于之前插入的数都比这个数小,所以直接找区间f最大值.. 这题splay比上个play题好写太多了 不调不试1A splay辣 ...
- 2017.8.9 老C的键盘 思考记录
这个题一开始想错了. 一开始本来打算每个点存三个值,一个比它大的数的个数,一个不确定的个数,一个比他小的个数.但这是把不同形态拆成不相关的几部分强行存到数组里,不能反映不同排列形态的关系,而且不确定 ...
- 2017.6.12 crash的数字表格 思考记录
很坑的一个题.就是让你求: 可以显然化为: 然后这个gcd就是突破口了,可以考虑gcd的约数. 注:这里的贡献不算1/gcd 这里有个小技巧,就是在设计F和f时,注意是几个互斥的f值相加,并保证相加后 ...
- 2017.5.12 校门外的区间 思考记录
这题很裸,只要维护单点1,0就行了.. 不同运算表示 : u : 全1 d : 全0 i : 以外全0 c : 取反,以外取0 s :取反 线段树标记记得下传时当前点标记清零 ,然后就没了 ...
最新文章
- plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 .
- navicat存储过程返回值为空_Excel VBA解读(128):Function过程详解——枯燥的语法...
- Delphi实现文件下载UrlDownloadToFile
- matlab更改类型,matlab数据类型和转换
- VB.NET 强制删除文件
- iOS13beta2版描述文件,修复了,修复了,修复了,可以用描述文件更新了
- vid在c语言中的作用,——PVID的作用及和VID的区别
- Atitit 圣阿提拉克斯阿克巴仁波切诗歌集 1. 诗歌集分类	1 1.1. 国王颂歌	1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记)	1 1.3. 其他	1 1.4. 大
- DBveaver的一些使用心得
- 手机翻书效果html,移动端实现翻书效果
- [读书笔记]《程序员代码面试指南》
- 9*9数独问题——深度搜索算法
- 如何基于数据分析精准定位你的用户群?
- 特斯拉产业的几个问题
- 衡水中学计算机老师,河北衡水中学|高三榜样教师风采展
- MyBatisPlus--多数据源
- llama是什么动物_美洲驼(Llama)——欧美最佳动物果酱动物
- 『NLP学习笔记』Sklearn计算准确率、精确率、召回率及F1 Score
- MYSQL:查询年龄最大的5个学生(包括年龄并列第5名的所有学生)的姓名、年龄及所在系。
- java实现qlearning,DQN(Deep Q-learning)入门教程(一)之强化学习介绍
热门文章
- java.util.PropertyPermission“ “org.graalvm.nativeimage.imagecode“ “read“
- Python加权图的邻接表邻接矩阵之转换
- M1芯片Mac使用原生brew安装软件速度过慢的解决办法
- 问题:如何将多个文件里内容都提取出来
- python路径规划仿真实验_【python实战】批量获得路径规划——高德地图API
- MongoDB数据库操作---终端操作
- mongodb的条件查询笔记
- python抽奖程序_Python编写抽奖式随机提问程序
- flume数据采集_大数据采集系统Flume集群部署
- handler机制的原理_Handler机制竟然可以这样解释,我惊呆了!