BZOJ3714 PA2014 Kuglarz 最小生成树
2024-10-18 22:34:28
题意:有$N$个盒子,每个盒子中有$0$或$1$个球。现在你可以花费$c_{i,j}$的代价获得$i$到$j$的盒子中球的总数的奇偶性,求最少需要多少代价才能知道哪些盒子中有球。$N \leq 2000 , 1 \leq c \leq 10^9$
初赛凉了,乖乖回来更以前没写的blog qwq
设$s_i$为盒子中球数的前缀和$(s_0 = 0)$,那么我们花费$c_{i,j}$就是得到$s_{i-1}$与$s_j$的关系,而我们知道$s_i,s_j$与$s_j,s_k$的关系之后,就能知道$s_i$与$s_k$的关系。我们可以考虑使用并查集维护这个关系,然后:咦这不就是$Kruskal$吗?然后跑遍最小生成树就出来了
反正我是有生之年不会想到这道题和最小生成树相关的了QuQ
还有Prim用堆优化真心卵用没有
#include<bits/stdc++.h> #define MAXN 2001 using namespace std; inline int read(){ ; ; char c; fread(&c , , stdin); while(!isdigit(c)){ if(c == '-') f = ; fread(&c , , stdin); } while(isdigit(c)){ a = (a << ) + (a << ) + (c ^ '); fread(&c , , stdin); } return f ? -a : a; } int Edge[MAXN][MAXN]; bool vis[MAXN]; priority_queue < pair < int , int > > q; int main(){ ; int N = read(); ; i <= N ; i++) for(int j = i ; j <= N ; j++) Edge[i - ][j] = Edge[j][i - ] = read(); q.push(make_pair( , )); while(!q.empty()){ int t = q.top().second; if(vis[t]){ q.pop(); continue; } ans += -q.top().first; vis[t] = ; q.pop(); ; i <= N ; i++) if(!vis[i]) q.push(make_pair(-Edge[t][i] , i)); } cout << ans; ; }
最新文章
- iPhone6/6 Plus兩款大屏智能機
- CDH安装失败了,如何重新安装
- Angularjs select的使用
- 安装cocoods
- Java IO操作
- c/c++ 数字转成字符串, 字符串转成数字
- sqlplus中";-S";和";-L";用法
- C# winform线程的使用 制作提醒休息小程序(长时间计算机工作者必备)
- 从[java.lang.OutOfMemoryError: Java heap space]恢复
- 探索Android该Parcel机制上
- node-canvas
- Thinking in scala (1)----类
- C/C++生成随机数
- DevOps之五 Tomcat的安装与配置
- 【vue】在移动端使用better-scroll 实现滚动效果
- salt使用技巧
- LG1912 [NOI2009]诗人小G
- JAVA中验证邮箱是否有效
- n阶方阵A可逆充分必要条件
- #6472. 「ICPC World Finals 2017」难以置信的任务 Mission Improbable
热门文章
- php使用PHPexcel类读取excel文件(循环读取每个单元格的数据)
- python 类函数,实例函数,静态函数
- ps -ef|grep ?解释
- Django 添加mdia文件目录路径
- 故障小记录:yum 安装报错File ";/usr/bin/yum";, line 30 except KeyboardInterrupt, e:
- [20180801]insert导致死锁.txt
- VS 函数,方法上方 引用等显示
- Postgre SQL连接服务器失败
- sql最简单的查询语句
- AIX mount nfs 文件系统失败