luogu2253 好一个一中腰鼓!
先说一个小trick,一开始我们把他赋值成是红、白相间的,查询就查询的是全红或全白即可。
然后就可以做啦
题解里面好像都是线段树
暴力的题解好像都被del了
貌似暴力交上去也过不了了
然后我想说
分块大法好!
把同学们他分成\(\lfloor\sqrt N\rfloor\)块
每块维护八个信息:
左边连续白长度,右边连续白长度,块内连续白长度,是否全白,
左边连续红长度,右边连续红长度,块内连续红长度,是否全红,
记录两个不变的信息:
id(废话),块的长度
每次更新,找到那个同学在哪个块,整块全部暴力更新,根号N
怎么更新,整个快全扫一遍,统计白的数量和红的数量能把是否全白全红做了,中途统计当前连续白红数量能把最长块内连续长度做了
然后从块左端往右扫,右端往左扫,把左右两端的长度高了
每次查询,也是\(\sqrt N\),乱搞搞
怎么搞,先枚举两种颜色,然后枚举所有区块,更新一个当前能延伸的长度,如果这个区块全是一种颜色就+=(可以连上),否则就直接等于他右端的长度,具体看代码
复杂度大概\(O(M\sqrt N)\)
由于我经常用调试输出,所以我就没有删除调试输出
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int n, m, size;
int a[20010], id[20010];
int len[200], l[200], r[200];
struct info
{
bool all;
int l, r, x;
}b[200][2];
int query();
void print()
{
printf("输出调试信息\n");
for (int i = 1; i <= n; i++)
printf("%d%c", a[i], i == n ? '\n' : ' ');
for (int i = 1; i <= id[n]; i++)
{
printf("第%d块 (%d, %d)", i, l[i], r[i]);
for(int t = 0; t <= 1; t++)
printf("[%d %d %d %d]%c", b[i][t].all, b[i][t].l, b[i][t].x, b[i][t].r, t?'\n':' ');
}
printf("当前答案%d\n", query());
}
//更新区块x
void update(int x)
{
// printf("更新了区块%d\n", x);
int t[2] = {0, 0}, f[2] = {0, 0};
b[x][0].x = b[x][1].x = 0;
for (int i = l[x]; i <= r[x]; i++)
{
t[a[i]]++;
f[a[i]]++;
if(a[i] != a[i - 1])
{
b[x][a[i - 1]].x = max(b[x][a[i - 1]].x, f[a[i - 1]]);
f[a[i - 1]] = 0;
}
}
b[x][a[r[x]]].x = max(b[x][a[n]].x, f[a[r[x]]]);
b[x][0].all = (t[0] == len[x]);
b[x][1].all = (t[1] == len[x]);
b[x][a[l[x]]].l = 1;
b[x][a[l[x]] ^ 1].l = 0;
b[x][a[r[x]]].r = 1;
b[x][a[r[x]] ^ 1].r = 0;
for (int i = l[x] + 1; a[i] == a[i - 1] && i <= r[x]; i++)
b[x][a[l[x]]].l++;
for (int i = r[x] - 1; a[i] == a[i + 1] && i >= l[x]; i--)
b[x][a[r[x]]].r++;
}
//查询当前状态的最大值
int query()
{
int maxlength[2] = {0, 0}, nowlength[2] = {0, 0};
for (int t = 0; t <= 1; t++)
{
for (int i = 1; i <= id[n]; i++)//枚举所有区块
{
maxlength[t] = max(maxlength[t], b[i][t].l + nowlength[t]);
maxlength[t] = max(maxlength[t], b[i][t].x);
if(b[i][t].all == 1)
nowlength[t] += len[i];
else
nowlength[t] = b[i][t].r;
}
maxlength[t] = max(maxlength[t], nowlength[t]);
}
return max(maxlength[0], maxlength[1]);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
a[i] = (i & 1);
size = sqrt(n);
for (int i = 1; i <= n; i++)
{
id[i] = (i - 1) / size + 1;
len[id[i]]++;
if ((i - 1) % size == 0)
l[id[i]] = i;
if (i % size == 0)
r[id[i]] = i;
}
r[id[n]] = n;
for (int i = 1; i <= id[n]; i++)
update(i);
// print();
for (int x, i = 1; i <= m; i++)
{
scanf("%d", &x);
a[x] ^= 1;
update(id[x]);
// print();
printf("%d\n", query());
}
return 0;
}
瞎扯几句
据说写分快是对出题人的不尊重??但是这题难度标签对我不尊重2333。。。
一个线段树模板就是绿题了,这题黄题 显然不用线段树能过,所以我就写了分块
经验/启示:以后懒得写线段树但是又比较勤快可以试试分块
luogu2253 好一个一中腰鼓!的更多相关文章
- 洛谷 P2253 好一个一中腰鼓! 题解
P2253 好一个一中腰鼓! 题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:"忽一人 ...
- 洛谷P2253 好一个一中腰鼓!
题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢 ...
- 洛谷 P2253 好一个一中腰鼓!
题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢 ...
- P2253 好一个一中腰鼓!
题意:给你一个序列,初始是0,每次一个操作,把一个数^=1 每次求出最长01串的长度 正解:线段树(虽然暴力能过) 对于每个区间,记录三个值 lmax,以l为首的01串长度 rmax,以r为尾的01串 ...
- 「Luogu P2253 好一个一中腰鼓!」
就这道题的理论难度来说绿题是有点低了,但是这道题的实际难度来看,顶多黄题,所以建议加强数据或出数据升级版. 前置芝士 线段树:具体可以看我的另一篇文章. 具体做法 暴力的方法想必都会,所以来讲一下正解 ...
- 把一个一中的字段更新另一个表中的t-sql
UPDATE dbo.CommDescr SET Descr=(SELECT ba.content FROM dbo.blog_article ba WHERE ba.id=3) WHERE Comm ...
- noip2017考前整理(未完)
快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...
- mybatis 常用
1.新增时获得主键 <insert ...> <selectKey resultType="java.lang.Integer" keyProperty=&quo ...
- [HNOI2018]爆零记
Day 0 完全不知道做什么. 打了一个splay板子,还没调出来emmmmm 不想做题目,最后做的一题是[HNOI2016]的超(sha)难(bi)题网络. 当我希望省选能出一下树剖时,旁边的大佬跟 ...
随机推荐
- 侯捷STL学习(一)--顺序容器测试
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 ...
- 2015.12.12 DataGridveiw中添加checkbox列
最简单的办法是通过DataTable来添加 DataTable中添加bool类型的列 dtpdf.Columns.Add("入库", typeof(bool)); DataRow ...
- 破解Mac版MyEclipse-2017-ci3 2017、11、21亲测有效
一.前提 要有安装好的jdk,没有的Mac用户看这篇博客:给Mac安装最新版本的jdk(戳此) Windows用户先去官网(戳此)下载jdk,然后百度”jdk配置环境变量”(戳此),很简单的,加油你 ...
- Tiny4412 Uboot
1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用. b) 解 ...
- URL网址参数解析类
/** * Created by myc on 2015/12/9. */ import android.text.TextUtils; import java.util.HashMap; impor ...
- solr笔记--solr3.2以后支持document和json两种对象来更新索引
1.json形式(比如把mongodb数据库的导出结果json) <requestHandler name="/update" class="solr.JsonUp ...
- 771. Jewels and Stones珠宝数组和石头数组中的字母对应
[抄题]: You're given strings J representing the types of stones that are jewels, and S representing th ...
- php学习笔记-elseif
<?php if(condition1) { func1(); }elseif(condition2) { func2(); }else { func3(); } ?> elseif需要明 ...
- oracle 监听服务OracleOraDb11g_home1TNSListener打开后立马停止错误
首先我真得吐槽一下,我安装这个破软件感觉真的是把能遇到的错误都遇到一遍了,生气!!!!!!! 关于监听服务OracleOraDb11g_home1TNSListener打开后立马停止这个错误,我的解决 ...
- java内存模型和线程安全