博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
阅读量:4982 次
发布时间:2019-06-12

本文共 1332 字,大约阅读时间需要 4 分钟。

【题解】

  每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数。我们可以用fx(t)=t-b[x]表示这个一次函数。每次询问一条链上fx(t)大于c的点的个数,也就是问有多少个点满足t-b[x]>c,移项得b[x]<t-c,不等式左边只与点有关,可以当做点权,右边只与询问有关。因此我们可以写没有修改的主席树。

  同时这道题也可以离线后用树状数组写。我们维护某个点到根的链上小于等于某个值的数的个数Cnt,这开一个权值树状数组就可以做到。这样每个询问(x,y)的答案就是Cnt[x]+Cnt[y]-Cnt[lca]-Cnt[fa[lca]]. 我们dfs进行维护,进入这个点的时候在树状数组中加入点权,退出这个点的时候删除点权,同时在每个点计算与这个点有关的答案即可。

  

1 #include
2 #include
3 #include
4 #define N 200010 5 #define rg register 6 using namespace std; 7 int n,m,rt,tot,cnt,ret,last[N],ans[N],ans2[N],fa[N],hvy[N],size[N],top[N],dep[N],t[N],val[N]; 8 vector
son[N]; 9 struct rec{10 int pos,val,type,pre;11 }data[N<<2];12 inline int read(){13 int k=0,f=1; char c=getchar();14 while(c<'0'||c>'9')c=getchar();15 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();16 return k*f;17 }18 void dfs1(int x){19 size[x]=1; dep[x]=dep[fa[x]]+1;20 for(rg int i=0,s;i
size[hvy[x]]) hvy[x]=s;23 }24 }25 void dfs2(int x,int tp){26 top[x]=tp;27 if(hvy[x]) dfs2(hvy[x],tp);28 for(rg int i=0,s;i
0;j-=(j&-j)) ret+=t[j];44 ans[data[i].pos]+=data[i].type*ret;45 }46 for(rg int i=0;i
View Code

 

转载于:https://www.cnblogs.com/DriverLao/p/8696630.html

你可能感兴趣的文章
CSS border 生成三角
查看>>
asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
查看>>
7.STM32中GPIO理解
查看>>
base64 json
查看>>
在vim中搜索单词
查看>>
设置定点数学属性
查看>>
自动化测试工具 Test Studio入门教程
查看>>
Python之进程线程
查看>>
排序算法(一) —— 冒泡排序
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
窗外【1】
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
Android 四大组件之Service
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>
xml.dom.minidom
查看>>
Exponentiation
查看>>
本地jar上传到本地仓库
查看>>
7.14T3
查看>>
四则运算C++带Qt界面版本,吾王镇楼。。。。。
查看>>