cf1143E 倍增好题!】的更多相关文章

一开始感觉用莫队可以搞一下,但是看了题解才发现这题其实是倍增套路题 把排列转换成nxt数组,然后倍增dp[i][j]表示第i个数后面有(1<<j)个数的最靠左的区间 然后从右往左扫一次即可 #include<bits/stdc++.h> using namespace std; #define maxn 200005 ],last[maxn],nxt[maxn],ans[maxn],a[maxn],b[maxn],n,m,t; //dp[i][j]表示第i个数开始的后面(1<…
离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们百度lca前两个博客就是...) LCA是最近公共祖先的意思,在上图的话像4和5的最近公共祖先就是2,而4和7的最近公共祖先是1,从某种意义上讲如果不怕超时的话,每次直接暴力搜索是可以找到每两个节点的最近公共祖先的,不过红红的TLE不好看,要想生活过得去,还是得看点AC的绿. 而Tarjan求lca是离线算法…
Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000). 这些边被安排成任意两头奶牛都可以通过这些边到达的情况,所以说这是一棵树. 这些奶牛是非常喜欢交际的,经常会去互相访问,他们想让你去帮助他们计算Q(1<=q<=1000)对奶牛之间的距离. Input *…
[BZOJ4569]萌萌哒(并查集,倍增) 题面 BZOJ 题意: 有一个长度为\(n\)的数 给定\(m\)个限制条件 每次限制\(l1-r1\)与\(l2-r2\)是相同的 求出方案数 题解 如果每次给定的限制都是告诉你某一位和某一位是相同的 那么,我们的做法是: 并查集,然后计算有\(k\)个联通块 \(ans=9*10^{k-1}\) 但是,现在每次给定的都是一个区间 我们不太可能暴力的把区间之间的位置两两进行一次合并 所以,我们来想个办法优化一下. 试试倍增? 维护\(logn\)个并…
[BZOJ5304][HAOI2018]字串覆盖(后缀数组,主席树,倍增) 题面 BZOJ 洛谷 题解 贪心的想法是从左往右,能选就选.这个显然是正确的. 题目的数据范围很好的说明了要对于询问分开进行处理. 先考虑询问的模板串长比较大的情况. 那么只需要每次找到一个范围内的最小位置然后接着暴力跳就可以了. 这个这个过程可以把\(AB\)两个串拼接在一起求\(SA\),这样能够匹配上\(P\)串的\(A\)的后缀的起始位置在\(SA\)上就是一段连续区间.考虑每次找出在\(A\)的\([l,r]\…
传送门 思路简单码量超凡? 感觉看完题大家应该都知道是倍增sbsbsb题了吧. 首先预处理出从每个点出发如果是AAA走到哪个点,如果是BBB走到哪个点. 然后利用刚刚预处理出的信息再预处理从每个点出发AAA走2i2^i2i次的距离,BBB走2i2^i2i次的距离,A,BA,BA,B走2i2^i2i轮之后到了哪个点. 剩下的询问就跑倍增就行了. 代码: #include<bits/stdc++.h> #include<tr1/unordered_map> #define fi fir…
倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案,然后倍增的时候记录一个 \(tot\) 转移即可 \(Code\ Below:\) #include <bits/stdc++.h> using namespace std; const int maxn=300000+10; const int inf=0x3f3f3f3f; int n,q,L…
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length. We will ask you to perfrom some instructions of the following form: D…
[BZOJ2306]幸福路径(动态规划,倍增) 题面 BZOJ 题解 不要求确切的值,只需要逼近 显然可以通过移动\(\infty\)步来达到逼近的效果 考虑每次的一步怎么移动 设\(f[i][j]\)表示走\(i\)步到了\(j\)能够得到的最大权值 \(f[i][v]=max(f[i-1][u])+W[v]*p^i,(u,v)\in G\) 这样的复杂度是\(O(T(n+m))\),\(T\)是自己设定的步数 但是这样子逼近精度很慢 假设\(p=0.999999\),大概要\(10^7\)步…
题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v)\)(表示一条两端点为\(u\)和\(v\)的边,下同).考虑Kruskal算法的过程,它必定成为树边的充要条件是它的权值小于树上\(u\)到\(v\)之间的路径上的某条边\(e\),这样就会选中这条边来连接\(u\)和\(v\)所在的连通块而不是选中\(e\).因此,非树边的答案就是它两端点之间…