线段树维护区间最大/最小值 然后可以二分找到第一个大于等于/小于给定高/宽度的位置
1287数据有问题 暴力比线段树跑得都快。。
1279利用单调性二分也可以 代码就不贴了
51nod 1287
#include <bits/stdc++.h> using namespace std; struct node { int l; int r; int val; }; node tree[200010]; int ans[50010]; int n,q; void pushup(int cur) { tree[cur].val=max(tree[2*cur].val,tree[2*cur+1].val); return; } void build(int l,int r,int cur) { int m; tree[cur].l=l; tree[cur].r=r; if(l==r) { scanf("%d",&tree[cur].val); ans[l]=tree[cur].val; return; } m=(l+r)/2; build(l,m,2*cur); build(m+1,r,2*cur+1); pushup(cur); return; } int query(int val,int cur) { if(tree[cur].l==tree[cur].r) { if(val<=tree[cur].val) return tree[cur].l; else return -1; } if(val<=tree[2*cur].val) return query(val,2*cur); else return query(val,2*cur+1); } void update(int tar,int cur) { if(tree[cur].l==tree[cur].r) { tree[cur].val++; return; } if(tar<=tree[2*cur].r) update(tar,2*cur); else update(tar,2*cur+1); pushup(cur); return; } int main() { int i,h,p; scanf("%d%d",&n,&q); build(1,n,1); while(q--) { scanf("%d",&h); p=query(h,1); if(p>1) { update(p-1,1); ans[p-1]++; } } for(i=1;i<=n;i++) { printf("%d\n",ans[i]); } return 0; }
51nod 1279
#include <bits/stdc++.h> using namespace std; struct node { int l; int r; int val; }; node tree[200010]; int n,q; void pushup(int cur) { tree[cur].val=min(tree[2*cur].val,tree[2*cur+1].val); return; } void build(int l,int r,int cur) { int m; tree[cur].l=l; tree[cur].r=r; if(l==r) { if(l==n+1) tree[cur].val=0; else scanf("%d",&tree[cur].val); return; } m=(l+r)/2; build(l,m,2*cur); build(m+1,r,2*cur+1); pushup(cur); return; } int query(int val,int cur) { if(tree[cur].l==tree[cur].r) { return tree[cur].l; } if(val>tree[2*cur].val) return query(val,2*cur); else return query(val,2*cur+1); } void update(int tar,int cur) { if(tree[cur].l==tree[cur].r) { tree[cur].val=0; return; } if(tar<=tree[2*cur].r) update(tar,2*cur); else update(tar,2*cur+1); pushup(cur); return; } int main() { int i,w,p,ans,flag; scanf("%d%d",&n,&q); build(1,n+1,1); ans=0,flag=1; while(q--) { scanf("%d",&w); if(flag) { p=query(w,1); if(p==1) flag=0; else { ans++; update(p-1,1); } } } printf("%d\n",ans); return 0; }