vijos1881 闪烁的繁星

描述

繁星, 漫天的繁星.
繁星排成一列, 我数一数呀, 一共有N只小星星呢.

星星们是听话的好孩子, 小岛在指挥它们跳舞呢.
舞蹈开始前, 它们都亮了起来!

小岛指一指第i只小星星, 只见第i只小星星立刻改变了自己的状态.
如果它之前是亮着的, 那么立刻就灭掉了.
如果它之前是灭掉的, 现在就立刻亮了呀!

如果说, 可以有连续若干只小星星.
其中任意相邻两只星星状态不同.
那就是最美的了.

小岛希望知道:
每一次发出指令之后
能找到最长的连续小星星, 满足上述需求的
有多长?

思路:赤裸裸的线段树,这是我做的第三个线段树,当然也是第一个updata比较长的。题意很好懂,但是updata比较的复杂,tree的结构体里要保存左右端点的颜色、最长长度和整个区间的最长长度,然后就是一个个的更新了。

code:

#include<iostream>

#include<cstdio>

using namespace std;

struct use{

int lc,rc,ls,rs,ws;

}tree[10000001];

void updata(int i,int l,int r)

{

int mid;

mid=(l+r)/2;

tree[i].lc=tree[i*2].lc;

tree[i].ls=tree[i*2].ls;

tree[i].rc=tree[i*2+1].rc;

tree[i].rs=tree[i*2+1].rs;

tree[i].ws=max(tree[i*2].ws,tree[i*2+1].ws);

if (tree[i*2].rc!=tree[i*2+1].lc)

{

tree[i].ws=max(tree[i].ws,tree[i*2].rs+tree[i*2+1].ls);

if (tree[i*2].ws==mid-l+1)

tree[i].ls=tree[i].ls+tree[i*2+1].ls;

if (tree[i*2+1].ws==r-mid)

tree[i].rs=tree[i].rs+tree[i*2].rs;

}

}

void build(int i,int l,int r)

{

int mid;

if (l==r)

{

tree[i].lc=tree[i].rc=0;

tree[i].ws=tree[i].ls=tree[i].rs=1;

return;

}

mid=(l+r)/2;

build(i*2,l,mid);

build(i*2+1,mid+1,r);

updata(i,l,r);

}

void insert(int i,int l,int r,int k)

{

int mid;

if (l==r&&l==k)

{

tree[i].lc=tree[i].rc=1-tree[i].lc;

return;

}

mid=(l+r)/2;

if (k<=mid) insert(i*2,l,mid,k);

else insert(i*2+1,mid+1,r,k);

updata(i,l,r);

}

int main()

{

int n,q,i,j,k;

scanf("%d%d",&n,&q);

build(1,1,n);

for (i=1;i<=q;++i)

{

scanf("%d",&k);

insert(1,1,n,k);

printf("%d\n",tree[1].ws);

}

}

时间: 2024-08-03 06:00:59

vijos1881 闪烁的繁星的相关文章

Vijos1881闪烁的繁星 [线段树]

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

Vijos P1881 闪烁的繁星

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

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

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

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 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

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

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

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(组合计数+奇怪的题)

深入浅出~Linux设备驱动之中断与定时器

“我叮咛你的 你说 不会遗忘 你告诉我的 我也全部珍藏 对于我们来说 记忆是飘不落的日子 永远不会发黄 相聚的时候 总是很短 期待的时候 总是很长 岁月的溪水边 捡拾起多少闪亮的诗行 如果你要想念我 就望一望天上那 闪烁的繁星 有我寻觅你的 目光” 谢谢你,曾经来过~ 中断与定时器是我们再熟悉不过的问题了,我们在进行裸机开发学习的 时候,这几乎就是重难点,也是每个程序必要的模块信息,那么在Linux中,我们又怎么实现延时.计数,和中断呢? 一.中断 1.概述 所谓中断是指cpu在执行程序的过程中

4572: [Scoi2016]围棋 轮廓线DP KMP

国际惯例的题面:这种题目显然DP了,看到M这么小显然要状压.然后就是具体怎么DP的问题.首先我们可以暴力状压上一行状态,然后逐行转移.复杂度n*3^m+3^(m*2),显然过不去. 考虑状态的特殊性,每个位置是黑子白子我们并不关心,我们只关心与模板的匹配情况.于是我们可以f(i,S,x,y)表示我们决策到i行j列,S表示上一行哪些位置和这一行哪些位置能与模板第一行完全匹配,x表示当前行与模板第一行匹配长度,y表示当前行与模板第二行匹配长度.转移的话就枚举当前行下一个位置填什么颜色棋子(或空着)即