zoukankan      html  css  js  c++  java
  • 【poj3263】 Tallest Cow

    http://poj.org/problem?id=3263 (题目链接)

    题意

      n头奶牛排成一排,最高的一头I身高H,给出R个条件(a,b),表示a,b之间的奶牛都要比a矮,b的身高大于等于a。求每头奶牛最高能有多高。

    Solution

      差分确实很方便,这样就省去了线段树或者树状数组,而且时间复杂度也少了个log。

      考虑对于每个条件(a,b),位于a,b之间的奶牛的身高最多也就是a-1,所以我们将区间[a-1,b-1]全部减去1,然后差分即可。

    细节

      注意会有重复,所以还要排个序去重。。幸好看了Discuss。

    代码

    // poj3263
    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define LL long long
    #define inf 2147483640
    #define Pi acos(-1.0)
    #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
    using namespace std;
    
    const int maxn=10010;
    struct data {int l,r;}t[maxn];
    int a[maxn];
    
    bool cmp(data a,data b) {
    	return a.l==b.l ? a.r<b.r : a.l<b.l;
    }
    int main() {
    	int n,I,H,r;
    	scanf("%d%d%d%d",&n,&I,&H,&r);
    	for (int i=1;i<=r;i++) scanf("%d%d",&t[i].l,&t[i].r);
    	sort(t+1,t+1+r,cmp);
    	int tot=0;
    	for (int i=1;i<=r;i++) {
    		if (t[tot].l==t[i].l && t[tot].r==t[i].r) continue;
    		t[++tot]=t[i];
    	}
    	r=tot;
    	for (int i=1;i<=r;i++) {
    		if (t[i].l<t[i].r-1) a[t[i].l+1]--,a[t[i].r]++;
    		else if (t[i].l>t[i].r+1) a[t[i].r+1]--,a[t[i].l]++;
    	}
    	int x=H;
    	for (int i=1;i<=n;i++) {
    		x+=a[i];
    		if (i==I) printf("%d
    ",H);
    		else printf("%d
    ",x);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Vue生命周期
    事件
    改变this指向
    全屏要素
    微信小程序
    编程心得
    设计模式-单例与实例化
    第五节课 课堂总结
    作业四 分支结构
    课堂总结
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/5942914.html
Copyright © 2011-2022 走看看