2021NOI 省选训练赛day1T1 A. light

Problem

有一排\(n\)个灯,每个灯有一个颜色,用\(1\)到\(m\)表示。一开始所有灯都是关着的。

有\(q\)次操作,每次改变某种颜色的所有灯的状态。每次操作后你需要输出开着的灯组成的极长连续子段的数量。

Subtask 1 (13pts):\(n,q\le5000\)。

Subtask 2 (35pts):\(m\le100\)。

Subtask 3 (52pts):无特殊限制。

对于全部数据,\(1≤n,q\le 10^5\),\(1\le m\le n\)。

Solution

这道题的思考过程分为两个部分。

  1. 暴力处理。
  2. 对于要修改的颜色的灯的数量进行根号分治。

暴力:只有当要修改的灯的两侧的灯的亮灭情况相同时,才会对答案造成影响(\(\pm1\))

在整个序列上,结论就是连续段数等于开着的灯数减去相邻两个都开着的灯对数

在这里也可以得出:相邻的两种颜色对答案没有任何的影响。所以预先把相邻的同色灯缩点。

但是这样每修改一次,都需要到对应颜色的灯上统计答案,时间复杂度为\(O(n)\)(比如缩点之后的序列为1,2,1,2,1,2,1...,一次修改仍然有\(\frac n2\)次操作)。

设\(k=\sqrt n\),如果只是对出现次数小于\(k\)的颜色进行暴力枚举其位置修改,时间复杂度为\(O(\sqrt n)\)当然是没有问题的。对于出现次数大于\(k\)的颜色呢,我们维护与这种颜色相邻的开着的灯的数量(记为\(f_{i,j}\)表示一种出现次数大于\(k\)的颜色\(j\)的旁边有多少个颜色为\(i\)的灯泡)。每当我们改变一种出现次数大于\(k\)的颜色是时,使用这个算答案;修改一种出现次数小于\(k\)的颜色时就暴力枚举其位置并维护好\(f_{i,j}\)。

Code

/**************************************************************
* Problem: A. light-Revision
* Author: Vanilla_chan
* Date: 20210309
**************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<limits.h>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
#ifdef ONLINE_JUDGE
char buf[1<<23],* p1=buf,* p2=buf,obuf[1<<23],* O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
using namespace std; template<class T>inline void read(T& x)
{
char ch=getchar();
int fu;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)) { x=x*10+ch-'0';ch=getchar(); }
x*=fu;
}
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)) { x=x*10+ch-'0';ch=getchar(); }
return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do { G[++g]=x%10;x/=10; } while(x);
for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
#define N 200010
#define S 778
int n,m,q;
int a[N],b[N];
vector<int>c[N];
bool book[N];
int ans,x,s,k;
int cnt[N];
int id[N],idcnt,pos[N];
int g0[N],g1[N];
int f[N][S];
int main()
{
// freopen("ex_light1.in","r",stdin);
// freopen("A.out","w",stdout);
n=read();
m=read();
q=read();
for(int i=1;i<=n;i++)
{
b[i]=read();
}
//temp int cnt
{
int cnt=0;
for(int i=1;i<=n;i++)
{
if(i==1||b[i]!=b[i-1])
{
a[++cnt]=b[i];
}
}
// for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";
n=cnt;
}
a[0]=a[n+1]=m+1;
k=s=sqrt(n);
for(int i=0;i<=n+1;i++)
{
cnt[a[i]]++;
}
for(int i=1;i<=m+1;i++)
{
if(cnt[i]>k)
{
id[i]=++idcnt,pos[idcnt]=i;
}
}
for(int i=0;i<=n+1;i++)
{
if(cnt[a[i]]<=k)
{
if(i) g0[a[i-1]]++;
if(i!=n+1) g0[a[i+1]]++;
c[a[i]].push_back(i);
}
else
{
if(i) f[a[i-1]][id[a[i]]]++;
if(i!=n+1) f[a[i+1]][id[a[i]]]++;
}
}
while(q--)
{
int t0=0,t1=0;
x=read();
book[x]^=1;
for(int i=1;i<=idcnt;i++)
{
if(book[pos[i]]) t1+=f[x][i];
else t0+=f[x][i];
}
if(book[x]==0)
{
ans=ans-g0[x]-t0+g1[x]+t1;
}
else
{
ans=ans-g1[x]-t1+g0[x]+t0;
}
write(ans/2);
//change
if(cnt[x]<=k)
{
for(int i=0;i<c[x].size();i++)
{
if(book[x])
{
if(c[x][i]!=0) g1[a[c[x][i]-1]]++,g0[a[c[x][i]-1]]--;
if(c[x][i]!=n+1) g1[a[c[x][i]+1]]++,g0[a[c[x][i]+1]]--;
}
else
{
if(c[x][i]!=0) g1[a[c[x][i]-1]]--,g0[a[c[x][i]-1]]++;
if(c[x][i]!=n+1) g1[a[c[x][i]+1]]--,g0[a[c[x][i]+1]]++;
}
}
}
}
return 0;
}

2021NOI 省选训练赛day1T1 A. light的更多相关文章

  1. 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs

    MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu SubmitStatusid=14946">Practice ...

  2. 省选训练赛第4场D题(多米诺骨牌)

    题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Vasya很喜欢排多米诺 ...

  3. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  4. 10.0.0.55_12-16训练赛部分writeup

    0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...

  5. Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

    Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...

  6. Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)

    Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...

  7. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  8. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  9. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  10. ACM训练赛:第20次

    这次的题思维都很强,等之后的考试结束会集中精力重新训练一些思维题. A - A simple question CodeForces - 520B 思路: 直接看的话,很容易发现如果 \(n > ...

随机推荐

  1. jmespath 使用及案例

    什么是jmespath jmespath 是python里面的一个库 主要在httprunner框架里使用 2.使用语法 列表: with_jmespath(jmes_path,var_name) m ...

  2. hexo 图片添加水印(png, jpeg, jpg, gif)

    文章同步发布:https://blog.jijian.link/2020-04-21/hexo-watermark/ 本文折腾 hexo 图片添加水印功能,大部分代码沿用: nodejs 图片添加水印 ...

  3. Qt Oracle往数据库里插入或者更新图片

    文章目录 Qt Oracle往数据库里插入或者更新图片 前言 读取本地图片文件 QPixmap 转 QByteArray 组成SQL,并执行 Qt Oracle往数据库里插入或者更新图片 前言 最近遇 ...

  4. ModuleNotFoundError: No module named '_sqlite3' when Python3

    前言 运行 python 报错:ModuleNotFoundError: No module named '_sqlite3' 解决 重新编译安装 python ./configure --enabl ...

  5. CSRF的理解及Flask和Django的解决方案

    CSRF 攻击的原理 1. 用户正常登录 网站A 2. 网站A 向用户浏览器写入cookies(包含登录信息) 3. 用户在没有登出的情况下,访问了网站B(攻击网站) 4. 网站B 伪造了一个 网站A ...

  6. oracle怎么查询重复的数据

    在oracle中,可以利用count()函数配合select查询语句来查询重复的数据,语法为"select userCode from user group by userCode havi ...

  7. 【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常

    1. 踩坑经历 最近做了个需求,需要调用第三方接口获取数据,在联调时一直失败,代码抛出javax.net.ssl.SSLHandshakeException异常, 具体错误信息如下所示: javax. ...

  8. 【Java】Java提取${}占位符并组装对应值

    目录 Java提取${}占位符并组装对应值 零.起因 壹.想法 贰.实现 叁.总结 肆.参考文档 Java提取${}占位符并组装对应值 实现了一个${}装配工~ 零.起因 最近写个JavaWeb项目, ...

  9. Spring AI与DeepSeek实战三:打造企业知识库

    一.概述 企业应用集成大语言模型(LLM)落地的两大痛点: 知识局限性:LLM依赖静态训练数据,无法覆盖实时更新或垂直领域的知识: 幻觉:当LLM遇到训练数据外的提问时,可能生成看似合理但错误的内容. ...

  10. Win10微软拼音输入法设置-注册表

    修改候选项窗口 HKEY_CURRENT_USER\Software\Microsoft\InputMethod\CandidateWindow\CHS\1 EnableFixedCandidateC ...