首页 > 其他分享 >Solution - Codeforces 1725K Kingdom of Criticism

Solution - Codeforces 1725K Kingdom of Criticism

时间:2024-11-15 15:00:06浏览次数:1  
标签:Kingdom Criticism 1725K int sum varphi set mathcal 操作

首先考虑转化一下操作 \(3\)。
令 \(m = \lfloor\frac{l + r}{2}\rfloor\),操作 \(3\) 就相当于是在 \([l, m]\) 内的数变为 \(l - 1\),在 \((m, r]\) 内的数变为 \(r + 1\)。

于是现在对于操作 \(3\) 其实就是将一个区间内的数都转为同一个值。
其实对于这类将大量信息整合为一体的题目,往往运用势能分析能得到更优美的结果。

先给出对应的做法,再对时间复杂度进行一定的分析。

考虑把相同的 \(a_i\) 放在一起处理,因为这些值肯定对于 \(3\) 操作也是共同变化的。
那么就可以用并查集保存信息,每个位置在并查集上对应找到的祖先就为其对应的权值,同时用 set 维护下所有的不同的值和对应的并查集的点的编号。

  • 对于操作 \(1\),直接新开一个节点表示 \(a_x = y\) 即可,同时在 set 中删去 \(a'_x\) 的信息(若存在),并加入 \(a_x\) 的信息。
  • 对于操作 \(2\),直接并查集查祖先即可。
  • 对于操作 \(3\),以将 \([l, m]\) 内的值变为 \(l - 1\) 举例。
    考虑新建一个表示值 \(l - 1\) 的点,然后直接暴力在 set 中枚举在区间内的值,直接删去这些信息并把其在并查集中的父亲改为新建的 \(l - 1\) 的点。
    最后在 set 加入 \(l - 1\) 的点的信息即可。

对于操作 1 和 2,显然单次的复杂度为 \(\mathcal{O}(\log n)\)。

这里着重考虑操作 \(3\) 暴力的时间复杂度。

考虑令势能函数 \(\varphi(i)\) 为第 \(i\) 次操作后不同的 \(a_i\) 的值的数量。

  • 如果是 \(2\) 操作,因为不会使数发生改变,于是有 \(\varphi(i) = \varphi(i - 1)\)。
  • 如果为 \(1\) 操作,那么其实就是删一个数加一个数,肯定势能变化不会超过 \(+ 1\),于是有 \(\varphi(i) \le \varphi(i - 1) + 1\)。
  • 如果为 \(3\) 操作,不妨先只考虑一半。
    考虑到这个时候因为会多加入一个值,\(\varphi(i)\) 可能会多 \(1\)。
    对于暴力删除,设删除了 \(c\) 个不同的值,那么就有 \(\varphi(i) \le \varphi(i - 1) - c + 1\),此时对应的代价为 \(\mathcal{O}(c\log n)\)。

那么有 \(\varphi(q) \le \varphi(0) + \sum\limits_{i = 1}^q [op_i = 1] + 2\sum\limits_{i = 1}^q [op_i = 3] - \sum c\le n + 2q - \sum c\)。
又因为有 \(\varphi(q) > 0\),所以可以知道 \(\sum c < n + 2q\)。
那么总代价 \(\mathcal{O}(\sum c\log n)\) 就是 \(\mathcal{O}((n + q)\log n)\) 级别的了。

于是时间复杂度就为 \(\mathcal{O}((n + q)\log n)\)。

#include<bits/stdc++.h>
constexpr int maxn = (4e5 + 10) * 3;
int fa[maxn], val[maxn];
inline int getfa(int x) {
   return ! fa[x] ? x : (fa[x] = getfa(fa[x]));
}
std::set<std::pair<int, int> > s;
int a[maxn], id[maxn];
int main() {
   int n, q, m = 0;
   scanf("%d", &n);
   for (int i = 1; i <= n; i++) {
      scanf("%d", &a[i]);
      val[++m] = a[i], s.emplace(a[i], m), id[i] = m;
   }
   scanf("%d", &q);
   for (int op; q--; ) {
      scanf("%d", &op);
      if (op == 1) {
         int x, y;
         scanf("%d%d", &x, &y);
         if (s.find({a[x], id[x]}) != s.end()) {
            s.erase({a[x], id[x]});
         }
         val[++m] = a[x] = y, s.emplace(y, m), id[x] = m;
      } else if (op == 2) {
         int x;
         scanf("%d", &x);
         printf("%d\n", val[getfa(id[x])]);
      } else {
         int l, r;
         scanf("%d%d", &l, &r);
         int mid = l + r >> 1;
         val[++m] = l - 1;
         for (auto it = s.lower_bound({l, 0}); it != s.end() && (*it).first <= mid; ) {
            fa[(*it).second] = m;
            it = s.erase(it);
         }
         s.emplace(l - 1, m);
         val[++m] = r + 1;
         for (auto it = s.lower_bound({mid + 1, 0}); it != s.end() && (*it).first <= r; ) {
            fa[(*it).second] = m;
            it = s.erase(it);
         }
         s.emplace(r + 1, m);
      }
   }
   return 0;
}

标签:Kingdom,Criticism,1725K,int,sum,varphi,set,mathcal,操作
From: https://www.cnblogs.com/rizynvu/p/18547917

相关文章

  • 哈莫尼斯 手工王国 Harmonis the hand made kingdoms,官方中文,解压即玩,
    游戏截图 哈莫尼斯手工王国HarmonisthehandmadekingdomsHarmonis:手工王国是一款极简策略游戏,让您的创造力成为中心舞台。通过独特的瓷砖塑造生机勃勃的王国,每一块瓷砖都为一个充满活力和动态的世界做出贡献。从郁郁葱葱的森林到干旱的沙漠,探索各种生物群落,并在您......
  • CodeForces - 1336A Linova and Kingdom
    CodeForces-1336A就差一点点,很可惜,少发现个很显而易见的结论就是一个点的价值,实际上就是(这个点的深度-之后的点的数目)就是\(depth_i-size_i\)然后只要用dfs维护就好了然后把一个点的价值用STL优先队列放在一起,贪心完成。但是可能也算不上什么贪心,因为是很朴素的东西......
  • 中英双语介绍英国(The United Kingdom)以及Great Britain为什么翻译成大不列颠?
    英国简介中文版英国,全称大不列颠及北爱尔兰联合王国(TheUnitedKingdomofGreatBritainandNorthernIreland),位于欧洲西北部,由英格兰、苏格兰、威尔士和北爱尔兰组成。以下是对英国的详细介绍,包括其地理位置、人口、经济、教育、文化和主要城市。Source:GoogleMap地......
  • CF613D Kingdom and its Cities
    CF613DKingdomanditsCities虚树优化dp考虑无解的情况,若有两个重要城市相邻,那么无解。对于有解的情况,朴素的如何求解最少占领的城市数?考虑从叶子节点开始向上贪心,假如当前\(u\)节点为关键点,那么对于它的子树\(v\),若它的关键点能到\(v\),就要和他断开。如果\(u\)节点不......
  • CF685E Travelling Through the Snow Queen's Kingdom
    题意给定一张图,走出当前边的时间为\(i\)。\(q\)次询问,问\(s\)是否能在\(l\tor\)中走到\(t\)。Sol考虑将边从大到小插入图中。注意到当前边只能对起点造成贡献。复杂度\(O(n\times\max\{n,m\})\)Code#include<iostream>#include<algorithm>#include<cstd......
  • T399750 Cell kingdom(Hard) 题解
    LinkT399750Cellkingdom(Hard)Qustion第一天产生\(1\)个细胞,之后的每一天,一个细胞都会分裂成\(8\)个和自己一样的细胞,每个细胞在第三天都会自爆并且带走当天产生的\(6\)个细胞,求第\(x\)天有多少细胞Solution我们设\(F[i]\)表示第\(i\)天产生的新细胞个数那么可......
  • Kingdom
    KingdomUVA题目描述平面有\(n\)个城市,初始时城市之间没有任何双向道路连接。你的任务是依次执行以下任务:roadAB:在城市\(A\)和城市\(B\)之间连接一条双向道路,保证这条道路不和其他道路在非端点处相交。lineC:询问一条\(y=C\)的水平线和多少个州相交,以及这些州一......
  • 【大联盟】20230714 T1 三分网络(tri) 题解 CF1666K 【Kingdom Partition】
    题目描述here。题解赛时得分:\(30/30\),想了很久网络流最后不会。感觉这题就纯纯对脑洞,因为把题目中的\(2\)改成\(3\)就做不了)))不过还是相当有意思的。考虑如下建模方式:首先,考虑最小割。对于每个点\(i\),我们用两个点\(x_{i}\),\(y_i\)来表示。\(x_i\)表示\(i\)号点是......
  • AtCoder Regular Contest 109 F 1D Kingdom Builder
    洛谷传送门AtCoder传送门考虑判断一个终止态是否可达。如果只有一个棋子连续段那一定可达;否则就存在\(\ge2\)个连续段。此时把放棋子看成删除,那么限制就是如果删除一个孤立的棋子(两边没有棋子)且还有别的格子有棋子,这个棋子的颜色异于其他连续段的两边棋子的颜色。设第一......
  • CF1666K Kingdom Partition 题解
    神仙网络流题。Description传送门Solution考虑最小割,将每个点\(u\)拆成\(L_u,R_u\)两个点。对于每一条原图中的边\((u,v,w)\),连双向边\((L_u,R_v,w),(L_v,R_u,w)......