洛谷 P2253 好一个一中腰鼓! 题解
P2253 好一个一中腰鼓!
题目背景
话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来。
Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢哗者,遂与外人间隔。”
题目描述
设想一下,腰鼓有两面,一面是红色的,一面是白色的。初二的苏大学神想给你这个oier出一道题。假设一共有N(1<=N<=20,000)个同学表演,表演刚开始每一个鼓都是红色面朝向观众,舞蹈老师会发出M(1<=M<=20,000)个指令,如果指令发给第i个表演的同学,这位同学就会把腰鼓反过来,如果腰鼓之前是红色面朝向观众的,那么就会变成白色面朝向观众,反之亦然。那么问题来了(!?),在老师每一次发出指令后,找到最长的连续的一排同学,满足每相邻的两个手中的腰鼓朝向观众的一面互不相同,输出这样一排连续的同学的人数。
输入格式
第一行有两个整数, 分别为表演的同学总数N, 和指令总数M。
之后M行, 每行有一个整数i: 1<=i<=N, 表示舞蹈老师发出的指令。
输出格式
输出有M行, 其中每i行有一个整数.
表示老师的第i条指令发出之后, 可以找到的满足要求的最长连续的一排表演同学有多长?
输入输出样例
输入 #1
6 2
2
4
输出 #1
3
5
说明/提示
Huangc温馨提示:其实数据根本没你想象的那么大。。。[坏笑]、、
【思路】
线段树
第一次做不是用来区间求和和区间修改的线段树题目
窝太菜了
【题目大意】
一个0串,可以被翻转为1,同理1也可以翻转为0
每一次翻转一个位置
然后求这时候最长的连续的一排同学,满足每相邻的两个手中的腰鼓朝向观众的一面互不相同
【题目分析】
Huangc温馨提示:其实数据根本没你想象的那么大。。。[坏笑]、、
所以跑暴力试一下
第一个点WA,80分QWQ
或许是我写丑了
看题目我是想不到要用线段树的,毕竟之前没有做过这一类的题目
但是洛谷标签提醒了我
所以要用线段树
单点修改很容易
那就难在求最长序列
可以记录某个线段l,r和mi
l表示在这个线段中以左端点为起点的最长合法序列的长度
r表示在这个线段中以右端点为重点的最长合法序列的长度
mi就是这个线段中最长的合法序列长度了
【核心思路】
需要处理处每个线段里面的l,r和mi
k的l至少是等于他左儿子的l的,因为k线段的左端点等于他左儿子的左端点
然后这个时候在看看连接了右儿子之后l会不会增加
不过会增加也是有个前提条件的就是左儿子这一块全部合法才能够连到右儿子上面
判断右儿子和左儿子交界处是否不同
不同的话就将l+右儿子的l
k的r至少是他右儿子的r,理由和上面类似
让再判断连接了左儿子之后r会不会增加
这个也是有前提条件的就是右儿子全部合法不然碰不到左儿子
k的mi是他两个儿子的mi的最大值
但是有可能这个最长合法序列的左右端点都不是左右边界
那就是在中间的情况
所以在和左儿子的r和右儿子的l也就是左右儿子交界的地方那里存在的最长合法序列
输出最大值就好了
【完整代码】
#include<iostream>
#include<cstdio>
#define lson (k << 1)
#define rson (k << 1 | 1)
using namespace std;
int read()
{
int sum = 0,fg = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')fg = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
sum = sum * 10 + c - '0';
c = getchar();
}
return sum * fg;
}
const int Max = 20004;
struct node
{
int l;//区间内以左端点为起点的合法区间长度
int mi;//区间内合法区间最长的
int r;//区间内以右端点为终点的合法区间的长度
}a[Max << 2];
int opx;
int use[Max];//记录当前情况
void down(int k,int l,int r,int mid)
{
a[k].l = a[lson].l;
if(use[mid] != use[mid + 1] && mid - l + 1 == a[lson].l)
a[k].l += a[rson].l;
a[k].r = a[rson].r;
if(use[mid] != use[mid + 1] && r - mid == a[rson].r)
a[k].r += a[lson].r;
a[k].mi = max(a[lson].mi,a[rson].mi);
if(use[mid] != use[mid + 1])
a[k].mi = max(a[k].mi,a[lson].r + a[rson].l);
return;
}
void change(int k,int l,int r)
{
if(l == opx && r == opx)
{
if(use[opx] == 1)
use[opx] = 0;
else
use[opx] = 1;
return;
}
int mid = (l + r) >> 1;
if(opx <= mid)change(lson,l,mid);
if(opx > mid)change(rson,mid + 1,r);
down(k,l,r,mid);
}
void build(int k,int l,int r)
{
if(l == r)
{
a[k].l = 1;
a[k].r = 1;
a[k].mi = 1;
return;
}
int mid = (l + r) >> 1;
build(lson,l,mid);
build(rson,mid + 1,r);
down(k,l,r,mid);
}
int main()
{
int n = read(),m = read();
build(1,1,n);
for(register int i = 1;i <= m;++ i)
{
opx = read();
change(1,1,n);
cout << max(a[1].mi,max(a[1].l,a[1].r)) << endl;
}
return 0;
}
洛谷 P2253 好一个一中腰鼓! 题解的更多相关文章
- 洛谷P2253 好一个一中腰鼓!
题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢 ...
- 洛谷 P2253 好一个一中腰鼓!
题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢 ...
- P2253 好一个一中腰鼓!
题意:给你一个序列,初始是0,每次一个操作,把一个数^=1 每次求出最长01串的长度 正解:线段树(虽然暴力能过) 对于每个区间,记录三个值 lmax,以l为首的01串长度 rmax,以r为尾的01串 ...
- 「Luogu P2253 好一个一中腰鼓!」
就这道题的理论难度来说绿题是有点低了,但是这道题的实际难度来看,顶多黄题,所以建议加强数据或出数据升级版. 前置芝士 线段树:具体可以看我的另一篇文章. 具体做法 暴力的方法想必都会,所以来讲一下正解 ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- HAOI2006 (洛谷P2341)受欢迎的牛 题解
HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)
洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...
- BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...
随机推荐
- freemarker中8个常用的指令
这里列举出Freemarker模板文件中8个常用的指令. 1. assign assign指令用于创建或替换一个顶层变量,assign指令的用法有多种,包括创建或替换一个顶层变量,创建或替换多个变量等 ...
- WPF XAML的读法
XAML 一直以为读作X-A-M-L 不过 一直都是念错了 正确念法:ZAMMEL 类似:ZeIMO [平音]
- Unity3d—GUI能量条
1.打开Unity编辑器. 2.在脚本文件夹中添加C#脚本,我的是添加了skill_01这个脚本.(要自己设置文件夹,方便管理,不然文件添乱不方便管理) 3.注意,脚本的名字一旦确定就不要去改动,因为 ...
- 自己对Thread的一些看法;
Thread thread= new Thread(new ThreadStart(name); 与 Thread thread= new Thread(name); thread.star( ...
- Centos7 Putty SSH密钥登录
在本地电脑打开PuTTYgen程序,点击Generate生成密钥,可以再设置一层密码,保存公钥和私钥到本地文件,保存好,最好多处备份 先用密码登录远程Centos vim ~/.ssh/authori ...
- 架构师小跟班:送你一份2019年阿里巴巴最新Java面试题,以供参考
大家都说大厂面试造飞机,工作拧螺丝.这话只对了一部分,大厂是平时拧螺丝,一旦需要飞机时也能造的起来. 目录 技术一面(23问) 技术二面(3大块) JAVA开发技术面试中可能问到的问题(17问) JA ...
- SpringIOC源码解析(上)
注意,看完这篇文章需要很长很长很长时间... 准备工作 本文会分析Spring的IOC模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,demo工程我以备好,需要的童鞋自行在下 ...
- PHP实现sha1加密AES算法加密解密数据
一.加密代码如下: /** * * @param string $string 需要加密的字符串 * @param string $key 密钥 * @return string */ public ...
- 结合 Vue.observable 写一个简易 Vuex
作为 Vue 全家桶的一员,Vuex 的重要性不言而喻,不管是用来管理状态,还是封装 Controler 都很好用 不过在一些体量较小的项目中,为了几个简单的状态或者处理函数而引入 Vuex,就像是高 ...
- 隐马尔科夫模型(Hidden Markov Models) 系列之一
转自:http://blog.csdn.net/eaglex/article/details/6376826 介绍(introduction) 通常我们总是对寻找某一段时间上的模式感兴趣,这些模式可能 ...