hdu3193(RMQ)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3193

转换成求价格在0到p的酒店中的最短距离。。。

p最大10000

当p为0时一定选

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 const int maxn=10010;
 7 struct node
 8 {
 9     int p,d;
10     bool operator< (const node&a) const {
11     if(p==a.p) return d<a.d;
12     return p<a.p;
13     }
14 }v[maxn],res[maxn];
15 int a[maxn];
16 int pmin[maxn][30];
17 void RMQ_INIT()
18 {
19     int k=log(maxn+0.0)/log(2.0);
20     for(int i=0;i<=maxn;i++) pmin[i][0]=a[i];
21     for(int j=1;j<=k;j++)
22         for(int i=0;i+(1<<j)-1<=maxn;i++)
23         pmin[i][j]=min(pmin[i][j-1],pmin[i+(1<<j-1)][j-1]);
24 }
25 int rmq(int x,int y)
26 {
27     int k=log(y*1.0-x+1)/log(2.0);
28     return min(pmin[x][k],pmin[y-(1<<k)+1][k]);
29 }
30 int main()
31 {
32     int n;
33     while(scanf("%d",&n)!=EOF)
34     {
35         int cnt=0;
36         for(int i=0;i<=maxn;i++) a[i]=0x3f3f3f3f;
37         for(int i=0;i<n;i++)
38         {
39             scanf("%d%d",&v[i].p,&v[i].d);
40             a[v[i].p]=min(a[v[i].p],v[i].d);
41         }
42         RMQ_INIT();
43         for(int i=0;i<n;i++)
44         {
45             if(v[i].p==0) res[cnt++]=v[i];  //至少价格不会有更低的,选中
46             else{
47                 int d=rmq(0,v[i].p-1);
48                 if(d>=v[i].d)  res[cnt++]=v[i]; //如果比它便宜的酒店中最短距离不比它小,选中
49             }
50         }
51         sort(res,res+cnt);
52         printf("%d
",cnt);
53         for(int i=0;i<cnt;i++)
54             printf("%d %d
",res[i].p,res[i].d);
55     }
56 }
原文地址:https://www.cnblogs.com/yijiull/p/6757431.html