zoukankan      html  css  js  c++  java
  • [Usaco2018 Feb]Snow Boots

    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


    首先把积雪按深度排序,然后按鞋子的承受能力排序。由于鞋子的承受能力越来越差,因此每次需要跨越的长度只会不减。这个用链表维护一下跨越的最长长度,细节看看代码吧。。。

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)	print(x/10);
    	putchar(x%10+'0');
    }
    const int N=1e5;
    struct S1{
    	int v,ID;
    	void insert(int i){v=read(),ID=i;}
    	bool operator <(const S1 &x)const{return v>x.v;}
    }A[N+10];
    struct S2{
    	int v,len,ID;
    	void insert(int i){v=read(),len=read(),ID=i;}
    	bool operator <(const S2 &x)const{return v>x.v;}
    }B[N+10];
    int Nxt[N+10],Pre[N+10];
    bool can[N+10];
    int main(){
    	int n=read(),m=read();
    	for (int i=1;i<=n;i++)	A[i].insert(i);
    	for (int i=1;i<=m;i++)	B[i].insert(i);
    	sort(A+1,A+1+n),sort(B+1,B+1+m);
    	for (int i=1;i<=n;i++)	Pre[Nxt[i-1]=i]=i-1;
    	int Max=1,tmp=1;
    	for (int i=1;i<=m;i++){
    		for (int j=tmp;j<=n;j++){
    			if (A[j].v<=B[i].v){
    				tmp=j;
    				break;
    			}
    			Nxt[Pre[A[j].ID]]=Nxt[A[j].ID];
    			Pre[Nxt[A[j].ID]]=Pre[A[j].ID];
    			Max=max(Max,Nxt[A[j].ID]-Pre[A[j].ID]);
    		}
    		can[B[i].ID]=Max<=B[i].len;
    	}
    	for (int i=1;i<=m;i++)	printf("%d
    ",can[i]);
    	return 0;
    }
    
  • 相关阅读:
    常见分布式锁的基本实现
    Xen安装部署和基本原理
    Android应用在不同版本间兼容性处理
    Android 在fragment中实现返回键单击提醒 双击退出
    Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
    Android 使用WebView浏览有声音或者视频的网页,关闭WebView之后,声音或者视频不停止的解决办法
    Android 自带Base64加密解密
    Android java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230
    Android 微信SDK图片分享(checkArgs fail, thumbData is invalid)
    Android之Glide获取图片Path和Glide获取图片Bitmap
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/9715634.html
Copyright © 2011-2022 走看看