description


analysis

  • 可以先用前缀和把原串不调整的方案数先求出来

  • 对于一种翻转,肯定是把\([i..a[i]]\)或\([a[i]..i]\)这段区间翻转

  • 也可以看做是以\({i+a[i]}\over 2\)这个点为翻转中心来翻转区间

  • 于是把所有\(n\)个翻转中心搞出来,用\(vector\)存下翻转长度

  • 对于每个翻转中心点,把翻转长度排一下序,从小到大做

  • 由于当前长度翻转只会影响一个点从不合法点变成合法点,所以每次方案递增

  • 左右端点\([l,r]\),每次\(l\)变小\(r\)变大,方案数递增,然后加上该区间以外的方案来更新答案

  • 可以说是比较巧妙的思路了


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 100005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll a[MAXN],sum[MAXN],pos[MAXN];
vector<ll>v[MAXN<<1];
ll n,ans; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll get(ll x,ll y){return sum[y]-sum[x-1];}
int main()
{
freopen("rotate.in","r",stdin);
freopen("rotate.out","w",stdout);
n=read();
fo(i,1,n)pos[a[i]=read()]=i,sum[i]=sum[i-1]+(a[i]==i);
fo(i,1,n)v[i+pos[i]].push_back(abs(i-pos[i])+1);
ans=sum[n];
fo(i,1,n<<1)
{
if (v[i].size()==0)continue;
ll mid=i/2,cnt=0;
sort(v[i].begin(),v[i].end());
fo(j,0,v[i].size()-1)
{
ll len=v[i][j],l,r;
if (i%2==0)l=mid-len/2,r=mid+len/2;
else l=mid-len/2+1,r=mid+len/2;
++cnt;
ans=max(ans,get(1,l-1)+cnt+get(r+1,n));
}
}
printf("%lld\n",ans);
return 0;
}

【JZOJ6288】旋转子段的更多相关文章

  1. 8.7 NOIP模拟测试14 旋转子段+走格子+ 柱状图

    T1 旋转子段 30% 暴力枚举起点和长度,暴力判断,o(n3)  不知道为什么我拿了40分... 60% 每一个点都有一个固定的旋转中心可以转成固定点,枚举旋转点和长度. 100% 用一个vecto ...

  2. [CSP-S模拟测试]:旋转子段(数学)

    题目描述 $ZYL$有$N$张牌编号分别为$1,2,...,N$.他把这$N$张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第$i$个位置的牌的编号为$i$,我们就称之为固定点.旋 ...

  3. NOIP模拟测试14「旋转子段·走格子·柱状图」

    旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a ...

  4. HZOJ 旋转子段

    作者的正解: 算法一:对于30%的数据: 直接枚举区间直接模拟,时间复杂度O(N3). 算法二:对于60%的数据:枚举旋转中心点,然后再枚举旋转的端点, 我们可以用O(n)的预处理求前缀和记录固定点, ...

  5. 旋转子段 (思维stl)

    题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少. 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每一个左端点, ...

  6. CSYZDay2模拟题解

    T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...

  7. NOIP模拟 14

    垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...

  8. 2019.10.22 校内CSP%你赛

    我太难了 先说好没有代码T1 题目大意: 给定一些形如|ax+b|的式子,求最小的x使得它们的和最小. 算法一: 大家知道零点分段法 对于这n个式子我们有n+1个取值范围 使得展开这n个式子得到的新式 ...

  9. [NOIP模拟14]题解

    当垃圾已经成为一种常态233333 A.旋转子段 考场上的$n^2$手残少了20分,555  (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么 ...

随机推荐

  1. ps--窗口配置

    移动工具设置 v 选择图层自动选择不勾 图层ctrl + 左键 视图设置智能参考线标尺 Ctrl+r 窗口设置 关闭 库 颜色 打开 信息 字符 图层 历史记录 信息 面板选项 鼠标单位 像素 rgb ...

  2. java-day25

    . 标签学习:         1. 文件标签:构成html最基本的标签             * html:html文档的根标签             * head:头标签.用于指定html文档 ...

  3. 在vue中使用高德地图开发,以及AMap的引入?

    百度引入BMap ,一个import 即可,可AMap 却报AMap is not difined ? 1.首先在 externals: { "BMap": "BMap& ...

  4. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解

    1 escape()函数 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string) 参数 描述 string 必需.要被转义或 ...

  5. 2019_7_30python

    当6引号给予变量的时候,变为字符串 6引号注释多行 语言元素 python中大小写敏感 不要和关键字 print( a + b ) print( a - b ) print( a * b ) prin ...

  6. pandas--层次化索引

    层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别. 创建一个Series,并用一个由列表或数组组成的列表作为索引. data=Series(np.random.r ...

  7. 分布式版本控制工具Mercurial------Linux下hg命令的使用

    1.关于hg命令选项: 每一个每一个命令选项都有一个长的名称,如hg log 命令会使用 –rev选项; 大多数选项拥有一个短的名称,如—rev有一个-r的短名: 长名称以两条横线(–)作为起始,短名 ...

  8. const 命令

    const 命令声明一个只读的常量,声明后值不可以改变 const 变量不可以重复声明 const一旦声明变量,就必须立即初始化,不能留到以后赋值. const命令声明的常量也是不提升,同样存在暂时性 ...

  9. Java处理图片工具类

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  10. FTT & NTT & 分治FFT

    FFT study from: http://www.orchidany.cf/2019/02/19/FFT1/ https://www.cnblogs.com/zwfymqz/p/8244902.h ...