题目大意:

给出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(巧妙的线段覆盖模型)的更多相关文章

  1. AtCoder AGC017C Snuke and Spells

    题目链接 https://atcoder.jp/contests/agc017/tasks/agc017_c 题解 很久前不会做看了题解,现在又看了一下,只想说,这种智商题真的杀我... 转化成如果现 ...

  2. 题解 [AGC017C] Snuke and Spells

    题目传送门 Description 有 \(n\) 个球排在一起,每个球有颜色 \(a_i\),若当前有 \(k\) 个球,则会将所有 \(a_i=k\) 的球删掉.有 \(m\) 次查询,每次将 \ ...

  3. CODEVS3037 线段覆盖 5[序列DP 二分]

    3037 线段覆盖 5   时间限制: 3 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Description 数轴上有n条线段,线段的 ...

  4. CODEVS1643 线段覆盖3[贪心]

    1643 线段覆盖 3   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 黄金 Gold 题解       题目描述 Description 在一个数轴上有n条线段,现要选 ...

  5. COGS 265线段覆盖[线段树]

    265. 线段覆盖 ★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操 ...

  6. CodeVS 线段覆盖1~5

    #include <bits/stdc++.h> using namespace std; ; struct Info{int l,r;}P[Maxn]; int n,Cnt,F[Maxn ...

  7. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  8. codevs 3012 线段覆盖 4 & 3037 线段覆盖 5

    3037 线段覆盖 5  时间限制: 3 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 数轴上有n条线段,线段的两端都 ...

  9. wikioi 3027 线段覆盖 2

    题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段 ...

随机推荐

  1. ASP.NET安全验证

    一.为什么要用安全验证,使用安全验证有什么好处. 构造特殊的链接地址,导致文件内的数据泄露 数据库泄露 安全防范的首要策略:所有的HTTP访问都要经过IIS,所以限制IIS的安全性是关键 二.安全验证 ...

  2. MySQL Waiting for table metadata lock的解决方法

    最近需要在某一个表中新增字段,使用Sequel Pro 或者Navicat工具都会出现程序没有反应,使用 show processlist 查看,满屏都是 Waiting for table meta ...

  3. HTML5—— 你肯定会用到的新知识

    HTML5 简介 语义化标签 新增结构标签 表单 多媒体 HTML5 简介 XML是更加严格的语言 是HTML和XHTML的结合 语义化标签 新增的语义化标签 header nav section a ...

  4. vue 数组数据更新或者对象数据更新 但是页面没有同步问题

    1,使用set函数来设置数据. 2,你可以通过 $forceUpdate 来做这件事.在数据赋值之后 就直接调用 this.$forceUpdata()

  5. 批量安装Python第三方库

    1.首先在python程序的文件夹内,新建一个文本文档,名字自定义,在文档中输入需要安装的第三方库,并用英文半角逗号隔开. import os def getTxt(): txt = open(&qu ...

  6. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  7. XML文件中关键字自动提示和不全配置

    一.获得mybatis-3-config.dtd.mybatis-3-mapper.dtd 这两个文件. 建立一个Maven的项目 在Pom.xml文件中的Mybatis jar包的下载设置(也可以从 ...

  8. 《UML大战需求分析》阅读笔记1

    通过阅读本书的序和第一章,让我对于UML的理解更加深刻了,并且懂了怎样把你UML学的更好. 作者先让我们明白什么是UML,大概知道了UML各个图的形态和各种用途,然后再详细的介绍各个图怎样使用. UM ...

  9. P1991 无线通讯网

    P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...

  10. P2212 [USACO14MAR]浇地Watering the Fields

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...