luoguP2882Face The Right Way
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啦。
注意不能再翻转的时候
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define MAX 5000+9
int n, m;
int a[MAX];
int cf[MAX],is;
void check(int k) {
int tag = 0;
for(int i = 1; i <= n; i++) {
tag += cf[i];
if((a[i]+tag) % 2 == 0) {
if(i+k-1 > n) {
m = MAX;
return ;
}
tag++;
cf[i+k]--;
m++;
}
}
}
int main() {
scanf("%d",&n);
char c;
for(int i = 1; i <= n; i++) {
cin>>c;
if(c == 'F') a[i] = 1;//正
else a[i] = 0, is = 1;
}
if(is == 0) {
printf("1 0");
return 0;
}
int ansm = MAX, ansk;
for(int k = 1; k <= n; k++) {
memset(cf, 0, sizeof(cf));
check(k);
if(ansm > m) {
ansm = m;
ansk = k;
}
m = 0;
}
printf("%d %d",ansk, ansm);
}
luoguP2882Face The Right Way的更多相关文章
随机推荐
- 【树状数组】2019徐州网络赛 query
(2)首先成倍数对的数量是nlogn级别的,考虑每一对[xL,xR](下标的位置,xL < xR)会对那些询问做出贡献,如果qL <= xL && qR >= xR, ...
- SpringBoot之异步定时任务
如果每个Scheduled方法是同步执行的,万一有一个发生死锁,那么其他任务就没法执行,下面介绍异步定时任务 异步定时任务 Spring为任务调度与异步方法执行提供了注解支持,即通过在方法上设置@As ...
- Educational Codeforces Round 78 (Rated for Div. 2) 题解
Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...
- 教你用好 Javascript 数组
原文链接:https://juejin.im/post/5d9769b26fb9a04df26c1b89 作为 Javascript 的标准对象之一,数组是非常底层而且实用的数据结构.虽然结构很简单, ...
- 大话设计模式Python实现-模板方法模式
模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...
- oracle中如何更改一个表的一个字段属性(名称,类型)
修改字段的属性,名称方法 --修改某一个字段的类型,当该字段不为null时alter table 表名add 字段NUMBER(11,0) default 0 not null;--添加表一个字段 A ...
- mysql增加索引、删除索引、查看索引
添加索引 有四种方式来添加数据表的索引: 1.添加一个主键,这意味着索引值必须是唯一的,且不能为NULL ALTER TABLE tbl_name ADD PRIMARY KEY (column_li ...
- Java的POJO和JavaBean的区别
POJO Plain Ordinary Java Object,即简单的java对象. 特点 需要有一些 private 的参数,以及针对参数的 setter 和 getter 方法来访问这些参数. ...
- Spring-@ControllerAdvice 拦截异常并统一处理
在spring 3.2中,新增了@ControllerAdvice 注解, 可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Req ...
- Window权限维持(一):注册表运行键
在红队行动中在网络中获得最初的立足点是一项耗时的任务.因此,持久性是红队成功运作的关键,这将使团队能够专注于目标,而不会失去与指挥和控制服务器的通信.在Windows登录期间创建将执行任意负载的注册表 ...