hdu 4107 Gangster
2012-05-03 16:12
337 查看
题意:给定区间,每次对一个区间加一个值,如果区间中某个节点的值大于等于P的话,则加的值乘二
做法:线段树,维护当前区间的最大值、最小值、标记值
代码基本上都是照着别人的敲的。
/article/2411689.html
做法:线段树,维护当前区间的最大值、最小值、标记值
代码基本上都是照着别人的敲的。
/article/2411689.html
#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <algorithm> #include <utility> #include <cstring> #include <fstream> #include <string> #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) using namespace std; const int MAXN=200005 ;//区间长度 const int MARK=-65535;//标记,必要时可以有多个 struct tnode { int mark,l,r;//mark=-65535 为未标记状态 int mid(){ return (l+r)/2;} int len(){ return (r-l);} bool in(int ll,int rr) { return l >= ll && r <= rr; } int min,max; //bool doubledamage; //自行添加特殊数据:{lmax,rmax,max,num...} }; //左闭右开区间 tnode node[MAXN<<2]; int size,p; void build(int f,int l,int r) { node[f].l=l; node[f].r=r; node[f].mark=0; node[f].min=node[f].max=0; if(node[f].len()==1) { //初始化单位元素; return; } int mid=node[f].mid(); build(f*2,l,mid); build(f*2+1,mid,r); } void pushdown(int t) { if( node[t].mark ) { //为什么不需要更新node[t].max,min?因为当max,min与mark同时更新 node[L(t)].mark += node[t].mark; node[L(t)].min += node[t].mark; node[L(t)].max += node[t].mark; node[R(t)].mark += node[t].mark; node[R(t)].min += node[t].mark; node[R(t)].max += node[t].mark; node[t].mark = 0; } } void modify(int f,int l,int r,int value) { if(node[f].in(l,r) ) { //修改value //根据value 更改标记 if(node[f].min>=p) { node[f].min+=2*value; node[f].max+=2*value; node[f].mark+=2*value; return ; } if(node[f].max<p) { node[f].min+=value; node[f].max+=value; node[f].mark+=value; return ; } } if(node[f].len()==1) return ; pushdown(f); //int mid=node[f].mid(); // if(r<node[L(f)].r) modify(L(f),l,r,value); // else if(l>=node[R(f)].l) modify(R(f),l,r,value); // else{ // modify(L(f),l,node[L(f)].r,value); // modify(R(f),node[R(f)].l,r,value); // } int mid = node[f].mid(); if( l < mid ) modify(L(f),l,r,value); if( r > mid ) modify(R(f),l,r,value); node[f].min=min(node[L(f)].min,node[R(f)].min); node[f].max=max(node[L(f)].max,node[R(f)].max); } void query(int f) { if(node[f].min==node[f].max) { for(int i=node[f].l;i<node[f].r;i++) printf(i == size-1 ? "%d\n" : "%d ", node[f].min); return ; } if(node[f].len()==1) return ; pushdown(f); query(L(f)); query(R(f)); } int main(int argc, char* argv[]) { int m, x, y, val; while( scanf("%d%d%d", &size, &m, &p)!=EOF ) { build(1, 0, size); while( m-- ) { scanf("%d%d%d", &x, &y, &val); modify(1, x-1, y, val); } query(1); } }
相关文章推荐
- hdu 4107 Gangster 线段树 成段更新 最后求每一位的值
- HDU 4107 Gangster(线段树 特殊懒惰标记)
- HDU-4107-Gangster
- hdu 4107 Gangster 线段树
- hdu 4107 Gangster (离线+打标记+树状数组)
- hdu 4107 Gangster
- hdu 4107 Gangster 线段数
- HDU 4107 Gangster
- HDU 4107 Gangster Segment Tree线段树
- HDU 4107 Gangster (线段树)
- hdu 4107 Gangster(区间更新)
- hdu_4107Gangster_线段树_区间修改
- 【HDU】4107 Gangster
- hdu 4107 Gangster
- HDU 4107 Gangster
- HDU 4107 Gangster Segment Tree线段树
- hdu 4107 Gangster(线段树,时间卡得很严)
- hdu 4107 Gangster 线段树 成段更新
- hdu 4107 Gangster(线段树,时间卡得很严)
- HDU 4107 Gangster