https://www.luogu.org/problem/P2882

题意

你有n头牛,每头牛有个朝向,你每次可以选择连续k头牛翻转,求k为多少时可以用最少的步骤将所有牛朝向变为正向

n≤5000

分析

我们知道, 对于一个序列,我们如果选择每次翻k头牛,最优的翻转策略就是,每次找到第一头反向的牛,然后将它和后面的牛,一共k头都翻转,然后再往后找到第一个反向的牛,再...(因为每头牛都要翻正,如果先找到的是第一头反向的牛的前面或后面的牛翻转,那么就会造成额外的操作)

于是我们的做法是暴力枚举k,然后check出最佳的m,然而O(n^3)(check是O(nk)的),显然过不去,需要优化。

我们可以利用1为正向,0为反向,然后一个差分,用一个延迟标记tag,每次判断的时候用原数加上这个tag, 结果如果是奇数,就说明是正向的, 就不操作;如果是偶数,就是反向的,这时候操作数m++, 然后在翻转的右边界的右一个打上一个差分标记cf[i+k]=-1,而且我们cf的初值为0,这样就可以简单地更新tag啦。

注意不能再翻转的时候

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<string.h>
  4. #include<iostream>
  5. using namespace std;
  6. #define MAX 5000+9
  7. int n, m;
  8. int a[MAX];
  9. int cf[MAX],is;
  10. void check(int k) {
  11. int tag = 0;
  12. for(int i = 1; i <= n; i++) {
  13. tag += cf[i];
  14. if((a[i]+tag) % 2 == 0) {
  15. if(i+k-1 > n) {
  16. m = MAX;
  17. return ;
  18. }
  19. tag++;
  20. cf[i+k]--;
  21. m++;
  22. }
  23. }
  24. }
  25. int main() {
  26. scanf("%d",&n);
  27. char c;
  28. for(int i = 1; i <= n; i++) {
  29. cin>>c;
  30. if(c == 'F') a[i] = 1;//正
  31. else a[i] = 0, is = 1;
  32. }
  33. if(is == 0) {
  34. printf("1 0");
  35. return 0;
  36. }
  37. int ansm = MAX, ansk;
  38. for(int k = 1; k <= n; k++) {
  39. memset(cf, 0, sizeof(cf));
  40. check(k);
  41. if(ansm > m) {
  42. ansm = m;
  43. ansk = k;
  44. }
  45. m = 0;
  46. }
  47. printf("%d %d",ansk, ansm);
  48. }

luoguP2882Face The Right Way的更多相关文章

随机推荐

  1. jmeter连接不上MySQL数据库的原因以及解决方法

    1.Cannot create PoolableConnectionFactory (Client does not support authentication protocol requested ...

  2. Python apply函数

    Python apply函数 1.介绍 apply函数是pandas里面所有函数中自由度最高的函数.该函数如下: DataFrame.apply(func, axis=0, broadcast=Fal ...

  3. [SpingBoot guides系列翻译]文件上传

    文件上传 这节的任务是做一个文件上传服务. 概况 参考链接 原文 thymeleaf spring-mvc-flash-attributes @ControllerAdvice 你构建的内容 分两部分 ...

  4. 可能会搞砸你的面试:你知道一个TCP连接上能发起多少个HTTP请求吗?

    本文由原作者松若章原创发布,作者主页:zhihu.com/people/hrsonion/posts,感谢原作者的无私分享. 1.引言 一道经典的面试题是:从 URL 在浏览器被被输入到页面展现的过程 ...

  5. Image-transpose

    import Image im=Image.open('test.jpg') #out = im.resize((128, 128),Image.BILINEAR) #改变大小 #out = im.r ...

  6. 在 EF Core 中 Book 实体在新增、修改、删除时,给 LastUpdated 字段赋值。

    直接贴代码: public class MenusContext : DbContext { public static class ColumnNames { public const string ...

  7. Elastic 使用索引生命周期管理实现热温冷架构

    Elastic: 使用索引生命周期管理实现热温冷架构 索引生命周期管理 (ILM) 是在 Elasticsearch 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能.ILM 是 Elast ...

  8. mysql mysqldump 命令导出指定表的数据

    .导出指定表的数据 mysqldump -t database -u username -ppassword --tables table_name1 table_name2 table_name3  ...

  9. C#调用Activex中串口电子秤的数据,并将电子秤的数据显示到前端页面

    大二的一个项目需要用到Activex技术将读取到串口中的数据在后台获取到,并将串口的数据写入数据库,这个过程需要在后台使用C#调用Activex控件已经使用的方法,然后在前端通过JavaScript进 ...

  10. SQL 除去数字中多于的0

    /* 除掉多于的0 */ CREATE FUNCTION [dbo].[fn_ClearZero] ( ) ) ) AS BEGIN ); IF (@inValue = '') SET @return ...