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. 内网环境部署Deepseek+Dify,构建企业私有化AI应用

    0.简介 公司为生产安全和保密,内部的服务器不可连接外部网络,为了可以在内网环境下部署,采用的方案为ollama(Docker)+Dify(Docker Compose),方便内网环境下迁移和备份,下 ...

  2. rust学习笔记(8)

    cargo cargo是一个用来帮助控制项目开发的工具 cargo.toml 这是一个用来管理项目的文件 首先是[package]部分 [package] name = "foo" ...

  3. mysql查询指定表所有的字段信息 columns

    show columns from 表名: desc 表名;(全写:describe 表名) show create table 表名;

  4. BGP四大属性

    **公认必遵**:Origin.AS_Path.Next_hop(所有BGP路由都必须识别这类属性,且必须在Update报文中传递,如果缺少就报错) Origin:指示路由信息的来源(如IGP.EGP ...

  5. 手把手教你下载b站视频并生成音频字幕

    1.下载b站视频: 可以直接使用https://bilibili.iiilab.com/ 贴进去网址就能下载了 2.提取音频 可以使用 ffmpeg 将音频文件提取出来(ffmpeg直接去官网下载即可 ...

  6. 数据质量框架QUalitis浅尝使用

    数据质量管理平台(微众银行)Qualitis+Linkis (一)Qualitis是一个数据质量管理系统,用于监控数据质量. 其功能包括: 数据质量模型定义 数据质量结果可视化 可监控 数据质量管理服 ...

  7. docker swarm CA证书到期

    1.现象 在portain平台查看日志,发现一些节点日志无法查看报错为:Error grabbing logs: rpc error: code = Unknown desc = warning: i ...

  8. cxDBTreeList:最简单的节点图标添加方法

    先在窗体上放ImageList关联到cxDBTreeList,在cxDBTreeList的GetNodeImageIndex事件中写如下: procedure cxDBTreeList1GetNode ...

  9. 学习unigui【19】unidbgrid的Group By This Field汉化

    上面已经将group by this field 汉化. 由于版本的不断更新,不可避免有汉化遗漏.那么说到 如何汉化问题. 根据ExtJSVersion查找你电脑响应目录文件D:\Program Fi ...

  10. Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式

    Jenkins pipeline jenkinsfile的两种写作方式,声明式和脚本式. 为什么需要pipeline? 在多年前Jenkins成为最流行的持续集成服务器的Jenkins 1.x时代,所 ...