1. 程式人生 > >BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛

BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛

view unique turn gif str fine pen operator open

n<=10000個人,第L個人最高,所有人最高高度H,r個關系表示Ai能看到Bi,也就是,Ai到Bi中間的人都比Ai和Bi矮且Bi不比Ai矮,求每個人最高的可能高度,保證有解。

不知道這個L是來搞笑還是幹嘛的

假設一開始所有人最高,一個關系就把Ai到Bi間的點做區間減1,最後單點查詢,差分下即可。

唯一的坑點是可能有重復描述,記得去個重!

技術分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<algorithm>
 5 //#include<assert.h>
6 #include<math.h> 7 //#include<iostream> 8 using namespace std; 9 10 int n,h,r; 11 #define maxn 10011 12 int cha[maxn]; 13 struct Mes 14 { 15 int x,y; 16 bool operator < (const Mes &b) const {return x<b.x || (x==b.x && y<b.y);} 17 bool operator == (const
Mes &b) const {return x==b.x && y==b.y;} 18 }mes[maxn]; 19 int main() 20 { 21 int x; 22 scanf("%d%d%d%d",&n,&x,&h,&r); 23 for (int i=1;i<=r;i++) 24 { 25 scanf("%d%d",&mes[i].x,&mes[i].y); 26 if (mes[i].x>mes[i].y) swap(mes[i].x,mes[i].y);
27 } 28 sort(mes+1,mes+1+r); 29 r=unique(mes+1,mes+1+r)-mes-1; 30 memset(cha,0,sizeof(cha)); 31 for (int i=1;i<=r;i++) cha[mes[i].x+1]--,cha[mes[i].y]++; 32 // for (int i=1;i<=n;i++) cout<<cha[i]<<‘ ‘;cout<<endl; 33 x=0;for (int i=1;i<=n;i++) x+=cha[i],printf("%d\n",h+x); 34 return 0; 35 }
View Code

BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛