线段树专题
来源:互联网 发布:淘宝网店装修多少钱 编辑:程序博客网 时间:2024/05/17 21:39
hdu1166 http://acm.hdu.edu.cn/showproblem.php?pid=1166
#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxn = 55555;int sum[maxn << 2];void pushup(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){ if (l == r){ scanf("%d", &sum[rt]); return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void update(int p, int add, int l, int r, int rt){ if (l == r){ sum[rt] += add; return; } int m = (l + r) >> 1; if (p <= m) update(p, add, lson); else update(p, add, rson); pushup(rt);}int query(int L, int R, int l, int r, int rt){ if (L <= l && r <= R) { return sum[rt]; } int m = (l + r) >> 1; int ret = 0; if (L <= m) ret += query(L, R, lson); if (R > m) ret += query(L, R, rson); return ret;}int main(){ int test, n; scanf("%d", &test); for (int t = 1; t <= test; t++){ printf("Case %d:\n", t); scanf("%d",&n); build(1, n, 1); char op[10]; while(scanf("%s",op)){ if (op[0] == 'E') break; int a,b; scanf("%d%d",&a, &b); if (op[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1)); else if (op[0] == 'S') update(a, -b, 1, n, 1); else update(a, b, 1, n, 1); } } return 0;}
hdu1754 http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include<cstdio>#include<algorithm>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxm = 222222;int sum[maxm << 2];void pushup(int rt){ sum[rt] = std::max(sum[rt << 1], sum[rt << 1 | 1]);}void build(int l, int r, int rt){ if (l == r) { scanf("%d",&sum[rt]); return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void updata(int p, int prc, int l, int r, int rt){ if (l == r){ sum[rt] = prc; return; } int m = (l + r) >> 1; if (p <= m) updata(p, prc, lson); if (p > m) updata(p, prc, rson); pushup(rt);}int query(int L, int R, int l, int r, int rt){ if (L <= l && r <= R){ return sum[rt]; } int m = (l + r) >> 1; int maxn = 0; if (L <= m) maxn = std::max(maxn, query(L, R, lson)); if (R > m) maxn = std::max(maxn, query(L, R, rson)); return maxn;}int main(){ int n, m; while(~scanf("%d%d", &n, &m)){ memset(sum, 0, sizeof(sum)); build(1, n, 1); while(m--){ char c[2]; int a, b; scanf("%s%d%d", c, &a, &b); if (c[0] == 'Q') printf("%d\n",query(a, b, 1, n, 1)); else updata(a, b, 1, n, 1); } }}
hdu2795 http://acm.hdu.edu.cn/showproblem.php?pid=2795
因为本身建树会达到4*10^9,明显不行,考虑到海报数量,即使不覆盖的贴,也就200000个,即最多2000000个叶子。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxm = 200005;int sum[maxm << 2];int h,n,w,p,post;void pushup(int rt){ sum[rt] = std::max(sum[rt << 1], sum[rt << 1|1]);}void build(int l, int r, int rt){ if (l == r){ sum[rt] = w; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void updata(int p, int l, int r, int rt){ if (l == r){ if (sum[rt] >= p) { sum[rt] -= p; post = l; }else post = -1; return ; } if (sum[rt] < p) { post = -1; return ; } int m = (l + r) >> 1; if (sum[rt << 1] >= p) updata(p, lson); else updata(p, rson); pushup(rt);}int main(){ while(std::cin >> h >> w >> n){ memset(sum, 0, sizeof(sum)); int nn = std::min(h, n); build(1, nn, 1); while(n--){ std::cin >> p; updata(p, 1, nn, 1); printf("%d\n", post); } }}
poj2886 http://poj.org/problem?id=2886
编完头脑发晕啊,各种细节要注意。。。
#include<iostream>#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1using namespace std;const int maxn = 2222222;int sum[maxn << 2];int pos;struct aaa{ char name[15]; int val;}a[maxn];const int antiprime[]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200, 332640,498960,554400,665280}; /// 反素数表, 反素数指1-n中含有素因子数最多的数const int factorNum[]={1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84, 90,96,100,108,120,128,144,160,168,180,192,200,216,224};/// 反素数对应的约数个数void pushup(int rt){ sum[rt] = sum[rt<< 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){ if (l == r){ sum[rt] = 1; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void updata(int k, int l, int r, int rt){ if (l == r){ sum[rt] = 0; pos = l; return ; } int m = (l + r) >> 1; if (k <= sum[rt << 1]) updata(k, lson); else updata(k-sum[rt << 1], rson); pushup(rt);}int main(){ int n, k; while(cin >> n >> k){ for (int i = 0; i < n; i++){ scanf("%s%d",&a[i+1].name, &a[i+1].val); } build(1, n, 1); int cnt = 0; while (cnt < 35 && antiprime[cnt] <= n) cnt++; cnt--; updata(k,1,n,1); for (int i = 1; i < antiprime[cnt]; i++){ int mod = sum[1]; if (a[pos].val > 0) { k = (k + a[pos].val - 1) % mod; if ( k == 0 ) k = mod; }else{ k = (k + a[pos].val) % mod; if (k <= 0) k += mod; } updata(k, 1, n, 1); } printf("%s %d\n",a[pos].name, factorNum[cnt]); }}
hdoj1698 http://acm.hdu.edu.cn/showproblem.php?pid=1698
#include<iostream>#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1using namespace std;const int maxn = 2222222;int sum[maxn << 2];int flag[maxn << 2];void down(int rt, int l, int r){ if (flag[rt]){ flag[rt << 1] = flag[rt << 1 |1] = flag[rt]; int m = (l + r) >> 1; sum[rt << 1] = (m - l + 1) *flag[rt]; sum[rt << 1|1] = (r - m)*flag[rt]; flag[rt] = 0; }}void pushup(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){ flag[rt] = 0; if (l == r){ sum[rt] = 1; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void updata(int x, int y, int z, int l, int r, int rt){ if (x <= l && r <= y){ sum[rt] = (r - l + 1) * z; flag[rt] = z; return ; } down(rt, l, r); int m = (l + r) >> 1; if (y <= m) updata(x, y, z ,lson); else if (x > m) updata(x, y, z, rson); else { updata(x, y, z, lson); updata(x, y, z, rson); } pushup(rt);}void query(int l, int r){}int main(){ int test, n, x, y, z, op; cin >> test; for (int t = 0; t < test; t++){ cin >> n; build(1, n, 1); cin >> op; while(op--){ cin >> x >> y >> z; updata(x, y, z, 1, n, 1); } cout << "Case " << t+1 << ": The total value of the hook is " << sum[1] << "."<< endl; }}
poj3468 http://poj.org/submit?problem_id=3468
#include<iostream>#include<cstdio>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1#define ll long longusing namespace std;const int maxn = 2222222;ll sum[maxn << 2];ll flag[maxn << 2];void down(int rt, int l, int r){ if (flag[rt]){ int m = (l + r) >> 1; flag[rt << 1] += flag[rt]; flag[rt << 1|1] += flag[rt]; sum[rt << 1] += (m -l + 1)*flag[rt]; sum[rt << 1|1] += (r-m)*flag[rt]; flag[rt] = 0; }}void pushup(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){ flag[rt] = 0; if (l == r) { cin >> sum[rt]; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); //cout << l << " " << r << " " << sum[rt] << endl;}void updata(int a, int b, ll c, int l, int r, int rt){ if (a <= l && r <= b){ flag[rt] += c; sum[rt] += (r - l + 1) * c; return ; } down(rt, l, r); int m = (l + r) >> 1; if (b <= m) updata(a, b, c, lson); else if (a > m) updata(a, b, c, rson); else{ updata(a, m, c, lson); updata(m+1, b, c, rson); } pushup(rt);}ll query(int a, int b, int l, int r, int rt){ // cout << l << " " << r << " " << sum[rt] << endl; if (a<= l && r <= b){ return sum[rt]; } down(rt, l, r); int m = (l + r) >> 1; ll ans = 0; if (b <= m) return query(a, b, lson); else if (a > m) return query(a, b, rson); else{ ans += query(a, m, lson); ans += query(m+1, b, rson); return ans; }}int main(){ int n, q, a, b; ll c; cin >> n >> q; build(1, n, 1); while(q--){ char ch; cin >> ch; if (ch == 'Q'){ cin >> a >> b; cout << query(a, b, 1, n, 1) << endl; }else{ cin >> a >> b >> c; updata(a, b, c, 1, n, 1); } }}
poj2528
#include<iostream>#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <cmath>#include <algorithm>#define lson l, m, rt << 1#define rson m+1, r, rt << 1|1using namespace std;const int maxn = 20002;int sum[maxn << 2];int dd[maxn << 2];int d[maxn << 2];bool v[maxn << 2];struct aaa{ int l; int r;}a[maxn << 2];int ans, e;void pushup(int rt){ sum[rt] = sum[rt<< 1] && sum[rt << 1|1]; }void build(int l, int r, int rt){ if (l == r){ sum[l] = 0; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt);}void updata(int tl, int tr, int l, int r, int rt, int pos){ if (sum[rt]) return ; if ( tl <= l && r <= tr){ sum[rt] = 1; if (!v[pos]){ ans++; v[pos] = true; } return ; } int m = (l + r) >> 1; if (tl <= m) updata(tl, tr, lson, pos); if (m < tr) updata(tl, tr, rson, pos); pushup(rt);}int get(int x){ int l = 1; int r = e; while(l <= r){ int m = ( l + r ) >> 1; if (d[m] == x) return m; if (d[m] > x) r = m-1; else l = m + 1; }}int main(){ int ase, n; cin >> ase; while(ase--) { memset(v,0,sizeof(v)); ans = 0; cin >> n; int ep = 0; for (int i = 0; i < n; i++) { cin >> a[i].l >> a[i].r; dd[++ep] = a[i].l; dd[++ep] = a[i].r; } sort(dd+1, dd+ ep + 1); e = 1; d[1] = dd[1]; for (int i = 2; i <= ep; i++) { if (dd[i] != d[e]) d[++e] = dd[i]; } for (int i = e; i >1; i--) { if (d[i] > d[i-1]+1) d[++e] = d[i-1] + 1; } sort(d+1, d+e+1); build(1, n, e); //cout << "*****************"; for (int i = 0; i < n; i++){ int l = get(a[i].l); int r = get(a[i].r); updata(d[l], d[r], 1, e, 1, i); } cout << ans << endl; }}
hdoj3308
#include<iostream>#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <cmath>#include <algorithm>#define lson l, m, rt << 1#define rson m+1, r, rt << 1|1using namespace std;const int maxn = 100005;int a[maxn];struct aaa{ int l; int r; int m;}tree[maxn << 2];void pushup(int rt, int l, int r){ int ll = rt << 1; int rr = rt << 1|1; tree[rt].l = tree[ll].l; tree[rt].r = tree[rr].r; tree[rt].m = max(tree[ll].m, tree[rr].m); int m = (l +r) >> 1; if (a[m] < a[m+1]){ if (tree[ll].l == m - l + 1) tree[rt].l += tree[rr].l; if (tree[rr].r == r-m) tree[rt].r += tree[ll].r; int t = tree[ll].r + tree[rr].l; if (t > tree[rt].m) tree[rt].m = t; }}void build(int l, int r, int rt){ if (l == r){ tree[rt].l = tree[rt].m = tree[rt].r = 1; cin >> a[l]; return ; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt, l, r);}void updata(int x, int y, int l, int r, int rt){ if (l == r){ a[l] = y; return ; } int m = (l + r) >> 1; if (x <= m) updata(x,y,lson); else updata(x,y,rson); pushup(rt,l,r);}int query(int ll, int rr, int l, int r, int rt){ if (ll <= l && r <= rr){ return tree[rt].m; } int m = (l+r) >> 1; int t1 = 0; int t2 = 0; ///* if (ll <= m) t1 = query(ll, rr, lson); if (rr > m) t2 = query(ll, rr, rson); int t = max(t1, t2); if (a[m] < a[m+1]){ t1 = min(tree[rt << 1].r, m-ll+1); t2 = min(tree[rt << 1|1].l, rr-m); t1+= t2; t = max(t1,t); } return t; /* if (rr <= m) return query(ll,rr,lson); else if (ll > m) return query(ll,rr,rson); else{ t1 = query(ll,m,lson); t2 = query(m+1,rr,rson); int t = max(t1,t2); if (a[m] < a[m+1]){ t1 = min(tree[rt<<1].r, m-ll+1); t2 = min(tree[rt<<1|1].l, rr - m); t1+=t2; } return max(t,t1); } */}int main(){ int t, n, m; cin >> t; while(t--){ cin >> n >> m; build(1, n, 1); while(m--){ char ch[5]; int l, r; scanf("%s%d%d",ch,&l,&r); if (ch[0] == 'Q'){ cout << query(++l,++r,1,n,1) << endl; }else{ updata(++l,r,1,n,1); } } }}
0 0
- 线段树专题介绍
- 线段树专题
- 【专题属性】线段树
- 【专题】线段树(完整版)
- 线段树专题
- 线段树专题
- poj线段树专题
- 【专题】线段树
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题训练
- 线段树专题
- 线段树专题
- 线段树专题
- 【线段树专题】poj1151
- maven Nexus入门指南(图文)
- aoj 595 撒哈拉大冒险
- 黄金分割数 蓝桥杯
- 没有tools.jar包的解决办法
- HDU 1158 Employment Planning (简单二维dp)
- 线段树专题
- hdu 3874 Necklace 线段树
- 性能测试之LoardRunner 测试场景监控关注的几点
- 430仿真器安装驱动提示INF找不到所需的段落解决方法
- java中的AWT布局管理器
- 二分法 哈希表送上(详见sdut1480)
- 提高编程能力的建议
- Maven生命周期详解
- 2014.2.22 C语言 头文件