[cf1305G]Kuroni and Antihype
对整个过程构造一张有向图,其中$(x,y)\in E$当且仅当$x$把$y$加入,且边权为$a_{x}$
显然这是一棵外向树森林,并再做如下两个构造:
1.新建一个点$a_{0}=0$,将其向所有入度为0的点连边
2.将所有边变为无向边,且边权修改为$a_{x}+a_{y}$($x$和$y$为两端点)
显然最终得到的是一棵树,并且这棵树能被某个过程得到当且仅当$\forall (x,y)\in E,a_{x}\and a_{y}=0$
另一方面,初始答案即边权和,第一个构造中新增的边边权为0,第二个构造中即每一个点都额外产生了原来入度次贡献,而除了0以外其余点入度均为1(而$a_{0}=0$不需要考虑),那么最终答案即边权和-$\sum_{i=1}^{n}a_{i}$
由于后者固定,问题也即求$E=\{(x,y,a_{x}+a_{y})\mid 0\le x,y\le n$且$a_{x}\and a_{y}=0\}$的最大生成树
考虑Boruvka算法,即维护若干个集合(初始每一个点均作为一个集合),并不断加入所有集合(向集合外)最大的出边,注意到每一次集合数回减小一半,最终轮数即$o(\log n)$
在每一轮中,需要求出该最大出边,不妨对每一个点都求出该最大出边即可
而对于$a_{x}$,即需要求出权值是$U\oplus a_{x}$的子集(其中$U$为全集)中与$x$不在同一个连通块中且权值最大的点,对每一个集合预处理其子集权值最大的和不在同一个连通块中权值次大的即可
关于这个,做一个类似于高维前缀和的操作即可
时间复杂度为$o(n\alpha(n)+m2^{m}\log n)$(其中$m\approx 18$),可以通过
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define M 18
5 #define ll long long
6 #define pii pair<int,int>
7 #define fi first
8 #define se second
9 struct Data{
10 pii mx,cmx;
11 }g[1<<M];
12 int n,a[N],fa[N];
13 ll ans;
14 pii f[N];
15 int find(int k){
16 if (k==fa[k])return k;
17 return fa[k]=find(fa[k]);
18 }
19 void merge(int x,int y,int z){
20 x=find(x),y=find(y);
21 if (x!=y){
22 fa[x]=y;
23 ans+=z;
24 }
25 }
26 Data merge(Data x,Data y){
27 if (x.mx<y.mx)swap(x,y);
28 if (find(x.mx.se)==find(y.mx.se))swap(y.mx,y.cmx);
29 x.cmx=max(x.cmx,y.mx);
30 return x;
31 }
32 int main(){
33 scanf("%d",&n);
34 for(int i=1;i<=n;i++){
35 scanf("%d",&a[i]);
36 ans-=a[i];
37 }
38 for(int i=0;i<=n;i++)fa[i]=i;
39 while (1){
40 bool flag=0;
41 for(int i=1;i<=n;i++)
42 if (find(i)!=find(0)){
43 flag=1;
44 break;
45 }
46 if (!flag)break;
47 for(int i=0;i<(1<<M);i++)g[i].mx=g[i].cmx=make_pair(-1,-1);
48 for(int i=0;i<=n;i++)g[a[i]]=merge(g[a[i]],Data{make_pair(a[i],i),make_pair(-1,-1)});
49 for(int i=0;i<M;i++)
50 for(int j=0;j<(1<<M);j++)
51 if (j&(1<<i))g[j]=merge(g[j],g[j^(1<<i)]);
52 for(int i=0;i<=n;i++)f[i]=make_pair(-1,-1);
53 for(int i=0;i<=n;i++){
54 int pos=(a[i]^((1<<M)-1));
55 pii o=g[pos].mx;
56 if (o.fi>=0){
57 if (find(i)==find(o.se))o=g[pos].cmx;
58 if (o.fi>=0)f[find(i)]=max(f[find(i)],make_pair(o.fi+a[i],o.se));
59 }
60 }
61 for(int i=0;i<=n;i++)
62 if (f[i].fi>=0)merge(i,f[i].se,f[i].fi);
63 }
64 printf("%lld\n",ans);
65 return 0;
66 }
[cf1305G]Kuroni and Antihype的更多相关文章
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- Codeforce-Ozon Tech Challenge 2020-D. Kuroni and the Celebration(交互题+DFS)
After getting AC after 13 Time Limit Exceeded verdicts on a geometry problem, Kuroni went to an Ital ...
- Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
To become the king of Codeforces, Kuroni has to solve the following problem. He is given n numbers a ...
- Codeforce-Ozon Tech Challenge 2020-B. Kuroni and Simple Strings(贪心)
B. Kuroni and Simple Strings time limit per test1 second memory limit per test256 megabytes inputsta ...
- Codeforce-Ozon Tech Challenge 2020-A. Kuroni and the Gifts
the i-th necklace has a brightness ai, where all the ai are pairwise distinct (i.e. all ai are diffe ...
- cf 1305 E. Kuroni and the Score Distribution
题目传送门:E. Kuroni and the Score Distribution 题目大意:给n和m,输出n个数,这些数里必须要有m对a[i]+a[j]==a[k] ( i < j < ...
- CF 1305E. Kuroni and the Score Distribution
题目大意:题目给定两个数n和m(1<=n<=5000,0<=m<=1e9)要求构造一个数列A,A中元素 大于等于1,小于等于1e9且满足严格递增 满足ai+aj=ak的(i,j ...
- Kuroni and the Punishment CodeForces - 1305F 随机函数mt19937 + 质因子分解
题意: 给你n个数,你每次操作可以对一个数加1或者减1,让你求你最少需要操作多少次可以使这n个数的公因子大于1 题解: 正常方法就是枚举质因子(假设质因子为x),然后对于这个数组中的数a[i],让a[ ...
- Codeforces 杂题集 2.0
记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序 1326D2 - Prefix-Suffix Palindrome (Hard version) ...
随机推荐
- SQL实例_11Oracle基本操作
前言导读 本章介绍了在正常使用Oracle数据库之前进行的常规操作 本章语句的运行需要子啊PLSQL软件中运行 本章导入导出语句需要在虚拟环境中直接运行 1 Oracle创建表空间和用户 --1 创建 ...
- 4 个场景揭秘,如何低成本让容器化应用 Serverless 化?
作者 | changshuai FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维.容量规划.云产品打通集成等责任,使得开发者可以专注业务逻辑.提高交付速度 ( ...
- 洛谷3571 POI2014 SUP-Supercomputer (斜率优化)
一道神仙好题. 首先看到有多组\(k\),第一反应就是离线. 考虑贪心. 我们每次一定是尽量选择有儿子的节点.以便于我们下一次扩展. 但是对于一个\(k\),每次贪心的复杂度是\(O(n)\) 总复杂 ...
- FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- AOP的简单介绍
1.AOP简介 AOP面向切面编程,采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.安全检查.缓存) SpringAOP使用纯java实现,不需要专门的编译过程和类加载器,在运行期间以代 ...
- scala基础篇---- Try finally不加catch的使用情形
普通的try-catch-finally Try{ } catch{//不加catch向上抛出异常 case _=> } finally{//一般是资源关闭 } 普通的try-finally ...
- RabbitMQ:从入门到搞定面试官
安装 使用docker安装,注意要安装tag后缀为management的镜像(包含web管理插件),我这里使用的是rabbitmq:3.8-management 1. 拉取镜像 shell docke ...
- 机器学习:EM算法
EM算法 各类估计 最大似然估计 Maximum Likelihood Estimation,最大似然估计,即利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程. 直白来讲,就 ...
- [火星补锅] 非确定性有穷状态决策自动机练习题Vol.3 T3 && luogu P4211 [LNOI2014]LCA 题解
前言: 这题感觉还是很有意思.离线思路很奇妙.可能和二次离线有那么一点点相似?当然我不会二次离线我就不云了. 解析: 题目十分清真. 求一段连续区间内的所有点和某个给出的点的Lca的深度和. 首先可以 ...
- 你一定不知道的Unsafe用法
Unsafe是什么 首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译过来是不安全的,这倒不是说这个类是不安全的,而是说开发人员使用Unsafe是不安全的,也就是不推 ...