标签:style blog http java color strong
3 5 5 2 4 3 3 3
1 2 1 3 -1
解题:线段树线段树线段树。。。。。。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 using namespace std; 11 const int maxn = 200010; 12 struct node { 13 int lt,rt,lmax,rmax; 14 } tree[maxn<<2]; 15 int h,w,n,ans; 16 void build(int lt,int rt,int v) { 17 tree[v].lt = lt; 18 tree[v].rt = rt; 19 if(lt == rt) { 20 tree[v].lmax = tree[v].rmax = w; 21 return; 22 } 23 int mid = (lt+rt)>>1; 24 build(lt,mid,v<<1); 25 build(mid+1,rt,v<<1|1); 26 tree[v].lmax = max(tree[v<<1].lmax,tree[v<<1].rmax); 27 tree[v].rmax = max(tree[v<<1|1].lmax,tree[v<<1|1].rmax); 28 } 29 void add(int val,int v) { 30 if(val > max(tree[v].lmax,tree[v].rmax)) { 31 ans = -1; 32 return; 33 } 34 if(tree[v].lt == tree[v].rt) { 35 if(tree[v].lmax >= val) { 36 ans = tree[v].lt; 37 tree[v].lmax -= val; 38 tree[v].rmax -= val; 39 } else ans = -1; 40 return; 41 } 42 if(val <= tree[v].lmax) add(val,v<<1); 43 else add(val,v<<1|1); 44 tree[v].lmax = max(tree[v<<1].lmax,tree[v<<1].rmax); 45 tree[v].rmax = max(tree[v<<1|1].lmax,tree[v<<1|1].rmax); 46 } 47 int main() { 48 int temp; 49 while(~scanf("%d %d %d",&h,&w,&n)) { 50 if(h > n) h = n; 51 build(1,h,1); 52 while(n--) { 53 scanf("%d",&temp); 54 ans = -1; 55 add(temp,1); 56 printf("%d\n",ans); 57 } 58 } 59 return 0; 60 }
标签:style blog http java color strong
原文地址:http://www.cnblogs.com/crackpotisback/p/3840513.html