11.07 Упражнения
T1 Матрёшка
Лень перейти непосредственно к поверхности исходного заголовка серии
Вы открыли магазин по продаже русских кукол. Таким образом, вы заказали у производителей \ (N \) русской куклы, эти куклы пронумерованных \ (1 \) к \ (N \) , где первая \ (я \) матрешка является диаметр \ (R_i \) высота \ (h_i \) прямой ♂ цилиндр. Каждая матрешка может быть установлена только высокая и жесткий диаметр меньше , чем его матрешка. В то же время, пока условия будут удовлетворены, русские куклы могут быть вложены в несколько раз.
Однажды вы получили производитель вызовов, сказать вам , что вы запланировали \ (N \) куклы не могут быть сделаны сразу. Таким образом, только первая поставка диаметр больше или равен \ (А \) и высота меньше или равна \ (В \) все куклы. Вам нужно заранее организовать программу , чтобы сделать отправленную после несколько матрешки, нет минимального количества куклы одеяла.
Потому что производители часто делают большие новости, так что он будет меняться \ (A \) и \ (B \) значение, в общей сложности \ (Q \) раз, так что вам нужно для каждой пары () \ (A, B) \ выполнены нет помех между ответом, спросите.
Более подробная информация по этой теме лицо
На первый взгляд количество двумерной точки(На самом деле на wangdy старшего брата к впечатляющему количеству звезд), Затем ударил префикс и обслуживание. Discovery лопнуть. После тщательного рассмотрения, чтобы найти максимальные интервалы технического обслуживания (то есть статистическое максимальное количество матрешек может прийти в комплекте).
При слегка изменилась, раньше. На руке OJ, Т а.
Это должно Хорошо
Это только быстро читать ах
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
char *p1,*p2,buf[1<<20];
#define GC (p1==p2&&(p1=buf,p2=buf+fread(buf,1,1<<20,stdin),p1==p2)?0:(*(p1++)))
//#define GC getchar()
inline int in()
{
int ans;
char t,k;
while(((t=GC)!='-'&&(t>'9'||t<'0')));
k=(t=='-');
ans=k?0:(t-'0');
while((t=GC)>='0'&&t<='9')ans=ans*10+t-'0';
return k?-ans:ans;
}
struct node{
int r,h;
int id;
}g[500010],qu[500010];
inline int lowbit(int x){return x&(-x);}
int ans[500010];
int Hs[500010];
bool cmp1(node a,node b){
return a.h<b.h;
}
bool cmp2(node a,node b)
{
return a.r<b.r;
}
bool cmp(node a,node b)
{
if(a.r!=b.r){
return a.r>b.r;
}
return a.h<b.h;
}
int n,q;
int sum[500010];
int gs(int x)
{
int res=0;
for(;x;x-=lowbit(x)){
res=max(res,sum[x]);
}
return res;
}
void ins(int x,int k){
for(;x<=n+q;x+=lowbit(x)){
sum[x]=max(sum[x],k);
}
return;
}
int qh[500010],cnt;//改了半天发现两个东西都要离散化……
int main()
{
// freopen("matryoshka.in","r",stdin);
// freopen("matryoshka.out","w",stdout);
n=in();q=in();
int i,j;
for(i=1;i<=n;i++)
{
g[i].r=in();g[i].h=in();
qh[++cnt]=g[i].h;
}
for(i=1;i<=q;i++)
{
qu[i].r=in();qu[i].h=in();
qu[i].id=i;
qh[++cnt]=qu[i].h;
}
sort(qh+1,qh+cnt+1);
int cnth=0;
for(i=1;i<=cnt;i++){
if(qh[i]!=qh[i-1]){
Hs[++cnth]=qh[i];
}
}
sort(g+1,g+1+n,cmp);
sort(qu+1,qu+1+q,cmp);
j=1;
for(i=1;i<=q;i++)
{
while(g[j].r>=qu[i].r&&j<=n){
int v=lower_bound(Hs+1,Hs+cnth+1,g[j].h)-Hs;
ins(v,1+gs(v));
j+=1;
}
int p=lower_bound(Hs+1,Hs+cnth+1,qu[i].h)-Hs;
ans[qu[i].id]=gs(p);
}
for(i=1;i<=q;i++){
printf("%d\n",ans[i]);
}
return 0;
}
(Примечание: процедура запроса в операции в \ (H \) (т.е. \ (В \) ) дискретные значения , как представляется, \ (нижняя \ _bound \) в \ (верхний \ _bound \) оптимизированы расстояние примерно ОДВТ. из - за этого)