首页 > 其他分享 >P2253 好一个一中腰鼓!

P2253 好一个一中腰鼓!

时间:2023-10-24 14:04:04浏览次数:34  
标签:同学 腰鼓 端点 样例 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\)温馨提示:其实数据根本没你想象的那么大。。。[坏笑]、、

三、解题思路

分析:一类线段树的经典题型,这种题和 求最长相同颜色区间的做法 是差不多的,都是要用线段树解决,那么要记录哪些信息呢?满足要求的区间长度是肯定要记录的,还要记录每一个区间左端点和右端点的颜色,仅仅用这些信息还不能更新区间长度,还要记录每个区间从左向右最多能扩展多少,从右向左能扩展多少,这样就能求出答案来。

合并是一个难点,当前区间的答案可能是左区间的答案也可能是右区间的答案也可能是左右中间合并的答案,在合并的时候判断一下左右端点的颜色是否相同就好了.同时还要更新向右延伸的最大长度和向左延伸的最大长度.

四、实现代码

#include <bits/stdc++.h>
using namespace std;
const int N = 20010;

// 线段树
#define mid ((l + r) >> 1)
#define ls (u << 1)
#define rs (u << 1 | 1)
struct Node {
    int l, r, len;
    int lx, rx, mx; // lx:左起最长符合条件的长度;rx:右起最长符合条件的长度;mx:整体区间内符合条件的长度
} tr[N << 2];

int color[N]; // 每个位置上的颜色

void pushup(int u) {
    // 左儿子的最右端点颜色,与右儿子的最左端点颜色是否相同
    bool flag = color[tr[ls].r] != color[tr[rs].l];

    tr[u].lx = tr[ls].lx; // 左起最长,继承左儿子的左起最长
    // 如果左儿子全部区间满足条件,并且,左儿子最右,不等于,右儿子最左,也就是继续符合条件
    if ((tr[ls].lx == tr[ls].len) && flag) tr[u].lx = tr[ls].len + tr[rs].lx;

    tr[u].rx = tr[rs].rx; // 右起最长,继承右儿子的右起最长
    // 如果右儿子全部区间满足条件,并且,右儿子最左,不等于,左儿子最右,也就是继续符合条件
    if ((tr[rs].rx == tr[rs].len) && flag) tr[u].rx = tr[rs].len + tr[ls].rx;

    tr[u].mx = max(tr[ls].mx, tr[rs].mx);
    if (flag) tr[u].mx = max(tr[u].mx, tr[ls].rx + tr[rs].lx); // 拼接
}

void build(int u, int l, int r) {
    tr[u].l = l, tr[u].r = r, tr[u].len = r - l + 1;

    if (l == r) {
        tr[u].lx = tr[u].rx = tr[u].mx = 1; // 表演刚开始每一个鼓都是红色面朝向观众
        return;
    }
    build(ls, l, mid);
    build(rs, mid + 1, r);
    pushup(u);
}

void modify(int u, int p) {
    int l = tr[u].l, r = tr[u].r;
    if (l == r) {
        color[p] = !color[p]; // 红变白,白变红
        return;
    }
    if (p <= mid)
        modify(ls, p);
    else
        modify(rs, p);
    pushup(u);
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("P2253.in", "r", stdin);
#endif
    int n, m;
    cin >> n >> m;

    build(1, 1, n);

    while (m--) {
        int p;
        cin >> p;
        modify(1, p);
        printf("%d\n", tr[1].mx);
    }
    return 0;
}



标签:同学,腰鼓,端点,样例,P2253,一中,答案,区间
From: https://blog.51cto.com/u_3044148/8003341

相关文章

  • 胜利一中 2023 秋提高级友好学校赛前联测 2 T3
    乱杀题目描述乐孤星和WA90准备联合参加下一次的NOB(NationalOlympiadinBadminton)。他们想要在一场比赛中击回对手打出的所有球从而赢得比赛,因为WA90非常强,所以可以预先知道对手打出的每一个球的位置,他们想要计算一下打败对手需要多认真。形式化的,我们将羽毛球场比作......
  • 潍坊一中 2023 秋提高级友好学校赛前联测 1 T3
    Mystia的居酒屋题目背景小麻雀Mystia开了一间居酒屋,每天清晨她都要跨过门前的河流去收集食材。题目描述Mystia想搭一座跨过河的桥,来方便她取得食材。河是一条无限长的宽度为\(W\)的直线,所有在坐标系中符合\(0≤y≤W\)的点都属于这条河流。河面上有\(N\)个木桩,附......
  • 一中数学培训(第三讲)
    2.算数基本定理2.1质数质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数质数有无穷个考虑反证,如果质数有限,我们设这个集合为\(S\)。我们求出\((\prod_{p\inS}p)+1\),那么对于任何一个\(p\inS\),都不满足\(b|(\prod_{p\inS}p)+1\)。那么\(......
  • 一中数学培训
    1.整除,最大公因数和最小公倍数1.1整除若整数\(b\)除以非零整数\(a\),商为整数,且余数为零,\(b\)为被除数,\(a\)为除数,即\(a|b\),读作“$a$整除$b$”或“$b$能被$a$整除”。其中,整除具有如下三条性质:整除的传递性,证明如下:如果\(a|b,b|c\),那么有\(a|c\)。设......
  • 厦门一中夏令营游记
    DAY1因为家离得远,所以6点半就出门啦,结果早到一小时半,机房门也没开,热死了。,今天学了数据结构,本以为不会太难,老师上来就说基础大家都会,就开始讲树状数组,直接懵逼。幸好还能听懂一点。(但不会写)中午食堂竟然不开我们赶紧去找地方吃饭,我们发现一家面馆叫“意中对面”,面很好吃带很......
  • 一中校运会之百米跑
    题目背景在一大堆秀恩爱的**之中,来不及秀恩爱的苏大神踏着坚定(?的步伐走向了100米跑的起点。这时苏大神发现,百米赛跑的参赛同学实在是太多了,连体育老师也忙不过来。这群b事真多这时体育老师发现了身为体育委员的苏大学神,便来找他帮忙。可是苏大神需要热身,不然跑到一半就会抽(筋)......
  • 一中竞赛会议批
    你像一条腾飞的巨龙作为一个这sb地方的OIer,开的会议不能说没有概括,也只能说对我无效;你化学组物理组生物组的学习管我批示。所谓再创辉煌是不是就这样把一区信息创没了......
  • SQL SERVER 2008 复制所有表结构、触发器、存储过程、视图等(海典传输初始化)(二)(对一中的
    一、对于p_get_usertable中的语句:1、获取所有用户表(并且架构为dbo。感觉可以不要该限制)的表名:selecta.namefromsysobjectsa,sysusersbwherea.xtype='u'an......