您的位置:首页 > 其它

线段树成段更新模板

2016-01-20 14:14 453 查看
#include <bits/stdc++.h>

struct Tree {
Tree *lc,*rc;
int l,r;
int v,lazy;
Tree(int l=0,int r=0)
:l(l),r(r),v(0),lazy(0) {}
void build() {
if (l == r) return ;
int mid = l+r>>1;
lc = new Tree(l,mid);
rc = new Tree(mid+1,r);
lc->build();
rc->build();
}
void modify(int x,int L,int R) {
if (L<=l && r<=R) {
v |= x;
lazy |= x;
return ;
}
if (R<l || r<L) return ;
down();
lc->modify(x,L,R);
rc->modify(x,L,R);
v = lc->v & rc->v;
}
void down() {
if (lazy == 0) return ;
lc->lazy |= lazy;
lc->v |= lazy;
rc->lazy |= lazy;
rc->v |= lazy;
lazy = 0;
}
int query(int L,int R) {
if (L<=l && r<=R) return v;
if (R<l || r<L) return (1ll<<31)-1;
down();
return lc->query(L,R) & rc->query(L,R);
}
void show() {
if (l == r) {
printf("%d ",v);
return ;
}
down();
lc->show();
rc->show();
}
};

const int N = 100000 + 5;
int n,m;
int L
,R
,Q
;

int main() {
scanf("%d%d",&n,&m);
Tree *tree = new Tree(1,n);
tree->build();
for (int i = 0; i < m; ++ i) {
scanf("%d%d%d",L+i,R+i,Q+i);
tree->modify(Q[i],L[i],R[i]);
}
for (int i = 0; i < m; ++ i) {
if (tree->query(L[i],R[i]) != Q[i]) {
puts("NO"); return 0;
}
}
puts("YES");
tree->show();
puts("");
return 0;
}


  by 铭神

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef __int64 ll;

const int MOD = (int)1e9+7;
const int N = 100000+5;

struct Segtree {
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
int node[N<<2], mark[N<<2];

void down(int rt) {
if(mark[rt]) {
mark[rt<<1] |= mark[rt];
mark[rt<<1|1] |= mark[rt];
node[rt<<1] |= mark[rt];
node[rt<<1|1] |= mark[rt];
mark[rt] = 0;
}
}

void up(int rt) {
node[rt] = node[rt<<1] & node[rt<<1|1];
}

void update(int rt, int l, int r, int L, int R, int x) {
if(L <= l && R >= r) {
mark[rt] |= x;
node[rt] |= x;
return ;
}
down(rt);
int mid = l+r>>1;
if(L <= mid)    update(lson, L, R, x);
if(R > mid) update(rson, L, R, x);
up(rt);
}

int query(int rt, int l, int r, int L, int R) {
if(L <= l && R >= r) return node[rt];
down(rt);
int mid = l+r>>1;
int ret1 = -1, ret2 = -1;
if(L <= mid) ret1 = query(lson, L, R);
if(R > mid  )ret2 = query(rson, L, R);
up(rt);
if(ret1 == -1)  return ret2;
if(ret2 == -1)  return ret1;
return ret1&ret2;
}
}tree;

int l
, r
, q
;

int main() {
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1;i <= m; i++) {
scanf("%d%d%d", &l[i], &r[i], &q[i]);
tree.update(1, 1, n, l[i], r[i], q[i]);
}
for(int i = 1;i <= m; i++) {
if(tree.query(1, 1, n, l[i], r[i]) != q[i])
return puts("NO") , 0;
}
puts("YES");
for(int i = 1;i <= n; i++)
printf("%d ", tree.query(1, 1, n, i, i));
puts("");
return 0;
}


  by 杰哥
http://codeforces.com/problemset/problem/482/B
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: