11,07 практика сессии

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 \) оптимизированы расстояние примерно ОДВТ. из - за этого)

рекомендация

отwww.cnblogs.com/cooper233/p/11815483.html