Minimizing maximizer(POJ 1769)】的更多相关文章

原题如下: Minimizing maximizer Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 5104   Accepted: 2066 Description The company Chris Ltd. is preparing a new sorting hardware called Maximizer. Maximizer has n inputs numbered from 1 to n. Each i…
[题目链接] http://poj.org/problem?id=1769 [题目大意] 给出一些排序器,能够将区间li到ri进行排序,排序器按一定顺序摆放 问在排序器顺序不变的情况下,一定能够将最大值交换到最后一位至少需要保留几个排序器 [题解] 我们发现,对于每个排序器,dp[ri]=min(dp[ri],min(dp[li]~dp[ri-1])+1) 我们用线段树对dp值进行最小值维护,顺序更新即可. [代码] #include <cstdio> #include <algorit…
题目链接 给出m个区间, 按区间给出的顺序, 求出覆盖$ [1, n] $ 至少需要多少个区间. 如果先给出[10, 20], 在给出[1, 10], 那么相当于[10, 20]这一段没有被覆盖. 令dp[i]表示覆盖[1, i]需要的区间数量. 那么有状态转移方程dp[i] = $ min[dp[i], dp[j] (s_k <= j < t_k)] + 1 $ 然后求 \([s_k, t_k]\) 的最小值可以用线段树来求. 复杂度 $ m\log{n} $ 感觉这个题的难度在于理解题意.…
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~dp[e[i]-1]}+1 注意修改只需要修改右端点,不需要修改一段 所以线段树查询区间最小值即可 */ #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #defin…
dp[i = 前i中sorter][j = 将min移动到j位置] = 最短的sorter序列. 对于sorteri只会更新它右边端点r的位置,因此可以把数组改成一维的,dp[r] = min(dp[r],dp[j]+1), l≤j<r. 不是滑窗,单调队列用用不了,但是可以用线段树去维护这个最小值. /********************************************************* * ------------------ * * author Abyssal…
题目大概就是要,给一个由若干区间[Si,Ti]组成的序列,求最小长度的子序列,使这个子序列覆盖1到n这n个点. dp[i]表示从第0个到第i个区间且使用第i个区间,覆盖1到Ti所需的最少长度 对于Si=1的i区间dp值就是1了,要求的答案就是所有Ti=n的最小的dp值 转移就是,dp[i]=dp[j]+1,Si<=Tj<=Ti.不过枚举转移这样显然会T的,可以转化成RMQ来提升效率,用线段树成段更新成段查询即可,即维护1...n的覆盖所需区间的最小值,这样时间复杂度O(mlogn). #inc…
题意: 有n个数,m个排序器,每个排序器可以把区间ai到bi的数从小到大排序.这m个排序器的输出就是m个排序之后的第n个数. 现在发现有些排序器是多余的.问至少需要多少个排序器可以使得输出不变.排序器的顺序不可以改变. 思路: 这题并没有说这些排序器可以覆盖1到n的所有区间... 假设可以,那么就是求最少的区间可以覆盖1到n. 用dp[i]表示覆盖第i个数需要的最少区间数,dp[i] = min(dp[i],dp[s] + 1) ai <= s <= b[i]. 如果单纯的枚举ai到bi,那么…
题目大意:给一个长度为n的区间,m条线段序列,找出这个序列的一个最短子序列,使得区间完全被覆盖. 题目分析:这道题不难想,定义状态dp(i)表示用前 i 条线段覆盖区间1~第 i 线段的右端点需要的最少数目,状态转移方程为dp(i)=min(dp(j))+1.其中第 j 条线段与第 i 条线段有交集.很显然,这个状态转移方程跟LIS问题的状态转移方程几乎一样,时间复杂度为O(m*m).起初,我想套用LIS问题的O(nlogn)的那种解法,得到两个WA之后才感觉到很难套用成功,理论上完全没问题,但…
传送门 题目大意 给你m个机器,n个数,每个机器可以给n个数的某一段排序,求最少使用几个机器,保证可以把这个n个数排好序 分析 我们可以想到dpij表示考虑前i个机器让最大的数到达点j至少需要使用多少个机器,转移为: dp[i][j]=min{dp[i][j],dp[i-1][j'](s[i]<=j'<=t[i])}. 我们发现可以去掉一维变为 dp[j]=min{dp[j],dp[j'](s[i]<=j'<=t[i])}. 到了这里我们便不难想到如何用线段树优化了,详见代码. 代…
题意: 最少需要多少个区间能完全覆盖整个区间[1,n] 分析: dp[i]表示覆盖[1,i]最少需要的区间数,对于区间[a,b],dp[b]=min(dp[a...b-1])+1;用线段树来维护区间最小值. #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdi…