CF1491A K-th Largest Value 题解
2024-09-05 00:28:20
Content
你有一个长度为 \(n\),并且仅包含 \(0/1\) 的数组 \(a\)。现在对这个序列做以下两种操作之一共 \(q\) 次:
- \(1\) \(x\):将 \(a_x\) 修改为 \(1-a_x\)。
- \(2\) \(k\):查询这个数组的第 \(k\) 大数。
对于每次操作 \(2\),输出答案。
数据范围:\(1\leqslant n,q\leqslant 10^5\)。
Solution
乍一看需要什么数据结构,其实不需要。
由于这个数组仅有 \(0\) 或 \(1\)。因此我们很容易想到查询第 \(k\) 大数的判断:如果当前数组里面 \(1\) 的个数 \(\geqslant k\),那么这个序列的第 \(k\) 大数是 \(1\),否则就是 \(0\)。理由很容易想清楚,这里不再多解释。至于修改操作直接模拟就好了。
同时,我们开两个计数器用来统计当前数组的 \(0\) 和 \(1\) 的个数,初始化为输入的数组中 \(0\) 和 \(1\) 的个数,随每次修改操作改变。具体来说,如果要修改的是 \(1\),那么 \(1\) 的个数减 \(1\),\(0\) 的个数加 \(1\);修改的是 \(0\),就把 \(0\) 的个数减 \(1\),\(1\) 的个数加 \(1\)。总之就是一句话:修改谁,就把谁的个数减 \(1\),另外一个数的个数加 \(1\)。
若还有不懂的地方可以参考一下下面给出的代码实现。
Code
int n, m, a[100007], num0, num1;
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = Rint, m = Rint;
F(i, 1, n) {
a[i] = Rint;
num0 += (a[i] == 0), num1 += (a[i] == 1);
}
while(m--) {
int op = Rint, x = Rint;
if(op == 1) {
if(a[x]) num1--, num0++;
else num0--, num1++;
a[x] = 1 - a[x];
} else printf("%d\n", x <= num1 ? 1 : 0);
}
return 0;
}
最新文章
- BZOJ 3524: [Poi2014]Couriers [主席树]
- eclipse下的emacs风格快捷键
- Thread safety
- 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
- 阻止Infinitescroll.js无限滚动加载页面解决方法
- execl执行解释器文件以及shell命令
- TexturePacker的使用
- python有序字典实现代码
- 【转】VirtualBox direct access to SD Card in Windows--不错
- New Year Tree 【DFS序+先段数区间查询修改+二进制保存状态】
- 时间处理之strtotime
- 剑指Offer-删除链表中重复的结点
- IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题
- [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.1 一维反应流体力学方程组
- select获取选中的option(包含value和text,重点是text怎么获取)
- centos7 安装xinetd,telnet
- 版本控制工具Git的复杂用法的情境分析
- Chrome 调试技巧: 调整网速
- Java 8.9 游戏:井字游戏(C++&Java)
- Scala_控制结构
热门文章
- idea解决Command line is too long. Shorten command line for ServiceStarter or also for Application报错
- C#.NET 操作Windows服务(安装、卸载)
- CSP2020 自爆记
- Unique Path AGC 038 D
- R语言与医学统计图形【8】颜色的选取
- mysql-加密函数AES_DECRYPT函数
- Python爬虫3大解析库使用导航
- Linux-centos7设置静态IP地址
- 强化学习实战 | 自定义Gym环境之井字棋
- c/c++在线编译Output Limit Exceeded(OLE)错误