
----线段树
欣君
追寻那如樱花般的绚烂
展开
-
51nod 1287 加农炮
二分+线段树的经典题目#includeusing namespace std;int num[100000];struct node{ int l,r; long long nsum;}segtree[300000];void build(int i,int l,int r){ segtree[i].l=l; segtree[i].r=r; if(l==r) {原创 2016-11-06 14:28:08 · 258 阅读 · 0 评论 -
51nod 1364 最大字典序排列
贪心+线段树+二分姿势有点问题。。加了快速读写才不T。。。。#includeusing namespace std;const int MAXN=100100;int a[MAXN],pos[MAXN];struct node{ int l,r; int nsum;}segtree1[MAXN<<2],segtree2[MAXN<<2];void build1(int原创 2016-12-08 00:27:18 · 291 阅读 · 0 评论 -
51nod 1781 Pinball
昨天看到时,这题还是三级题的。然后各种想不出。大佬说DP+线段树+离散,想了想可以做。然后今天改成了五级题了。。。L[i]表示球从1位置落下,最后从第i个漏斗出去的情况下,的最小费用。R[i]表示球从n位置落下,最后从第i个漏斗出去的情况下,的最小费用。那么答案就是min(L[i]+R[i]-d[i])。动态转移方程:L[i]=min{L[j] | a[i]≤c[j]≤b[i]}转载 2017-02-07 13:29:32 · 392 阅读 · 1 评论 -
51nod 1463 找朋友
离线+线段树将询问按右端点排序。这样对于(i,j),j必定在当前询问范围内。可以将a[i]+a[j]累积到i上,那样就变成了求区间最大值。#include using namespace std;void read(int&a){ char ch;while(!((ch=getchar())>='0')&&(ch<='9')); a=ch-'0';while(((ch原创 2017-02-19 23:42:08 · 486 阅读 · 0 评论 -
51nod 1199 Money out of Thin Air
利用dfs序(先序遍历),将树对应到一维数组上。然后用线段树更新求解。#includeusing namespace std;const int MAXN=50050;vector vec[MAXN];int sonsum[MAXN],w[MAXN],mp[MAXN],num[MAXN];int tim;struct node{ int l,r; long long ns原创 2017-02-15 16:21:53 · 593 阅读 · 0 评论 -
51nod 1766 树上的最远点对
线段树套LCA。。。写了近200行对于区间[a,b]和区间[c,d]上各选一点的最大长度,必定等于区间[a,b]内最远点对中的某一点,与区间[c,d]内最远点对中的某一点,这两点的距离。因为有这个性质,就可以在线段树上进行查询了。注意线段树中的合并merge操作,与求答案时的merge操作,有些不同。#include using namespace std;void read(int原创 2017-02-26 16:23:44 · 448 阅读 · 0 评论 -
51nod 1461 稳定桌
用线段树查询区间k小和。#includeusing namespace std;const int MAXN=100100;int cnt[MAXN];struct Leg{ int l,d;}arr[MAXN];bool cmp(Leg l1,Leg l2){ return l1.l>l2.l;} struct node{ long long c,v;}原创 2017-07-15 16:51:27 · 351 阅读 · 0 评论