首页 > 其他分享 >[AGC017C] Snuke and Spells

[AGC017C] Snuke and Spells

时间:2024-10-05 14:00:00浏览次数:9  
标签:idx -- AGC017C ++ 类球 Snuke isl include Spells

题意

给定 \(n\) 个球,每个球上有一个数字 \(a_i\)。

每当魔法少女施展魔法时,会将写着当前球的数量的球全部消除。

\(q\) 次修改球的值,你需要在基础上修改最小的次数使得这 \(n\) 个球可以被魔法少女消除,求出你修改的最小次数。

\(n \le 2 \times 10 ^ 5\)。

Sol

神题!

由于修改至多一个球,因此答案至多变化 \(1\)。

没用。

考虑按照 \(a_i\) 的大小排序,将每类球合并,设 \(i\) 类球的个数为 \(a'_i\),可以得到:\(i = \sum_{j < i} a'_j\)。

也就是说,第 \(i\) 类球恰好占满了上一个有球的位置 \(j\) 到 \(i\) 的空位,即 \([j + 1, i]\)。

注意到这 \(n\) 类球恰好有 \(n\) 个,恰好占满了 \(n\) 个位置,因此显然操作次数的下界就为空位数。

做完了,开个桶记录一下每个下标球的个数即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

const int N = 2e5 + 5;

array <int, N> isl, idx;
array <int, N> s;

bool _edmer;
int main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
    int n = read(), q = read(), ans = n;
    for (int i = 1; i <= n; i++) {
        s[i] = read(), idx[s[i]]++;
        if (s[i] - idx[s[i]] >= 0) {
            if (!isl[s[i] - idx[s[i]]]) ans--;
            isl[s[i] - idx[s[i]]]++;
        }
    }
    while (q--) {
        int x = read(), y = read();
        if (s[x] - idx[s[x]] >= 0) {
            isl[s[x] - idx[s[x]]]--;
            if (!isl[s[x] - idx[s[x]]]) ans++;
        }
        idx[s[x]]--;
        s[x] = y;
        idx[s[x]]++;
        if (s[x] - idx[s[x]] >= 0) {
            if (!isl[s[x] - idx[s[x]]]) ans--;
            isl[s[x] - idx[s[x]]]++;
        }
        write(ans), puts("");
    }
    return 0;
}

标签:idx,--,AGC017C,++,类球,Snuke,isl,include,Spells
From: https://www.cnblogs.com/cxqghzj/p/18447813

相关文章

  • ARC063F Snuke's Coloring 2
    Day\(4!\)。首先容易找到周长为\(2(w+1)\)和\(2(h+1)\)的矩形,所以答案下界是\(2(\max(w,h)+1)\)。考虑按照整个矩形中心坐标,将矩形分成\(4\)个子矩形,观察到若有矩形完全包含于其中一个子矩形,则其周长必不超过\(2\max(w,h)\),必然不是最优解。所以最优解一定被直线\(2x=......
  • [ABC305C] Snuke the Cookie Picker题解
    题目大意有一个\(H\timesW\)的网格,一种有一个矩形,矩形中间有一个点被挖空,求这个点的坐标。(.表示空白,#表示矩形内的点)解析观察我们可以发现,每一矩形内的个点上下左右至少会有两个是#。如图:而每一个在矩形外的点上下左右最多只有一个#。所以我们只需要找的一个.的上......
  • CF1398E Two Types of Spells 题解 set
    题目链接:https://codeforces.com/problemset/problem/1398/E题目大意你有一个集合,初始为空。有两种类型的元素,一种是普通元素,一种是强化元素,两种元素都有一个数值。有\(n\)次操作,每次操作会往集合中加入一个元素或者删除一个元素。每次操作后,你都需要确定集合中元素的一个......
  • [AGC031E] Snuke the Phantom Thief
    ProblemStatementAmuseumexhibits$N$jewels,Jewel$1,2,...,N$.ThecoordinatesofJewel$i$are$(x_i,y_i)$(themuseumcanberegardedasatwo-dimen......
  • 【luogu AGC031E】Snuke the Phantom Thief(网络流)
    SnukethePhantomThief题目链接:luoguAGC031E题目大意有n个特殊点分布在二维平面上,每个点有坐标和价值。你要选一些点,总价值是你选的点的价值和。然后有一些约束,......
  • [ABC266Ex] Snuke Panic (2D)
    ProblemStatementTakahashiistryingtocatchmanySnuke.Therearesomepitsinatwo-dimensionalcoordinateplane,connectedtoSnuke'snest.Now,$N$Snuke......
  • AT2300 Snuke Line
    AT2300SnukeLine为什么你们不是主席树就是树状数组,发一个数论分块做法。链接:https://www.luogu.com.cn/problem/AT2300题目描述:有一趟列车有\(M+1\)个车站,从\(0\)......
  • AtCoder Beginner Contest 266 Ex Snuke Panic (2D)
    AtCoder传送门洛谷传送门考虑dp,\(f_i\)设在\(t_i\)时刻到达第\(i\)个点,能获得的最大收益。转移:\(f_i=f_j+a_i\),其中\(j\)能转移到\(i\)的充要条件有:\(......
  • ABC266 Ex - Snuke Panic (2D)
    ABC266Ex-SnukePanic(2D)挺好的一道题(不过调了好久QAQ方法一比较暴力的做法。首先,你容易想到一个DP状态:\(f(t,x,y)\)表示在\(t\)时刻到达\((x,y)\)的最......
  • "蔚来杯"2022牛客暑期多校训练营9 G Magic Spells
    原题链接一开始manacher+单哈希wa,样例通过率97%,应该是卡了一手int_64自然溢出换成manacher+双哈希过了#include<bits/stdc++.h>usingnamespacestd;#definefr......