线段树维护区间最大/最小值 然后可以二分找到第一个大于等于/小于给定高/宽度的位置
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;
}