uoj#25. 【IOI2014】Wall
题目
 写的第一道交互题,编译要加这么一句话(代码在
    
     
      
       
        w
       
       
        a
       
       
        l
       
       
        l
       
       
        .
       
       
        c
       
       
        p
       
       
        p
       
      
      
       wall.cpp
      
     
    wall.cpp中):
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);
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号