2021NOI 省选训练赛day1T1 A. light
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
这道题的思考过程分为两个部分。
- 暴力处理。
- 对于要修改的颜色的灯的数量进行根号分治。
暴力:只有当要修改的灯的两侧的灯的亮灭情况相同时,才会对答案造成影响(\(\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的更多相关文章
- 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs
MS Memory Limit:65536KB 64bit IO Format:%lld & %llu SubmitStatusid=14946">Practice ...
- 省选训练赛第4场D题(多米诺骨牌)
题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Vasya很喜欢排多米诺 ...
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
- 10.0.0.55_12-16训练赛部分writeup
0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...
- Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)
Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...
- Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)
Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- HDU6578 2019HDU多校训练赛第一场 1001 (dp)
HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...
- HDU6579 2019HDU多校训练赛第一场1002 (线性基)
HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...
- ACM训练赛:第20次
这次的题思维都很强,等之后的考试结束会集中精力重新训练一些思维题. A - A simple question CodeForces - 520B 思路: 直接看的话,很容易发现如果 \(n > ...
随机推荐
- @SpringBootApplication自动配置原理
@EnableAutoConfiguration 是核心,他会调用一个@Import注解.我们已知Import自动配置得实现是通过创建ImportSelector 接口的实现类并重写里面selectI ...
- java的三大版本、特性和优势
Write Once Run AnyWhere 版本: JavaSE:标准版(桌面程序.控制台开发) JavaME:嵌入式开发(手机.家电...) JavaEE:E企业级开发(web端.服务端开发) ...
- 0基础的人关于C++多态产生的一系列疑问
之前在面试的时候被问过懂不懂C++,懂不懂"多态".我之前搞科研一直在用Python,不会C++.完全没听过"多态"这个词,只听说过"多模态" ...
- zstd压缩算法概述与基本使用
本文仅关注zstd的使用,并不关心其算法的具体实现 并没有尝试使用zstd的所有功能模式,但是会简单介绍每种模式的应用场景,用到的时候去查api吧 step 0:why zstd? zstd是face ...
- MySQL 是否可以用 Docker 容器化?
容器 容器是为了解决 "在切换运行环境时,如何保证软件能够正常运行",容器是轻量级应用代码包,它包含在任何环境中运行所需的所有元素的软件包.容器可以虚拟化操作系统,包含依赖项,例如 ...
- 裸金属架构之服务器安装VMWare ESXI虚拟化平台详细流程
目录1. 裸金属架构(Vcent)2. Vcent安装流程2.1 远程控制端(个人电脑)安装VMware-viclien2.2 服务器部署安装VMWare ESXI2.3 VMware-viclien ...
- Hack The Box-Chemistry靶机渗透
通过信息收集访问5000端口,cif历史cve漏洞反弹shell,获取数据库,利用低权限用户登录,监听端口,开放8080端口,aihttp服务漏洞文件包含,获取root密码hash值,ssh指定登录 ...
- unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】
uniTreeVviewc创建一个tree,显示患者姓名(PatientName).因为需要用到患者ID(PatientID),所以使用help: TPatientTreeNode = class(T ...
- 如何确定dbgrid选择的是记录而不是分组
with cxgrdbtblvwGrid1DBTableView1.Controller do if FocusedRecord is TcxGridDataRow then begin i := c ...
- 12.ZIP伪加密
题目是伪加密,打开压缩包,发现里面直接放着flag.txt,但是好像需要输入密码,此时我们在不看题目的第一反应就是破解,但是无果,看了别人的wp之后,了解了一点伪加密. ZIP文件分为:压缩源文件数据 ...