bzoj4364: [IOI2014]wall砖墙

线段树打标记的好(luo)题

打打标记,记得下移

= =听说2000000是用来卡线段树的

= =怎么办呢,,,

= =打个读入优化看看能不能卡过去吧

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=;
int n,m,i,opt,l,r,x;
int mx1[M*],mx2[M*];
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void pushdown(int p)
{
int l=p<<,r=p<<^;
if (mx2[p]>mx1[l])mx1[l]=mx2[l]=mx2[p];
else if (mx2[p]>mx2[l])mx2[l]=mx2[p];
if (mx2[p]>mx1[r])mx1[r]=mx2[r]=mx2[p];
else if (mx2[p]>mx2[r])mx2[r]=mx2[p];
if (mx1[p]<mx2[l])mx1[l]=mx2[l]=mx1[p];
else if (mx1[p]<mx1[l])mx1[l]=mx1[p];
if (mx1[p]<mx2[r])mx1[r]=mx2[r]=mx1[p];
else if (mx1[p]<mx1[r])mx1[r]=mx1[p];
}
void pushup(int p)
{
int l=p<<,r=p<<^;
mx1[p]=max(mx1[l],mx1[r]);
mx2[p]=min(mx2[l],mx2[r]);
}
void update1(int x,int y,int l,int r,int p,int t)
{
if (x==l&&y==r){
mx1[p]=max(mx1[p],t);
mx2[p]=max(mx2[p],t);
return;
}
int mid=l+r>>;
pushdown(p);
if (y<=mid)update1(x,y,l,mid,p<<,t);
else if (x>mid)update1(x,y,mid+,r,p<<^,t);
else update1(x,mid,l,mid,p<<,t),update1(mid+,y,mid+,r,p<<^,t);
pushup(p);
}
void update2(int x,int y,int l,int r,int p,int t)
{
if (x==l&&y==r){
mx1[p]=min(mx1[p],t);
mx2[p]=min(mx2[p],t);
return;
}
int mid=l+r>>;
pushdown(p);
if (y<=mid)update2(x,y,l,mid,p<<,t);
else if (x>mid)update2(x,y,mid+,r,p<<^,t);
else update2(x,mid,l,mid,p<<,t),update2(mid+,y,mid+,r,p<<^,t);
pushup(p);
}
void build(int l,int r,int p)
{
if (l==r){
printf("%d\n",mx1[p]);
return;
}
int mid=l+r>>;
pushdown(p);
build(l,mid,p<<);
build(mid+,r,p<<^);
}
int main()
{
n=read(),m=read();
for (i=;i<=m;i++){
opt=read();
l=read(),r=read(),x=read();
l++;r++;
if (opt==)
update1(l,r,,n,,x);
else
update2(l,r,,n,,x);
}
}
build(,n,);
}

又臭又长+1

两个更新可以合在一起的,但是懒得改了

上一篇:CY-122B-P Photoelectric Sensor 光电传感器


下一篇:js设置自动刷新