一些线段树的题目
来源:互联网 发布:无间道3解析知乎 编辑:程序博客网 时间:2024/05/17 03:28
hdu 1689
lazt tag
#include<iostream>#include<cstring>using namespace std;const int maxn = 800000;const int inf = 65535;int add[maxn];struct node{ int l, r, sum;}tree[maxn];void build(int rt, int l, int r){ tree[rt].l = l; tree[rt].r=r; tree[rt].sum=1; int mid = (l+r)>>1; if(l == r) return; if(l<=mid) build(rt<<1,l,mid); if(r>mid) build(rt<<1|1,mid+1,r);}void push_down(int rt){ if(add[rt]){ add[rt<<1] = add[rt<<1|1] = add[rt]; tree[rt<<1].sum = (tree[rt<<1].r-tree[rt<<1].l+1)*add[rt]; tree[rt<<1|1].sum = (tree[rt<<1|1].r-tree[rt<<1|1].l+1)*add[rt]; add[rt] = 0; }}void update(int l, int r, int num, int rt){ if(l<=tree[rt].l && r>=tree[rt].r){ add[rt] = num; tree[rt].sum = num*(tree[rt].r-tree[rt].l+1); return ; } push_down(rt); int mid = (tree[rt].l+tree[rt].r)>>1; if(l<=mid) update(l, r,num, rt<<1); if(r>mid) update(l, r,num, rt<<1|1); tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;}int main(int argc, char const *argv[]) { int T; cin >> T; while(T--){ memset(add, 0, sizeof(add)); int n; cin >> n; build(1,1, n); cout << "1" << endl; int m; cin >> m; int a, b, c; for(int i=1; i<=m; i++){ cin >> a >> b >> c; update(a, b, c, 1); } cout << tree[1].sum << endl; } return 0;}/*11021 5 25 9 3*/
poj 3667
#include <stdio.h>const int maxn = 50000;int n, mNum, op, a, b;int sum[maxn*3], lsum[maxn*3], rsum[maxn*3], cover[maxn*3];void BuildTree(int l, int r, int rt){ cover[rt] = -1; lsum[rt] = rsum[rt] = sum[rt] = r-l+1; if (l == r) return ; int m = (l+r)>>1; BuildTree(l, m, rt<<1); BuildTree(m+1, r, rt<<1|1);}/* BuildTree */void PushDown(int rt, int k){ if (cover[rt] != -1) { /* Lazy Tag */ cover[rt<<1] = cover[rt<<1|1] = cover[rt]; lsum[rt<<1] = rsum[rt<<1] = sum[rt<<1] = cover[rt]==0 ? 0:(k-(k>>1)); lsum[rt<<1|1] = rsum[rt<<1|1] = sum[rt<<1|1] = cover[rt]==0 ? 0:(k>>1); cover[rt] = -1; }}/* PushDown */int query(int w, int l, int r, int rt){ if (l == r) return 1; PushDown(rt, r-l+1); /* Push Down */ int m = (l+r)>>1; if (sum[rt<<1] >= w) /* 左连续区间长度 */ return query(w, l, m, rt<<1); else if (rsum[rt<<1]+lsum[rt<<1|1] >= w) /* 左区间后半部分与右区间左半部分长度 */ return m-rsum[rt<<1]+1; else /* 右连续区间长度 */ return query(w, m+1, r, rt<<1|1);}/* query */int Max(int x, int y){ return (x>y ? x:y);}/* Max */void PushUp(int rt, int k){ lsum[rt] = lsum[rt<<1]; /* 左区间的左半部分 */ rsum[rt] = rsum[rt<<1|1]; /* 右区间的右半部分 */ if (lsum[rt] == k-(k>>1)) lsum[rt] += lsum[rt<<1|1]; if (rsum[rt] == k>>1) rsum[rt] += rsum[rt<<1]; sum[rt] = Max(rsum[rt<<1]+lsum[rt<<1|1], Max(sum[rt<<1], sum[rt<<1|1]));}/* PushUp */void UpData(int L, int R, int c, int l, int r, int rt){ if (L<=l && r<=R) { lsum[rt] = rsum[rt] = sum[rt] = c==0? 0 : r-l+1; cover[rt] = c; return ; }/* End of If */ PushDown(rt, r-l+1); /* Push Down */ int m = (l+r)>>1; if (L <= m) UpData(L, R, c, l, m, rt<<1); if (R > m) UpData(L, R, c, m+1, r, rt<<1|1); PushUp(rt, r-l+1); /* Push Up */}/* Updata */int main(){ scanf("%d %d", &n, &mNum); BuildTree(1, n, 1); /* BuildTree */ for (int i=1; i<=mNum; ++i) { scanf("%d", &op); if (op == 1) { // Request scanf("%d", &a); if (sum[1] < a) printf("0\n"); /* No result */ else { int pos = query(a, 1, n, 1); printf("%d\n", pos); UpData(pos, pos+a-1, 1, 1, n, 1); /* UpData the interval */ } }/* End of If */ else { scanf("%d %d", &a, &b); UpData(a, a+b-1, 0, 1, n, 1); /* UpData the interval */ } }/* End of For */ return 0;}/*10 61 31 31 31 32 5 51 6*/
poj 3468
/*#include <iostream>#include<cstdio>using namespace std;const int maxn = 100001;int lsum[maxn*4], rsum[maxn*4], sum[maxn*4], cov[maxn*4];int v[maxn];int n, m;void build(int l, int r, int rt){ cov[rt] = 0; lsum[rt] = rsum[rt] = sum[rt] = 0; if(l == r) return ; int m = (l+r)>>1; build(l, m, rt<<1); build(m+1, r, rt<<1|1);}int query(int ll, int rr, int l, int r, int rt){ if(ll<=l && rr>=r) { return sum[rt]; } int m = (l+r)>> 1; if(ll<m) query(ll, m, l, r, rt<<1); if(rr>=m) query(m+1, rr, l, r, rt<<1|1); sum[rt] = lsum[rt<<1]+ rsum[rt<<1|1];}void update(int ll, int rr, int v, int l, int r, int rt){ if(ll<=l && rr>=r) { sum[rt] += v*(rr-ll+1); lsum[rt] += v*(rr-ll+1); rsum[rt] += v*(rr-ll+1); return ; } int m = (ll+rr)>>1; if(ll < m) update(ll, m, v, l, r, rt<<1); if(rr >= m) update(m+1, rr, v, l, r, rt<<1|1);}int main(){ char c; int a, b, v; cin >> n >> m; build(1, n, 1); for(int i=1; i<=n; i++) { scanf("%d", &v); update(i, i, v, 1, n, 1); } for(int i=1; i<=m; i++) { scanf("%c", &c); if(c == 'Q') { scanf("%d%d", &a, &b); int ans = query(a, b, 1, n, 1); printf("%d\n", ans); } else { scanf("%d%d%d", &a, &b, &v); update(a, b, v, 1, n, 1); } } return 0;}*//*10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4*//*455915Process returned 0 (0x0) execution time : 4.933 sPress any key to continue.*/#include <stdio.h>#include<iostream>using namespace std;#define N 111111#define LL long long#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1LL add[N<<2];LL sum[N<<2];void PushUP(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void PushDown(int rt,int m){ if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=(m-(m>>1))*add[rt]; sum[rt<<1|1]+=(m>>1)*add[rt]; add[rt]=0; }}void Build(int l,int r,int rt){ add[rt]=0; if(l==r) { scanf("%I64d",&sum[rt]); return; } int m=(l+r)>>1; Build(lson); Build(rson); PushUP(rt);}void Update(int L,int R,int c,int l,int r,int rt){ if(L<=l&&R>=r) { add[rt]+=c; sum[rt]+=(LL)c*(r-l+1); return; } PushDown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) Update(L,R,c,lson); if(R>m) Update(L,R,c,rson); PushUP(rt);}LL Query(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) return sum[rt]; PushDown(rt,r-l+1); int m=(l+r)>>1; LL ret=0; if(L<=m) ret+=Query(L,R,lson); if(R>m) ret+=Query(L,R,rson); return ret;}int main(){ scanf("%d%d",&n,&m); Build(1,n,1); while(m--) { char s[5]; int a,b,c; scanf("%s",s); if(s[0]=='Q') { scanf("%d%d",&a,&b); printf("%I64d\n",Query(a,b,1,n,1)); } else { scanf("%d%d%d",&a,&b,&c); Update(a,b,c,1,n,1); } } return 0;}
0 0
- 一些线段树的题目
- 线段树的题目
- 线段树的题目
- 线段树的经典题目及题解
- 线段树题目
- 线段树题目集
- 线段树题目总结
- 线段树题目分类
- 线段树题目
- 题目(线段树)
- 线段树题目
- 线段树题目整合
- 线段树题目整合
- 划分树,线段树的一些文章
- 线段树的运用 以及poj上的经典题目
- NotOnlySuccess 大牛的线段树的题目
- Poj3667 ( 线段树题目,不过用Splay做的 )
- 几道线段树题目
- Python入门教程一:Hello World
- Linux Mint (专题二:软件包管理)
- Centos7安装redis
- 分离字符串
- Android中的线程、进程和消息处理机制
- 一些线段树的题目
- Unity中的Socket通信(多个客户端的异步通信)
- 【并行计算-CUDA开发】CUDA shared memory bank 冲突
- java学习 银行管理系统
- 关于JQuery中DOM的插入方法【主要常用】
- Servlets & JSP基础篇之开始学习
- CXF与SRPING整合经历小结
- 字典序问题
- Ubuntu 远程连接 Linux远程连接