【题目链接】 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