
差分
wanherun
今天会有好事发生吗
展开
-
[noip2012]借教室 题解
emm,根据题意描述,就是每次区间加一个数,问是否满足条件。首先,答案肯定满足二分性质,之后就是判断了。说白了就是很多次区间加,然后一次查询前面各个数。当然,线段树,树状数组裸题,但是,这样是nlogn的,过不了呀。要重新考虑。由于只查询一次,我们可以差分数组,每次修改是O(1)的,查询是O(n)的,综合一下,也是O(n)的,就好了,具体做法是在cnt[s]+=add,cnt[t+1]-=add,前原创 2017-10-29 21:35:35 · 537 阅读 · 0 评论 -
[noip2015]运输计划 题解
貌似又是最大最小问题,考虑二分答案。好了,现在我们已经二分出答案(len)了,如何判断是否合法。其实思路十分简单,就是把所有长度大于len的路径记录,然后找它们交的最大值,减去,看是否满足答案。问题就变成了如何求路径的交,树链剖分是可以的,但还有更优的做法。树上差分,把路径起点加一,终点加一,lca减二,一个点的子树权值和就是该点到父亲的边上的经过次数了。#include<bits/stdc++.h原创 2017-10-22 17:52:17 · 434 阅读 · 0 评论 -
[noip2016]天天爱跑步 题解
哎,最难第一道题了,昨天才刚刚刚出来,但其实还是有些不太理解,就把自己的想法写一下,说不定哪儿天就融会贯通了呢。设每一条道路的起点为S,中点为T,它们的lca(最近公共祖先)为LCA,那么,就是求S到lca上dep[x]+w[x]==dep[S](由dep[S]-dep[x]==w[x]变形可得)的数量,lca到T是类似的,不过有一个减号,为了让它变为正,加一个数就好了,具体为dep[x]-w[x]原创 2017-10-20 23:29:12 · 1448 阅读 · 0 评论 -
bzoj4719 [Noip2016]天天爱跑步
题目noip真题,支持呀,先再洛谷上交了一发,再过来水水。。#include<bits/stdc++.h>#define N 1000000 using namespace std;int n,m,x,y,lc,tmp,w[N+5],b;int f[N+5][25],dep[N+5],ans[N+5];int first[N+5],nxt[N+5],to[N+5],siz;int fir原创 2017-10-19 23:53:08 · 174 阅读 · 0 评论 -
bzoj4326 NOIP2015 运输计划
题目遥想当年初三参加时,想到了二分,想到了lca,就没想到如何判断,然后差20分省一23333.首先答案显然满足二分性质,之后判定答案。我们把长度超过k的路径找到,找出它们公共边中最长的,把它变为0,看是否可行。 如何,找公共边?树链剖分当然可以,但太复杂了。可以把两端标记加1,lca标记减2,之后以一个节点为根的子树的和,即为这条边经过了几次。#include<bits/stdc++.h>#d原创 2017-09-11 21:52:15 · 237 阅读 · 0 评论 -
bzoj1103 [POI2007]大都市meg
题目由于是处理根到节点的信息,dfs序就可以派上用场了,比树链剖分方便多了。 第一次标记为1,第二次为-1,前缀和就是到根经过的路的数量。#include<bits/stdc++.h>#define N 250000using namespace std;struct Tree{ int l; int r; int sum;};Tree T[8*N+1];int原创 2017-09-11 21:48:57 · 186 阅读 · 0 评论 -
bzoj1303 [CQOI2009]中位数图
题目中位数判定日常做法。把比b大的设为1,比b小的设为-1,一样设为0。 区间和如果为0的话,中位数就是b。记录前缀和,如果有相等的就为一组1。 注意长度要为奇数。 要奇偶分开考虑。。。#include<bits/stdc++.h>#define N 100000using namespace std;int n,x,b;int f[N+1];int sum[N+1];int cn原创 2017-09-08 22:30:07 · 187 阅读 · 0 评论