bzoj 5347: 冒泡排序

题面

https://www.lydsy.com/JudgeOnline/problem.php?id=5347

题解

[Usaco2018 Open]Out of Sorts很像,然而没有想起来这个题怎么做。。
看回了那个题的题解才做出来2333
感觉药丸
都是一样的套路
其实还是考虑分隔符出现的时间
答案就是出现时间的最大值
也就是那题的 g g g的最大值,当然,不需要对 1 1 1取max

但是这题很卡常,你只可以循环一次
一开始,我和那题一样的写法,写成了

 for (int u=1;u<=n;u++)	f[a[u]]=u;
 int ans=0,mx=0;
for (int u=1;u<=n;u++)   {ans=max(ans,mx-u+1);mx=max(mx,f[u]);}

发现过不去

进一步思考,其实我们可以直接考虑每一个 f [ u ] f[u] f[u]在哪里被减到最大值,自然是减数最小的时候,也就是枚举到他下一个的时候
于是就变成了

for (register int u=1;u<=n;u++)	ans=max(ans,u-a[u]);

加上输入是两个循环,还是过不去23333
最后,观察这个读入的方式
发现,可以直接写在输入里面
也就是

  for (register int u=1;u<=n;u++) 	
  {
  a[u]=u;S=(1LL*S*B+C)%D; swap(a[u],a[S%u+1]);
  ans=max(ans,u-a[u]);
  }

可以发现,并不会影响最大值
那么就可以做到一个循环了
于是就卡过去了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值