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;
}
时间: 2024-12-09 08:05:10

POJ 1769 Minimizing maximizer(DP+zkw线段树)的相关文章

poj 1769 Minimizing maximizer(dp+线段树)

题意:数列长度为n,m次操作(n<=50000,m<=500000),每次操作将区间[si,ti]从小到大排序,求至少使用几次操作使数列的最后一个数与经过所有操作后相等: 思路:选取最少的操作得到最优解,一般采用dp; 假设原数列的第1个数为最大值,dp[j]表示最大值移动到第j个位置需要至少的操作数: 初始令dp[1]=0,dp[j]=inf(j>1); 对于每个i,有dp[ti]=min(dp[ti],min(dp[j](si<=j<=ti))+1); 若复杂度为O(nm

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

题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析 :  暴力枚举所有可能的组合可以达到 O( m^m ) ,完全不行 这里考虑动态规划解法 定义 dp[i][j] : 到第 i 个为止,完全覆盖点(即从 1~这个点都能保证被覆盖)到达第 j 个位置所需的最少子区间 则初始化为 dp[0][2~n] = INF.dp[0][1] = 0 假设当前第 i 个子区间用 ( si,ti ) 表示 则状态转移方程为 (

POJ 1769 Minimizing maximizer

dp[i = 前i中sorter][j = 将min移动到j位置] = 最短的sorter序列. 对于sorteri只会更新它右边端点r的位置,因此可以把数组改成一维的,dp[r] = min(dp[r],dp[j]+1), l≤j<r. 不是滑窗,单调队列用用不了,但是可以用线段树去维护这个最小值. /********************************************************* * ------------------ * * author Abyssal

【POJ 2750】 Potted Flower(线段树套dp)

[POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4566   Accepted: 1739 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrou

【POJ3468】【zkw线段树】A Simple Problem with Integers

Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval. In

POJ - 2528 - Mayor&#39;s posters 【线段树+离散化+补点】

http://poj.org/problem?id=2528 #include <cstdio> #include <iostream> #include <set> #include <cstring> #include <string> #define left rt<<1 #define right rt<<1|1 using namespace std; const int MAXN = 32768 + 5; in

POJ 2528 Mayor&#39;s posters (hash+线段树成段更新)

题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且<=1QW.后贴的海报若与先贴的海报有交集,后贴的海报必定会全部或局部覆盖先贴的海报.现在给出每张海报所贴的位置(左端位置和右端位置),问张贴完N张海报后,还能看见多少张海报?(PS:看见一部分也算看到.) 思路:简单的成段更新,但是数据量是1千万,会MT,所以要区间压缩(离散化),保证覆盖的关系不变,离散化的时候有个易错的细节,poj数据水了,这个易错点引用h

poj 1151 Atlantis (离散化 + 扫描线 + 线段树)

题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 #define LL __int64 8 #define lson l, mid, 2*rt

【bzoj3685】普通van Emde Boas树 权值zkw线段树

原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html 题目描述 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当前最大值,若不存在输出-15 x  输出x的前驱,若不存在输出-16 x  输出x的后继,若不存在输出-17 x  若x存在,输出1,否则输出-1 输入 第一行给出n,m 表示出现数的范围和操作个数接下来m行给出操作n<=10^6,m<=2*10^6,