Vijos P1881 闪烁的繁星 (自己加强了一下。。)

如果每一次查询的不是整个长度,而是[x, y]这个区间。。闲来无事自己写了一下,感觉是对的,这样就变成了合并区间。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <algorithm>
#define mem(f) memset(f,0,sizeof(f))
#define M 100005
#define mod 1000000007
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
using namespace std;
typedef long long LL;
const int MAX = 0x3f3f3f3f;
const int maxn = 200005;

int mx_three(int a, int b, int c) {
    return max(a, max(b, c));
}

int n, q, c, x, y, b[maxn];
struct C {
    int mx, lx, rx;
} a[maxn<<2];

void build(int o, int l, int r) {
    a[o].lx = a[o].mx = a[o].rx = 1;
    if(l == r) return;
    int m = (l+r) >> 1;
    build(lson);
    build(rson);
}

C query(int o, int l, int r) {
    if(x <= l && r <= y) return a[o];
    int m = (l+r) >> 1, len = r-l+1;
    if(y <= m) return query(lson);
    if(m < x ) return query(rson);

    C s, s1, s2;
    s1 = query(lson);
    s2 = query(rson);
    s.lx = s1.lx;
    s.rx = s2.rx;
    if(b[m] != b[m+1]) {
        if(s.lx == len-(len>>1)) s.lx += s2.lx;
        if(s.rx == len>>1) s.rx += s1.rx;
        s.mx = mx_three(s1.mx, s2.mx, s1.rx+s2.lx);
    } else s.mx = max(s1.mx, s2.mx);
    return s;
}

void update(int o, int l, int r) {
    if(l == r) {
        b[c] ^= 1;
        return;
    }
    int m = (l+r) >> 1;
    if(c <= m) update(lson);
    else update(rson);

    int len = r-l+1, L = o<<1, R = o<<1|1;
    a[o].lx = a[L].lx;
    a[o].rx = a[R].rx;
    if(b[m] != b[m+1]) {
        a[o].mx = mx_three(a[L].mx, a[R].mx, a[L].rx+a[R].lx);
        if(a[o].lx == len-(len>>1)) a[o].lx += a[R].lx;
        if(a[o].rx == len>>1) a[o].rx += a[L].rx;
    } else a[o].mx = max(a[L].mx, a[R].mx);
}

int main()
{
    scanf("%d%d", &n, &q);
    build(1, 1, n);
    while(q--) {
        int rr;
        scanf("%d", &rr);
        if(rr == 2) {
            scanf("%d", &c);
            update(1, 1, n);
        } else {
            scanf("%d%d", &x, &y);
            printf("%d\n", query(1, 1, n).mx);
        }
    }
    return 0;
}
时间: 2024-08-14 20:17:20

Vijos P1881 闪烁的繁星 (自己加强了一下。。)的相关文章

Vijos P1881 闪烁的繁星

P1882石阶上的砖 标签:d[显示标签] 背景 微雨的山门下 石阶湿着-- 只有独立的我 和缕缕的游云 这也是'同参密藏'么 描述 清晨, Alice与Bob在石阶上玩砖块. 他们每人都有属于自己的一堆砖块. 每人的砖块都由N列组成且N是奇数. Alice的第i列砖块有m[i]个. 而Bob的第i列砖块有s[i]个. 他们想建造城堡, 两座一样的城堡. 每一座城堡都是从正中间一列开始: 1)若往左侧看去,数量逐次增加,每一列都比右侧的一列多出恰一块砖. 2)若往右侧看去,数量逐次增加,每一列都

Vijos P1881 闪烁的星星 (加强自己多一点。。)

假设每次查询不是整个长度,但[x, y]此时间间隔. . 闲来无事写的,感觉是正确的.这将成为合并范围. #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <queue> #include <algorithm> #define mem(f) memset(f,0,sizeof(f)) #define M 100005

Vijos1881闪烁的繁星 [线段树]

P1881闪烁的繁星 背景 繁星闪烁着--深蓝的太空何曾听得见他们对语沉默中微光里他们深深的互相颂赞了 描述 繁星, 漫天的繁星.繁星排成一列, 我数一数呀, 一共有N只小星星呢. 星星们是听话的好孩子, 小岛在指挥它们跳舞呢.舞蹈开始前, 它们都亮了起来! 小岛指一指第i只小星星, 只见第i只小星星立刻改变了自己的状态.如果它之前是亮着的, 那么立刻就灭掉了.如果它之前是灭掉的, 现在就立刻亮了呀! 如果说, 可以有连续若干只小星星.其中任意相邻两只星星状态不同.那就是最美的了. 小岛希望知道

【vijos】1881 闪烁的繁星(线段树+特殊的技巧)

https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sad,后来发现我是如此sb,根本无法实现..) 然后我弃疗了,比赛干脆不交了..sad 后来看了题解和神犇们热心的指导,这就是一水题.. sad. 我们只需要在线段树维护三个值,L表示这个节点的区间内从左边向又能延伸的最长可行串的长度,R表示这个节点的区间内从右边向左能延伸的最长可行串的长度,mx表示

vijos1881 闪烁的繁星

描述 繁星, 漫天的繁星.繁星排成一列, 我数一数呀, 一共有N只小星星呢. 星星们是听话的好孩子, 小岛在指挥它们跳舞呢.舞蹈开始前, 它们都亮了起来! 小岛指一指第i只小星星, 只见第i只小星星立刻改变了自己的状态.如果它之前是亮着的, 那么立刻就灭掉了.如果它之前是灭掉的, 现在就立刻亮了呀! 如果说, 可以有连续若干只小星星.其中任意相邻两只星星状态不同.那就是最美的了. 小岛希望知道:每一次发出指令之后能找到最长的连续小星星, 满足上述需求的有多长? 思路:赤裸裸的线段树,这是我做的第

vijos p1881 线段树

题意:点我 我就想问,现在换代码风格还来得及吗? 1 #include<cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define mid (l+r)/2 5 #define ls rt<<1,l,mid 6 #define rs rt<<1|1,mid+1,r 7 using namespace std; 8 const int Rn=199999+9; 9 int N,Q; 10

vijos国庆节模拟赛之繁星春水

A.闪烁的繁星 题目:https://vijos.org/p/1881 题解:貌似做过小白逛公园或者序列操作都可以秒出吧,就是pushup函数比较麻烦,不过仔细想一想就知道了. 代码: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #inc

10月刷题总结

(写的题真少QAQ 动态规划: [vijos]1286 座位安排(状压dp) [BZOJ]1026: [SCOI2009]windy数(数位dp) [BZOJ]1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧) [BZOJ]1827: [Usaco2010 Mar]gather 奶牛大集会(树形dp) [BZOJ]2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛(树形dp) 计数: [vijos]1789 String(组合计数+奇怪的题)

青春不死,只是凋零——悼念汪国真老师

高中时期,在高考的压力下,那是一段难熬的日子.是他的诗给了我力量.他的<热爱生命>里的话成了我的座右铭:我不去想是否能够成功,既然选择了远方,便只顾风雨兼程. 想转几篇他的诗词以示悼念: 1.热爱生命 我不去想, 是否能够成功 , 既然选择了远方 , 便只顾风雨兼程 . 我不去想, 能否赢得爱情 , 既然钟情于玫瑰 , 就勇敢地吐露真诚 . 我不去想, 身后会不会袭来寒风冷雨 , 既然目标是地平线 , 留给世界的只能是背影 . 我不去想, 未来是平坦还是泥泞 , 只要热爱生命 , 一切,都在意