倍增跳来跳去
stone41123
一名苦逼的OIer,欢迎交朋友。。。
展开
-
洛谷 P2633 Count on a tree[bzoj2588](倍增lca+主席树)
传送门 此题非常裸,就是代码太多了,2519,115行。 没什么可说的,思路就是每个节点利用它的父亲建立主席树,查询的时候,sum[u]+sum[v]-sum[lca[u]]-sum[father[lca[u,v]]]就是左子树的大小,然后就没什么了。 代码:(1000ms,还挺快的)#include<cstdio>#include<algorithm>#define ll long lo原创 2017-09-18 18:08:34 · 413 阅读 · 0 评论 -
洛谷 P1967 货车运输(Kruskal最大生成树&&倍增lca)
传送门 这个题我本来看出来了,也想到做法了,然后打了130行的代码,开始调,好不容易调过样例,然后就交; 第一次CE,改了继续交; 第二次10分,我当时就崩溃,我写了这么长时间,还不如30分无脑暴力??我就看题解,果然算法就是这样,然后,比对了好几个,也没看见什么错,倒是跟着他们优化了优化常数,然后又交; 第三次还是10分,我已经麻木了,放弃了看题解,开始对着自己的代码肉眼debug,结果又原创 2017-09-10 18:38:41 · 447 阅读 · 1 评论 -
[bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+倍增lca+启发式合并)
传送门(luogu) 传送门(bzoj) 此题有两种操作: 1.查询树上两点间权值第k小 2.连接两棵树 限制条件:强制在线 看到第k小大家想到的肯定是主席树,可是连边又让大家想到了LCT 我们选择使用主席树。 为什么呢? 我们肯定是要舍弃两种操作中的一种,让它变慢,另一个就快了。 然而,第k小显然没有什么优化的余地,可是连接两棵树显然就是合并两棵树 合并!我们可以想到启发式合原创 2017-10-06 21:38:45 · 962 阅读 · 0 评论 -
清北学堂-D7-T1-bst
这个题暴力给了50分,直接模拟即可。 为什么是50分呢?有些人会有这个疑问。 原因很简单,你可以模拟一下这组数据: 10 1 2 3 4 5 6 7 8 9 10 你可以发现,如果我给你你个递增序列,你的算法就会被卡到O(n2)O(n^2) 那这个题怎么做呢? 我这里介绍两个做法,都不是std 1.某位大佬的倍增 我们可以插入的时候更新每个点ii向下跳2j2^j步的目标点,然后插入原创 2017-10-08 18:55:26 · 388 阅读 · 0 评论 -
清北学堂-D2-T3-plutotree
此题我爆零,不想改了。 解法:树形dp(dfs),倍增lca,分类乱搞。。 贴个std:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 111111;const int inf = 1原创 2017-10-02 18:39:39 · 680 阅读 · 0 评论 -
[bzoj3545+3551][ONTAK2010]Peaks&&加强版(离线+线段树合并)||(kruskal重构树&&dfs序+主席树)
传送门 没权限号可以来这里交,老规矩,不准说。题面Description在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。Input第一行三个数N,M,Q。 第二行N个数,第i个数为h原创 2017-10-27 18:10:33 · 446 阅读 · 0 评论 -
NOIP2016 天天爱跑步
传送门 真的神(shui)题。。。 首先推一波式子:(dep代表深度,len代表路径长度,s,t,w如题所述) 假设一个观察员i可以看到j,则:deps[j]−depi=wi||dept[j]−depi=lenj−wi假设一个观察员i可以看到j,则:dep_{s[j]}-dep_i=w_i || dep_{t[j]}-dep_i=len_j-w_i depi+wi=deps[j]||depi−原创 2017-11-10 09:07:43 · 217 阅读 · 0 评论 -
[NOI2010]:超级钢琴
传送门 这个题有趣。。。 巧妙地利用st表和堆 首先最暴力的我就不说了 第二个暴力就是主席树+堆,预计得分70~80,时间O(klog2n)O(klog^2n) std是用堆存储可能的区间,然后用st表查询区间最小值 因为其实如果知道区间右端点,再处理个前缀和s 那么就只要查询区间最小值就可以了,可以st表O(1)做 代码:#include<cstdio>#include<cstd原创 2017-12-13 21:51:16 · 300 阅读 · 0 评论