码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-01-26 00:08:50      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:algorithm   ref   return   ring   logs   can   str   scanf   span   

 

【题目链接】 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线段树)

标签:algorithm   ref   return   ring   logs   can   str   scanf   span   

原文地址:http://www.cnblogs.com/forever97/p/poj1769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!