HDU3193 - RMQ

题解思路:先按价格从小到大排序如果价格相等按距离从大到小排序因为这样可以保证之前的距离小于这个点不是价格相等的物品然后对距离进行RMQ算法每次就可以求出之前是否有没有小于距离如果有就不用加入这个点如果没有就别加入这个点用vector容器维护一下就好了,然后再对vector容器进行价格从小到大位置从小到大排序接着输出就可以了
题目链接

#include
#include
#include
#include
#include
using namespace std;
const int mx = 1e4+10;
int dp[mx][15];
struct node{
    int p,d;
    bool operator<(node a)const{
        if(a.p != p)    return p < a.p;
        return d > a.d;
    }
}a[mx];
int n;
vectorv;
bool cmp(node a,node b){
    if(a.p != b.p) return a.p < b.p;
    return a.d < b.d;
}
void st(){
    for(int i = 1; i <= n; i++)
        dp[i][0] = a[i].d;
    for(int j = 1; (1<int d = (1<for(int i = 1; i+d-1 <= n; i++)
            dp[i][j] = min(dp[i][j-1],dp[i+d/2][j-1]);
    }
}
int rmq(int l,int r){
    int k = 0;
    while((1<<(k+1)) <= r-l+1) k++;
    r = r-(1<1;
    return min(dp[l][k],dp[r][k]);
}
int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i = 1; i <= n; i++)
            scanf("%d%d",&a[i].p,&a[i].d);
        sort(a+1,a+n+1);
        v.clear();
        st();
        for(int i = 1; i <= n; i++)
            if(rmq(1,i) >= a[i].d)
                v.push_back(a[i]);
        sort(v.begin(),v.end(),cmp);
        int len = v.size();
        printf("%d\n",len);
        for(int i = 0; i < len; i++)
            printf("%d %d\n",v[i].p,v[i].d);
    }
    return 0;
}

你可能感兴趣的:(RMQ算法)