1. 程式人生 > >BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)

BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)

line -- pre sin ems 表示 clas 幫助 n-1

5194: [Usaco2018 Feb]Snow Boots

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 81 Solved: 61
[Submit][Status][Discuss]

Description

到冬天了,這意味著下雪了!從農舍到牛棚的路上有N塊地磚,方便起見編號為1…N,第i塊地磚上積了fi英尺的雪。在Farmer John的農舍的地窖中,總共有B雙靴子,編號為1…B。其中某些比另一些結實,某些比另一些輕便。具體地說,第i雙靴子能夠讓FJ在至多si英尺深的積雪中行走,能夠讓FJ每步至多前進di。Farmer John從1號地磚出發,他必須到達N號地磚才能叫醒奶牛們。1號地磚在農舍的屋檐下,N號地磚在牛棚的屋檐下,所以這兩塊地磚都沒有積雪。幫助Farmer John求出哪些靴子可以幫助他走完這段艱辛的路程。

Input

第一行包含兩個空格分隔的整數N和B(1≤N,B≤10^5)。

第二行包含N個空格分隔的整數;第i個整數為fi,即i號地磚的積雪深度(0≤fi≤10^9)。輸入保證f1=fN=0 下面B行,每行包含兩個空格分隔的整數。第i+2行的第一個數為si,表示第i雙靴子能夠承受的最大積雪深度。 第i+2行的第二個數為di,表示第i雙靴子的最大步長。輸入保證0≤si≤10^9以及1≤di≤N-1

Output

輸出包含N行

第i行包含一個整數:如果Farmer John能夠穿著第i雙靴子從1號地磚走到N號地磚,為1,否則為0

Sample Input

8 7
0 3 8 5 6 9 0 0
0 5
0 6
6 2
8 1
10 1
5 3
150 7

Sample Output

0
1
1
0
1
1
1

題目鏈接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=5194

Solution

  這種題感覺已經是套路了。。。

  反正就是兩種思路。。。  

  1.只走小於D的雪堆需要走的最長的一步。。

  2.最長的一步為不超過S的需要走的最大的雪堆。。

  這裏只寫了第1種的。。。第2種應該也能寫吧。。

  先將所有雪堆從小到大排序,鞋子也要排序。。

  對於某一種鞋子的di,求一下需要多大的si。。。就是求一下能走的雪堆的最大間隔。。

  每次放入一個新的雪堆只會改變幾個間隔大小。。

  所以只需要用set維護一下集合內的前驅和後驅,然後用兩個優先隊列維護一下帶刪除的集合內最大值。。

  然後就做完了。。。

代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define pa pair<LL,LL>
#define LL long long
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
inline void Out(int a){
    if(a>9) Out(a/10);
    putchar(a%10+‘0‘);
}
const LL inf=1e9+10;
const LL mod=1e9+7;
const int N=1e5+50;
int n,m,cnt=1;
 
struct date{
    int v,id;
}f[N];
bool cmpd(date A,date B){
    return A.v<B.v;
}
struct xie{
    int s,d,id;
}a[N];
bool cmpx(xie A,xie B){
    return A.s<B.s;
}
set<int> S;
priority_queue<int> P,Q;
void del(int x){
    Q.push(x);
    while(Q.empty()==0&&P.empty()==0&&Q.top()==P.top()){
        P.pop();Q.pop();
    }
}
void add(int x){
    P.push(x);
}
int ans[N];
int main(){
    n=read();m=read();
    if(n==1||n==2){
        for(int i=1;i<=m;++i){
            putchar(‘1‘);puts("");
        }
        return 0;
    }
    f[1].v=read();
    for(int i=2;i<n;++i){
        f[i].v=read();f[i].id=i;
    }
    f[n].v=read();
    f[1]=f[n-1];
    n=n-2;
    for(int i=1;i<=m;++i){
        a[i].s=read();a[i].d=read();a[i].id=i;
    }
    sort(f+1,f+1+n,cmpd);
    sort(a+1,a+1+m,cmpx);
    P.push(n+1);
    set<int>::iterator L,R;
    int l,r;
    S.insert(1);S.insert(n+2);
    for(int i=1,j=1;j<=m;++j){
        while(i<=n&&f[i].v<=a[j].s){
            R=S.lower_bound(f[i].id);
            L=R;--L;
            l=*L;r=*R;
            del(r-l);
            add(f[i].id-l);
            add(r-f[i].id);
            S.insert(f[i].id);
            ++i;
        }
        if(P.top()<=a[j].d) ans[a[j].id]=1;
        else ans[a[j].id]=0;
    }
    for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
    return 0;
}

  

  

This passage is made by Iscream-2001.

BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)