hdu 5233 离散化 **
题意:很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来。
Jack会射击多次,他想知道每次射击哪只鸟儿会落下来。
怎么看都是以前出过的题啊,但还是不会
明早起来拍一遍
2015-05-26:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 #include<set> 9 using namespace std; 10 #define MOD 1000000007 11 const int INF=0x3f3f3f3f; 12 const double eps=1e-5; 13 typedef long long ll; 14 #define cl(a) memset(a,0,sizeof(a)) 15 #define ts printf("*****\n"); 16 const int MAXN=100005; 17 int a[MAXN],b[MAXN]; 18 int n,m,tt; 19 set<int> vc[MAXN]; 20 int main() 21 { 22 int i,j,k; 23 #ifndef ONLINE_JUDGE 24 freopen("1.in","r",stdin); 25 #endif 26 while(scanf("%d%d",&n,&m)!=EOF) 27 { 28 for(i=0;i<n;i++) 29 { 30 scanf("%d",a+i); 31 b[i]=a[i]; 32 } 33 sort(b,b+n); 34 int num=unique(b,b+n)-b-1; 35 for(i=0;i<=num;++i) 36 vc[i].clear(); 37 for(i=0;i<n;i++) 38 { 39 vc[lower_bound(b,b+num,a[i])-b].insert(i); //vc[高度]=编号,高度是离散化之后的高度 40 } 41 int H; 42 for(i=0;i<m;i++) 43 { 44 scanf("%d",&H); 45 int HH=lower_bound(b,b+num,H)-b; 46 if(b[HH]!=H||vc[HH].empty()) 47 { 48 printf("-1\n"); 49 } 50 else 51 { 52 printf("%d\n",*vc[HH].begin()+1); 53 vc[HH].erase(vc[HH].begin()); 54 } 55 } 56 } 57 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<set> 9 #define maxn 100010 10 using namespace std; 11 typedef long long LL; 12 typedef unsigned long long ULL; 13 set<int> bird[maxn]; 14 int n,m,tn,h[maxn]; 15 int tmp[maxn]; 16 void read() 17 { 18 for(int i=1;i<=n;++i) 19 { 20 scanf("%d",h+i); 21 tmp[i]=h[i]; 22 } 23 sort(tmp+1,tmp+n+1); 24 tn=unique(tmp+1,tmp+n+1)-tmp-1; 25 for(int i=1;i<=tn;++i) 26 bird[i].clear(); 27 for(int i=1;i<=n;++i) 28 bird[lower_bound(tmp+1,tmp+tn+1,h[i])-tmp].insert(i); 29 } 30 void Query() 31 { 32 for(int i=1,x;i<=m;++i) 33 { 34 scanf("%d",&x); 35 int id=lower_bound(tmp+1,tmp+tn+1,x)-tmp; 36 if(tmp[id]!=x) //没找到 37 printf("-1\n"); 38 else if(bird[id].empty()) 39 printf("-1\n"); 40 else 41 { 42 printf("%d\n",*bird[id].begin()); 43 bird[id].erase(bird[id].begin()); 44 } 45 } 46 } 47 int main() 48 { 49 while(cin>>n>>m) 50 { 51 read(); 52 Query(); 53 } 54 return 0; 55 }