AGC017C Snuke and Spells(巧妙的线段覆盖模型)
题目大意:
给出n个球,每个球上都有数字,然后每次都进行如下操作
如果当前的球总共有k个,那么就把球上数字为k的所有球都消除掉
注意到,并不是每种情况都可以全部消光,所以你可以选择若干球,把它们标号改变,最后达到消光的目的
问最少需要改变几个球。
后面还跟着m个询问,每个询问会改变一个球的标号,问改变之后最少需要改变几个球才能消光。
题解:
大体先构建一个线段覆盖的模型,然后再证明这个模型是正确的
对于标号为i的球,覆盖线段[i-Ni, i](Ni为标号为i的球的个数)
每个球都做这样的覆盖,最后看[0, n]这段有多少没被覆盖的线段,有多少就是需要改变多少个球
证明:
首先如果线段全覆盖了,那么就不需要改变任何一个球
如果线段没有全覆盖,那么我们就需要改变一个球的标号i变成标号j
这样会使标号为i的线段覆盖减少1格,标号为j的线段的覆盖增加1格
那么每次最多只会减少一个没被覆盖的线段
所以最少就需要那么多球改变
根据这个模型,就很好写代码了
#include <iostream>
#include <cstdio>
#define fi first
#define se second
using namespace std;
const int maxn = 2e5 + ;
typedef pair<int, int> PII;
PII q[maxn];
int cnt[maxn], f[maxn], a[maxn];
int main()
{
int n, m;
cin>>n>>m;
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= m; i++) scanf("%d %d", &q[i].fi, &q[i].se);
for(int i = ; i <= n; i++) cnt[a[i]]++;
for(int i = ; i <= n; i++){
if(cnt[i]){
for(int j = max(, i-cnt[i]); j < i; j++) f[j]++;
}
}
int ans = ;
for(int i = ; i < n; i++) if(!f[i]) ans++;
for(int i = ; i <= m; i++){
int x = a[q[i].fi], y = q[i].se;
a[q[i].fi] = y;
if(x-cnt[x] >= ){
f[x-cnt[x]]--;
if(f[x-cnt[x]] == ) ans++;
}
cnt[x]--;
if(y-cnt[y]- >= ){
f[y-cnt[y]-]++;
if(f[y-cnt[y]-] == ) ans--;
}
cnt[y]++;
printf("%d\n", ans);
}
}
AGC017C Snuke and Spells(巧妙的线段覆盖模型)的更多相关文章
- AtCoder AGC017C Snuke and Spells
题目链接 https://atcoder.jp/contests/agc017/tasks/agc017_c 题解 很久前不会做看了题解,现在又看了一下,只想说,这种智商题真的杀我... 转化成如果现 ...
- 题解 [AGC017C] Snuke and Spells
题目传送门 Description 有 \(n\) 个球排在一起,每个球有颜色 \(a_i\),若当前有 \(k\) 个球,则会将所有 \(a_i=k\) 的球删掉.有 \(m\) 次查询,每次将 \ ...
- CODEVS3037 线段覆盖 5[序列DP 二分]
3037 线段覆盖 5 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的 ...
- CODEVS1643 线段覆盖3[贪心]
1643 线段覆盖 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选 ...
- COGS 265线段覆盖[线段树]
265. 线段覆盖 ★★☆ 输入文件:xdfg.in 输出文件:xdfg.out 简单对比时间限制:2 s 内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操 ...
- CodeVS 线段覆盖1~5
#include <bits/stdc++.h> using namespace std; ; struct Info{int l,r;}P[Maxn]; int n,Cnt,F[Maxn ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- codevs 3012 线段覆盖 4 & 3037 线段覆盖 5
3037 线段覆盖 5 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的两端都 ...
- wikioi 3027 线段覆盖 2
题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段 ...
随机推荐
- 【redis常用的键值操作及性能优化】
服务端 启动redis服务 { // -a:指定密码 -h:指定主机 -p:指定端口 } //让redis 服务中断崩溃 //保存和关闭 //后台备份 //设置登录密码 //redis-benchma ...
- nginx配置SSL证书/强制跳转与非强制跳转
支持强制跳转HTTPS server { listen 80; server_name www.test.com; rewrite ^(.*)$ https://${server_name}$1 pe ...
- 2648: SJY摆棋子
2648: SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 分析: k-d tree 模板题. 代码: #include< ...
- Jexus支持HTTPS协议
众所周知,在HTTPS页面请求HTTP资料的时候,现代浏览器会拦截,提示用户是否继续,或者直接拦截,提示都不出来. 最近给自己做了个快速书签工具,点击书签就直接把书签发送到服务器地址,然后保存到我的网 ...
- Eclipse 导入项目与 svn 插件关联全过程记录
文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...
- java字符流实现文件间的内容复制
package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...
- allegro导入网表过程中出现的错误信息
1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...
- 深入浅出 Webpack
深入浅出 Webpack 评价 Webpack 凭借强大的功能与良好的使用体验,已经成为目前最流行,社区最活跃的打包工具,是现代 Web 开发必须掌握的技能之一.作者结合自身的实战经验,介绍了 Web ...
- Pc移植到Mac的技术细节
1.样式不对: 2.布局不对: 3.Mac的菜单替换PC的菜单: Mac的菜单替换PC的菜单: 1)左上角图标没有手动添加且不需要添加的情况下出现,而且点击是Help菜单内容: 2)把HelpBtn和 ...
- Python 3基础教程31-urllib模块
本文介绍Python里的urllib模块,这个urllib主要处理web服务的,如果需要做接口测试,或者写Python的网络爬虫,这个urllib就是最底层的库.需要用到里面的请求方法等. 1. 先看 ...