uoj#25. 【IOI2014】Wall

题目
写的第一道交互题,编译要加这么一句话:

g++ -o wall grader.cpp wall.cpp

其他的,就是裸的线段树了

#include "wall.h"
const int N=2000002;
#define mid ((l+r)>>1)
int mx[N<<2],mn[N<<2];
void build(int t,int l,int r){
	if (l==r) return;
	mn[t]=1e9;
	build(t<<1,l,mid);
	build(t<<1|1,mid+1,r);
}
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
void up(int t,int h,bool f){
	mx[t]=(f?min(mx[t],h):max(mx[t],h));
	mn[t]=(f?min(mn[t],h):max(mn[t],h));
}
void down(int t){
	up(t<<1,mx[t],0),up(t<<1|1,mx[t],0),mx[t]=0;
	up(t<<1,mn[t],1),up(t<<1|1,mn[t],1),mn[t]=1e9;
}
void change(int t,int l,int r,int x,int y,int v,bool f){
	if (x<=l && r<=y){
		up(t,v,f);
		return;
	}
	down(t);
	if (x<=mid) change(t<<1,l,mid,x,y,v,f);
	if (mid<y) change(t<<1|1,mid+1,r,x,y,v,f);
}
void write(int t,int l,int r,int *ans){
	if (l==r){
		ans[l-1]=mx[t];
		return;
	}
	down(t);
	write(t<<1,l,mid,ans);
	write(t<<1|1,mid+1,r,ans);
}
void buildWall(int n,int k,int op[],int l[],int r[],int h[],int ans[]){
	build(1,1,n);
	for (int i=0;i<k;i++) change(1,1,n,l[i]+1,r[i]+1,h[i],op[i]-1);
	write(1,1,n,ans);
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/84997020