[BZOJ1316]点分治关于定长问题的讨论
来源:互联网 发布:淘宝 产品对比 违规 编辑:程序博客网 时间:2024/06/10 02:47
题目:
我是超链接
题解:
确实是很简单的题目(裸题啊)
在这里讨论一下关于calc的写法
写法1
for (int i=1;i<=m;i++) { int l=1,r=num,p=r; while (l<r) { while (p>l && deep[p]>=deep[r]) p--; p=max(p,l); if (deep[l]+deep[r]==q[i]) { ans[i]+=(vv)*(r-p); l++; } else { if (deep[l]+deep[r]>q[i]) r=p;else l++; } } }
缺点1:不能统计上q[i]为0的时候,也就是无法单独选一个节点,但这个好办,特判一下就行了
缺点2:当有0权边时不能统计无关于长度的量
这一种写法用在了采药人的路径 这道题,在相同的量很多的情况下不用一个一个加下去,而是固定相同的区间,每次相同的直接加入,是比较好的做法
对于缺点2,“无关于长度的量”指的是Race,这里面统计的是深度,需要进行r的缩小,所以不能使用这种方法
但是在统计有关于长度的量的时候是最快的方法!
写法2
for (int i=1;i<=m;i++) { int l=1,r=num; for (;l<r;l++) { while (l<r && deep[l]+deep[r]>q[i]) r--; for (int j=r;l<j && deep[l]+deep[j]==q[i];j--) ans[i]+=vv; } }
这种写法同样不能统计上q[i]为0的时候,特判++;
可以使用,在本题上跑了652ms(?),却不清楚为什么跑的快
相比于上一个有优势在于r是-1-1-1的
写法3
for (int i=1;i<=m;i++) { int l=1,r=num; for (;l<=r;l++)//这个等号不能省啊 { while (l<r && deep[l]+deep[r]>q[i]) r--; for (int j=r;deep[l]+deep[j]==q[i];j--) ans[i]+=vv; } }
相当于把重合的部分加了两遍,但是减的时候也是两遍,所以不会出错
而且q[i]为0的时候已经包含进去了!但尽量不要使用,毕竟慢啊。。。
阅读全文
1 0
- [BZOJ1316]点分治关于定长问题的讨论
- 【bzoj1316】【树上的询问】【点分治+map】
- [BZOJ1316]树上的询问(点分治+二分)
- bzoj1316
- 关于插入点的一个讨论
- 关于SIGCHLD的几点讨论
- 关于“形式化”问题的讨论
- 关于SAT问题的讨论
- 关于分治和递归的几点思考 有关全排序问题
- 分治-最接近点问题
- 定长线段最多覆盖点的个数
- 定长线段最多覆盖点的个数
- 树的分治-点分治
- 关于继承的问题的一些讨论
- 关于点分治的一些不知道算什么的东西
- 关于统一存储多种子类型对象到定长共享内存的问题
- 关于12球问题的讨论
- 关于12球问题的讨论
- tensorflow模型转换
- android studio 加固和签名
- HDOJ 1016 DFS
- SSM
- 桥接模式
- [BZOJ1316]点分治关于定长问题的讨论
- 解决Maven项目中令人头痛的无错误但是有小红叉问题
- 2、获取配置文件中的属性
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- SIGHUP信号与控制终端
- tftp使用
- java如何通过类加载器加载类和jar包
- CSS3动画效果加上简单@media响应式布局 week6学习
- luogu P1044 栈