----线段树
欣君
追寻那如樱花般的绚烂
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
51nod 1287 加农炮
二分+线段树的经典题目 #include using 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 · 321 阅读 · 0 评论 -
51nod 1364 最大字典序排列
贪心+线段树+二分 姿势有点问题。。加了快速读写才不T。。。。 #include using 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 · 341 阅读 · 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 · 448 阅读 · 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 · 570 阅读 · 0 评论 -
51nod 1199 Money out of Thin Air
利用dfs序(先序遍历),将树对应到一维数组上。然后用线段树更新求解。 #include using 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 · 640 阅读 · 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 · 492 阅读 · 0 评论 -
51nod 1461 稳定桌
用线段树查询区间k小和。 #include using 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 · 398 阅读 · 0 评论
分享