POJ 1769 Minimizing maximizer(DP+zkw线段树)

Posted forever97‘s blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1769 Minimizing maximizer(DP+zkw线段树)相关的知识,希望对你有一定的参考价值。

 

【题目链接】 http://poj.org/problem?id=1769

 

【题目大意】

  给出一些排序器,能够将区间li到ri进行排序,排序器按一定顺序摆放
  问在排序器顺序不变的情况下,一定能够将最大值交换到最后一位至少需要保留几个排序器

 

【题解】

  我们发现,对于每个排序器,dp[ri]=min(dp[ri],min(dp[li]~dp[ri-1])+1)
  我们用线段树对dp值进行最小值维护,顺序更新即可。

 

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
const int N=50010;
int T[N*4],n,m,M,l,r,x,y;
int main(){
    while(~scanf("%d%d",&n,&m)){
        for(M=1;M<n;M<<=1);
        fill(T,T+M+n+1,INT_MAX/2);
        T[M+1]=0;
        while(m--){
            scanf("%d%d",&l,&r);
            if(l<r){
                int t=INT_MAX/2;
                x=l+M-1; y=r+M;
                while(x^y^1>0){
                    if(~x&1)t=min(t,T[x+1]); 
                    if(y&1)t=min(t,T[y-1]); 
                    x>>=1;y>>=1;
                }T[M+r]=min(T[M+r],t+1);
                for(x=(M+r)/2;x;x/=2)T[x]=min(T[x<<1],T[(x<<1)^1]);
            }
        }printf("%d\n",T[n+M]);
    }return 0;
}

以上是关于POJ 1769 Minimizing maximizer(DP+zkw线段树)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1769 Minimizing maximizer ( 线段树 && DP )

B. Ania and Minimizing 1000 / 贪心

E. Minimizing Difference

Codeforces 1244E. Minimizing Difference

CF1076A Minimizing the String

B. Ania and Minimizing (Codeforces Round #588 (Div. 2) )