题:

  OwO http://acm.hdu.edu.cn/showproblem.php?pid=6049

  (2017 Multi-University Training Contest - Team 2 - 1005)  

解:

  先预处理

  mn[i][j]记录区间最小值,mx[i][j]记录区间最大值,则如果mx-mn+1和区间数字数量相同则该区间可以被归到一个小段

  f[i][j]记录(i,j)段最多可以被分成几个小段,sav[i]记录从i开始的上次的可行区间的右端点

  然后就可以进行求解了

  设要交换的区间为seg_a,seg_b。

  一开始先求seg_a的左右端点即i和j,则seg_a必须满足可行,即f[i][j]!=0,同时必须满足,seg_a为最左边的段或者seg_a左边的段包括了(1,i-1)的数字

  对于每个可行的seg_a,设k为seg_a中的最大值,则

  1.如果k==n的话,那么seg_b是最右边的段

  2.否则seg_b右边的段为seg(k+1,n),且必须包括(k+1,n)中的所有数

  然后枚举seg_b的左端点t使seg_b合法,又必须满足mn[t][k]==i,才能保证seg_a和seg_b交换后整个数列从1~n递增

  (思路来自解读标程)

  (貌似是有更优解的)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath> using namespace std; const int M=3044; int n;
int s[M];
int f[M][M],mn[M][M],mx[M][M];
int sav[M],ans; void init()
{
memset(f,0,sizeof(f));
int i,j,k;
for(i=1;i<=n;i++)
{
sav[i]=i;
f[i][i]=1;
mn[i][i]=mx[i][i]=s[i];
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
mx[i][j]=max(mx[i][j-1],s[j]);
mn[i][j]=min(mn[i][j-1],s[j]);
}
for(i=2;i<=n;i++)
for(j=1;j+i-1<=n;j++)
{
k=j+i-1;
if(mx[j][k]-mn[j][k]+1!=k-j+1)
f[j][k]=0;
else
{
if(mn[j][k]<mn[j][sav[j]])
f[j][k]=1;
else
f[j][k]=f[j][sav[j]]+f[sav[j]+1][k];
sav[j]=k;
}
}
} void solve()
{
ans=max(1,f[1][n]);
int i,j,k,t,tmp;
//swap (i,j) , (t,k)
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
if(f[i][j] && (i==1 || (f[1][i-1] && mn[1][i-1]==1))) //be sure the first seg is start from 1 or the seg(i,j)
{
k=mx[i][j];
if(k==n || (f[k+1][n] && mx[k+1][n]==n))
for(t=j+1;t<=k;t++)
if(mn[t][k]==i && f[t][k])
ans=max(ans,f[1][i-1]+1/*seg[i][j]]*/+f[j+1][t-1]+1/*seg[t][k]*/+f[k+1][n]);
}
} int main()
{
int T,i,j;
cin>>T;
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
init();
solve();
cout<<ans<<endl;
}
return 0;
}

  

hdu 6049 Sdjpx Is Happy的更多相关文章

  1. HDU 6049 - Sdjpx Is Happy | 2017 Multi-University Training Contest 2

    思路来源于 FXXL - - 一个比较奇怪的地方就是第三步可以不做,也就是ans至少为1,听说场内有提问的,然后 admin 说可以不做- - (wa的我心烦) /* HDU 6049 - Sdjpx ...

  2. HDU 6049 17多校2 Sdjpx Is Happy(思维题difficult)

    Problem Description Sdjpx is a powful man,he controls a big country.There are n soldiers numbered 1~ ...

  3. 2017 Multi-University Training Contest - 2

    HDU 6045 #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #in ...

  4. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  7. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. centos git clone 报错 fatal: HTTP request failed 解决办法

    git clone报错提示 git clone https://github.com/xxxx.git Initialized empty Git repository in /root/xxxx/. ...

  2. AMD平台如何使用Android Studio官方的高性能模拟器

    当我第一次接触Android Studio的时候,脑子里第一个想法是:tm不就是IDEA么??以为自己会用的贼六,结果其他小朋友的模拟器都打开了,才发现自己运行不了模拟器.一度以为是我哪里操作错了.于 ...

  3. python的文件读写操作

    文件读写 本文转自廖雪峰老师的教程https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640 读写文件是最常见的IO操作.Py ...

  4. Python库的优雅安装及PyCharm虚拟环境配置

    一.安装python库 安装python库有几种方式: 1. 使用pip命令行,如:pip install Pillow 2. 在pycharm中安装 3. 使用Anaconda批量安装常用模块 在使 ...

  5. 使用python操作kafka

    使用python操作kafka目前比较常用的库是kafka-python库 安装kafka-python pip3 install kafka-python 生产者 producer_test.py ...

  6. isEmpty 和 isBlank 区别

    isEmpty 和 isBlank 区别 org.apache.commons.lang.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(Stri ...

  7. Spring 的 AOP 概述和底层实现

    Spring 的 AOP 概述和底层实现 1. 什么是 AOP AOP (Aspect Oriented Programing),即面向切面编程 AOP 采取横向抽取机制,取代了传统纵向继承体系重复性 ...

  8. 【weixin】微信支付简介

    一.微信支付模式 1.付款码支付 付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线下面对面收银的场景. 2.Native支付 Native支付是商户系 ...

  9. vue页面中图片不显示解决

    在做新版组态界面的时候,用vue框架实现,在配置页面图片的时候发现有一张图片明明页面输入的路径是对的可是图片就是不显示出来 现象: network页面资源也不报错,而且状态码竟然还是200,点prev ...

  10. JS可以做很多事情

    JS可以做很多事情,例如: 使用JavaScript可以做很多事情,使网页更具互动性,并为网站用户提供更好.更令人兴奋的体验.JavaScript允许您创建一个活动的用户界面,当用户在页面之间导航时, ...