展开
题目背景
话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来。
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温馨提示:其实数据根本没你想象的那么大。。。[坏笑]、、
思路: 维护每个区间的最左节点最右节点,左边01数目,右边01数目,区间最大01数目。两个区间相交处相异就可以合并了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 4e5 + 7;
int n,m;
int lc[maxn],rc[maxn],lnum[maxn],rnum[maxn],sum[maxn];
void pushup(int i,int len)
{
lnum[i] = lnum[i * 2];
rnum[i] = rnum[i * 2 + 1];
lc[i] = lc[i * 2];
rc[i] = rc[i * 2 + 1];
sum[i] = max(sum[i * 2],sum[i * 2 + 1]);
sum[i] = max(sum[i],max(lnum[i * 2],lnum[i * 2 + 1]));
sum[i] = max(sum[i],max(rnum[i * 2],rnum[i * 2 + 1]));
if(rc[i * 2] != lc[i * 2 + 1])//区间合并
{
sum[i] = max(sum[i],rnum[i * 2] + lnum[i * 2 + 1]);
if(lnum[i * 2] == (len - len / 2))
lnum[i] = lnum[i * 2] + lnum[i * 2 + 1];
if(rnum[i * 2 + 1] == len / 2)
rnum[i] = rnum[i * 2 + 1] + rnum[i * 2];
}
}
void build(int i,int l,int r)
{
if(l == r)
{
lc[i] = rc[i] = 0;
lnum[i] = rnum[i] = 1;
sum[i] = 1;
return ;
}
int m = (l + r) >> 1;
build(i * 2,l,m);
build(i * 2 + 1,m + 1,r);
pushup(i,r - l + 1);
}
void update(int i,int l,int r,int x)
{
if(l == r)
{
lc[i] = rc[i] = (lc[i] ^ 1);
return;
}
int m = (l + r) >> 1;
if(x <= m)
update(i * 2,l,m,x);
if(x > m)
update(i * 2 + 1,m + 1,r,x);
pushup(i,r - l + 1);
}
int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
while(m--)
{
int x;scanf("%d",&x);
update(1,1,n,x);
printf("%d\n",sum[1]);
}
return 0;
}
腰鼓翻转问题与数据结构优化

本文探讨了一个基于腰鼓翻转的有趣问题,通过巧妙的数据结构设计,实现对腰鼓状态的高效更新与查询。在N个同学表演腰鼓的过程中,根据M次指令翻转腰鼓颜色,目标是找出每次指令后最长的连续同学,其手中腰鼓颜色交替出现。文章提供了一种解决方案,利用区间树进行区间维护,实现快速查找最长交替序列。
532

被折叠的 条评论
为什么被折叠?



