洛谷 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 ...
随机推荐
- html5预加载图片的写法
插件还是用 jquery.imgpreload.min.js 只不过初始化加载 必须用window.onload 图片dom都加载完成再显示 不然会有bug <pre> window.on ...
- Idea java 中导包路径分析
工具类所在包: 查看工具类详情: 调用这个工具类时,导入的包路径为: 路径就是第1张图片中的包名utils+类名NumberUtils组成的utils.NumberUtils
- [转帖]从零开始入门 K8s | 手把手带你理解 etcd
从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...
- 【leetcode-449】序列化和反序列化二叉搜索树
序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法来序列化和反序列化二叉搜索树. 对序列 ...
- Java Base64Utils ----Utils
Java Base64Utils 目录 Java Base64Utils 7 /** * <html> * <body> * <P> Copyrig ...
- EF Core中如何设置数据库表自己与自己的多对多关系
本文的代码基于.NET Core 3.0和EF Core 3.0 有时候在数据库设计中,一个表自己会和自己是多对多关系. 在SQL Server数据库中,现在我们有Person表,代表一个人,建表语句 ...
- C# while循环
一.简介 只要给定条件为true,C#的while循环语句会循环重新执行一个目标的语句. 二.语法 C# while的语法: while(循环条件) { 循环体: } 三.执行过程 程序运行到whil ...
- 【转载】c# datatable 判断值是否存在
在C#的数据表格DataTable操作过程中,有时候在操作DataTable前需要判断DataTable中的值是否存在,此时首选需要判断DataTable是否为null值,而后在判断DataTable ...
- WPE 过滤器 高级滤镜
与普通滤镜区别就是: 普通滤镜固定位置 高级滤镜固定数值 普通滤镜 指定位置1~6,对应发送数据的固定1~6字节 高级滤镜 首先,勾选高级-自发现有连锁位置 记得,偏移001对应修改000位置,也可称 ...
- cpio建立、还原备份档
1. 简介 加入.解开cpio或tar备份档内的文件 与tar相似,将文件归档到硬盘或磁带等存储设备中 2. tar比较 在所处理的文件类型方面,它比tar更全面,但也更复杂 cpio比tar更为可靠 ...