您的位置:首页 > 其它

hdu 4107 Gangster

2012-05-03 16:12 337 查看
题意:给定区间,每次对一个区间加一个值,如果区间中某个节点的值大于等于P的话,则加的值乘二

做法:线段树,维护当前区间的最大值、最小值、标记值

代码基本上都是照着别人的敲的。

/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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: