codeforces gym-101736 Farmer Faul 平衡树+并查集

题目

题目链接

题意

给出nn个整数,其中1n106
给出三种操作:

  • GROW x y,表示给xx位置的数增加y
  • MAGIC x,表示给所有的数增加xx
  • CUT x,表示把所有大于x的数切割到x,并输出本次切割割了多少。

题解

乍一看,似乎没有很符合这个题目情形的数据结构,我们需要把多种数据结构结合起来。

首先我们把所有的数值相同的元素都归并到一起(采用并查集的方法),并在这一个集合中找出一个关键的点(并查集的根节点)扔到平衡树里面去,平衡树的第一关键字是该并查集所具有的值,第二关键字是该并查集的根节点。

在这个基础下,GROW x y操作就相当于把x处的元素从它所在并查集中拆出来,拆成一个独立的点,然后给这个点的值加y,再把修改后的元素放入起所在的并查集中去。
时间复杂度:O(log(n))

MAGIC x操作就直接记录一个累加hh就好了,在查询的时候用到。
时间复杂度:O(1)

CUT x操作就相当于在平衡树中,找到所有的值大于等于x-h的并查集,计算好贡献以后,把所有的这些找到的并查集合并成为一个并查集,并且该并查集的值为x-h。

时间复杂度:O(CUT)O(两次CUT之间的操作数)

复杂度计算如果不对,请评论告知我。

注意

  1. 在这道题中并查集还应该记录一个属性,就是并查集的大小。
  2. 该并查集支持元素从并查集中剥离,因此需要为每个元素设置一个盒子,即idaida数组,当一个元素被剥离的时候,给元素一个新的盒子,原来的并查集结构保持不变,但是要求原来并查集的大小-1。

代码

#include <iostream>
#include <cstdio>
#include <set>
#define pr(x) cout<<#x<<":"<<x<<endl
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int maxn = 2e6;
int pa[maxn],sz[maxn];
void init(){ for(int i = 1;i < maxn;++i) pa[i] = i,sz[i] = 1;}
int find(int x){ return x == pa[x]?x:pa[x] = find(pa[x]);}
void join(int x,int y){int px = find(x),py = find(y);if(px != py) { pa[px] = py; sz[py] += sz[px];}
}
set<pii> st;
int id,ida[maxn],n,q,h,tmp,a[maxn];
char op[6];
void ins(int pid){auto it = st.lower_bound(make_pair(a[pid],0));if(it == st.end() || it->first != a[pid]) st.insert(make_pair(a[pid],pid));else join(pid,it->second);
}
int split(int pos){int pid = find(ida[pos]);  if(sz[pid] == 1) st.erase(st.find(make_pair(a[pid],pid)));else {sz[pid] --;ida[pos] = ++id;a[id] = a[pid];}return pid;
}
main()
{init();id = 0;scanf("%lld%lld",&n,&q);for(int i = 1;i <= n;++i) {scanf("%lld",&tmp);ida[i] = ++id;a[id] = tmp;ins(id);}while(q--){scanf("%s",op);if(*op == 'G'){int pos,x;scanf("%lld%lld",&pos,&x);int nid = split(pos);a[nid] += x;ins(nid);}else if(*op == 'M'){int x;scanf("%lld",&x);h += x;}else if(*op == 'C'){int x;scanf("%lld",&x);int ans = 0;auto it = st.lower_bound(make_pair(x-h,0));if(it == st.end()) {printf("0\n");continue;}pii p = make_pair(x-h,it->second);ans += (it->first+h-x)*sz[it->second];a[it->second] = x-h;int pid = it->second;it = st.erase(it);while(it != st.end()){ans += (it->first-x+h)*sz[it->second];join(it->second,pid);it = st.erase(it);}st.insert(p);printf("%lld\n",ans);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奶牛的交叉路(jzoj 1756)

奶牛的交叉路 题目大意&#xff1a; 有两个数轴&#xff0c;之间有n条线分别连接着两个数轴的点各一个&#xff0c;这些线可能会相交&#xff0c;问有多少条线没有和其他点相交 样例输入 4 -3 4 7 8 10 16 3 9样例输出 2数据范围限制 1<N<100000&#xff0c;-1…

.Net Core 环境下构建强大且易用的规则引擎

1. 引言1.1 为什么需要规则引擎在业务的早期时代&#xff0c;也许使用硬编码或者逻辑判断就可以满足要求。但随着业务的发展&#xff0c;越来越多的问题会暴露出来&#xff1a;逻辑复杂度带来的编码挑战&#xff0c;需求变更时改变逻辑可能会引起灾难重复性的需求必须可重用&am…

【最短路】【SPFA】单源最短路径 (luogu 3371)

单源最短路径 luogu 3371 题目大意&#xff1a; 求出一个点到其他点的最短路 原题&#xff1a; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&…

P59330-[清华集训2012]串珠子【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5933 题目大意 nnn个点的一张无向图&#xff0c;求所有联通子图的权值乘积和 解题思路 因为nnn很小&#xff0c;考虑状压 设fif_ifi​表示点集为iii时的方案数&#xff0c;我们发现正着做十分麻烦&#xff0c;考虑容斥。 首…

codeforces gym-101736 Dessert First Strategy 最小割

题目 题目链接 题解 很典型的最小割模型问题&#xff0c;我们知道颜色不确定的点最终要么是白色&#xff0c;要么是黑色&#xff0c;是两种对立的状态&#xff0c;我们联想到了最小割。 最小割是割掉权值和最小的边集&#xff0c;使得图中的点分成两个点集&#xff0c;一个…

在Windows 下如何使用 AspNetCore Api 和 consul

一、概念&#xff1a;什么是consul:Consul 是有多个组件组成的一个整体&#xff0c;作用和Eureka,Zookeeper相当&#xff0c;都是用来做服务的发现与治理。 Consul的特性&#xff1a;1、 服务的发现&#xff1a;consul可以把注册到其中的服务提供给使用者&#xff0c;也可以主动…

CF590E-Birthday【AC自动机,最大独立集】

正题 题目链接:https://www.luogu.com.cn/problem/CF590E 题目大意 nnn个字符串&#xff0c;求一个最大的集合使其中没有任何串是其他集合内字符串的子串 解题思路 先用ACACAC自动机建立好failfailfail树传递闭包就可以确定好两两之间的子串关系了&#xff0c;之后用网络流最…

【最短路】【SPFA】电车 (luogu 1346)

电车 luogu 1346 题目大意&#xff1a; 有n个点&#xff0c;要从一个点到另一个点&#xff0c;每个点连接着其他ai个点&#xff0c;到连接的第一个点路径长度为0&#xff0c;其他长度为1&#xff0c;求最短路 题目描述 在一个神奇的小镇上有着一个特别的电车网络&#xff…

网络流及建模专题(下)

前言 不断更新中… 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路。 本专题暂时包含三道题&#xff1a; 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 100212I: 使用网络流对图论中的边进行调整 codeforces 818G - Four Melodies: 费用…

CentOS 7.4 下 如何部署 AspNetCore 结合 consul

上篇我们讲到consul的概念&#xff0c;以及在WIN下如何使用&#xff1a; 在Windows 下如何使用 AspNetCore Api 和 consul步骤如下&#xff1a;1、安装虚拟机VM 2、下载安装 CentOS 7.4&#xff08;地址就不提供了&#xff09;这是安装示例&#xff1a; VM虚拟机安装CentOS 示例…

P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物&#xff0c;每个礼物对两个人有不同的价值&#xff0c;开始时AAA会送BBB一个礼物。 对于一个收到礼物的人&#xff0c;如果该礼物对他来说价值为valvalval&#xff0c;那么他会回…

【SPFA】最优贸易(luogu 1073)

最优贸易 luogu 1073 题目大意&#xff1a; 有n个城市和m条线路连接着这些城市&#xff08;当编号为1时是有向&#xff0c;2时是无向&#xff09;&#xff0c;从1城市出发到n城市&#xff0c;每个城市都有固定的水晶球价格&#xff08;进价和售价一样&#xff09;&#xff0…

Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

Demo路径&#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目&#xff0c;属于新特性之一&#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来&#xff0c;封装…

Problem H Rock Paper Scissors,FFT

题目 题目链接 题意 给出两段石头剪刀布的顺序SS和T" role="presentation" style="position: relative;">TT&#xff0c;其中TT要短一些,现在让你把T" role="presentation" style="position: relative;">TT往SS的…

CF1066F-Yet another 2D Walking【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1066F 题目大意 平面上有nnn个点&#xff0c;每个点在max(x,y)max(x,y)max(x,y)层&#xff0c;走第kkk层的点之前一定要先走前面层的点&#xff0c;求走完所有点的最短路。 解题思路 对于每一层来说&#xff0c;我们可以将…

【最短路】【SPFA】城市问题(ssl 1761)

城市问题 ssl 1761 题目大意&#xff1a; 求一个点到其它点的最短路 原题&#xff1a; Description 设有n个城市&#xff0c;依次编号为0&#xff0c;1&#xff0c;2&#xff0c;……&#xff0c;n-1&#xff08;n<100&#xff09;&#xff0c;另外有一个文件保存n个城…

.NET Core微服务之基于Ocelot实现API网关服务

一、啥是API网关&#xff1f;API 网关一般放到微服务的最前端&#xff0c;并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前的话&#xff0c;客户端不得不去请求微服务A&#xff08;假设为Customers&am…

P3157 动态逆序对 ,树状数组套动态开点线段树

题目 洛谷题目链接 题解 在求整体的逆序对的数量时&#xff0c;很好办&#xff0c;直接用树状数组处理即可&#xff0c;不过在这时&#xff0c;我们还需要处理出一个数组pa[]pa[]pa[]&#xff0c;其中pa[i]pa[i]pa[i]代表在区间[1,i)[1,i)[1,i)中满足aj>aia_j>a_iaj​…

【DP】猫咪的进化

猫咪的进化 题目大意&#xff1a; 有n个实数&#xff0c;每一个实数可以选&#xff0c;可以不选&#xff0c;也可以选择它的平方&#xff0c;但如果选择了它的平方&#xff0c;就不能选择下一个数或下一个数的平方&#xff0c;求选出来的数的和最大是多少 原题&#xff1a; …

[8.21NOIP模拟赛]决战【tarjan】

正题 题目大意 nnn个点mmm条边的联通图&#xff0c;去掉一个点使得其变为一棵树 求能去掉哪些点 解题思路 首先去掉后就是一棵n−1n-1n−1个节点的树&#xff0c;也就是有n−2n-2n−2条边&#xff0c;这样我们就需要去掉m−n2m-n2m−n2条边&#xff0c;也就是去掉入度为m−n2…