BZOJ4886 [Lydsy1705月赛]叠塔游戏[基环树]
很妙的一道题。
由于本人过于zz,不会这道题,通过厚颜无耻翻阅题解无数终于懂了这道题,所以这里转载一位神仙的blog。
没有看懂?没事,再来一篇。
这题个人认为主要在于转化题意和建图,这两点想通了应该就不难了。
转化题意:每个长只要互不相等即可,不管什么严格大于。
建图:限制了每个长只能被选一次,另一边作为价值。有没有条件限制感觉和上一篇博客相像?长和宽代表的两个点之间建一条边,从长到宽的方向代表以长为底,反向则以宽为底。然后限制每个点出度最多为1.
图建出来,我们只要定向时满足每个点至多出度为1,就可以。题目有保证了有解,也就是不会出现有点迫不得已出度超过1的情况,所以我们只要放心讨论怎么怎么定向使得入度对应的点权最大即可。
然后发现并不需要定向,按照上面地址里的方法讨论连通性即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
int n;
struct thxorz{int to,nxt;}G[N<<];
int Head[N<<],cnt,tot,edge,vertex,maxv;
ll ans;
inline void Addedge(int x,int y){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot;
}
int deg[N<<],val[N<<],vis[N<<];
map<int,int> mp;
#define y G[j].to
inline int dfs(int x){
vis[x]=;++vertex;edge+=deg[x];
MAX(maxv,val[x]);ans+=(deg[x]-)*1ll*val[x];
for(register int j=Head[x];j;j=G[j].nxt)if(!vis[y])dfs(y);
}
#undef y
int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(n);
for(register int i=,x,y;i<=n;++i){
read(x),read(y);
int cx=mp.find(x)==mp.end()?mp[x]=++cnt:mp[x];
int cy=mp.find(y)==mp.end()?mp[y]=++cnt:mp[y];
Addedge(cx,cy);++deg[cx],++deg[cy],val[cx]=x,val[cy]=y;
}
for(register int i=;i<=cnt;++i)if(!vis[i]){
edge=vertex=maxv=;dfs(i);edge>>=;
if(edge<vertex)ans+=maxv;
}
return printf("%lld\n",ans),;
}
总结:这种神仙建图题没有办法总结。只能积累技巧,善于转化问题。
BZOJ4886 [Lydsy1705月赛]叠塔游戏[基环树]的更多相关文章
- BZOJ4886: [Lydsy1705月赛]叠塔游戏(环套树森林&贪心)
4886: [Lydsy1705月赛]叠塔游戏 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 198 Solved: 76[Submit][Stat ...
- bzoj4886 [Lydsy2017年5月月赛]叠塔游戏
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4886 [题解] 跟bzoj4883:http://www.cnblogs.com/galax ...
- 题解 [BZOJ4886] 叠塔游戏
题面 解析 这是个有趣的建图题啊. 首先我们可以发现,宽度严格递增是没什么用的. 因为实际上我们在旋转完以后, 矩形的顺序是可以随便排的. 因此只要保证宽度互不相同就行了. 然后,我们对长和宽离散化, ...
- 【BZOJ4883】 [Lydsy1705月赛]棋盘上的守卫(最小生成树,基环树)
传送门 BZOJ Solution 考虑一下如果把行,列当成点,那么显然这个东西就是一个基环树对吧. 直接按照\(Kruscal\)那样子搞就好了. 代码实现 代码戳这里
- [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]
题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...
- bzoj4883 [Lydsy1705月赛]棋盘上的守卫 最小生成基环树森林
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4883 题解 每一行和每一列都必须要被覆盖. 考虑对于每一行和每一列都建立一个点,一行和一列之间 ...
- BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小环套树森林&优化定向问题)
4883: [Lydsy1705月赛]棋盘上的守卫 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 475 Solved: 259[Submit][St ...
- BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)
4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 359 Solved: 205[Submit][Stat ...
- 【题解】【LibreOJ Beta Round #5】游戏 LOJ 531 基环树 博弈论
Prelude 题目链接:萌萌哒传送门♪(^∇^*) Subtask 1 & 2 这是什么鬼题面... 首先要看出,这就是一个基环树博弈. 具体题意:给出一个基环内向树,一个棋子初始在\(1\ ...
随机推荐
- C#开发者必须知道的13件事情
1.开发流程 程序的Bug与瑕疵往往出现于开发流程当中.只要对工具善加利用,就有助于在你发布程序之前便将问题发现,或避开这些问题. 标准化代码书写 标准化代码书写可以使代码更加易于维护,尤其是在代码由 ...
- openssl交叉编译
目录 openssl交叉编译 title: openssl交叉编译 date: 2019/12/18 21:09:33 toc: true --- openssl交叉编译 tar xvf openss ...
- PCM-FTL
1. 运行时第一行需要是write 错误位置 trace_stat->sectors += length;
- idea开发shell脚本并运行
参考:https://blog.csdn.net/u012443641/article/details/81295999 IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件, ...
- 在C#中简单使用gRPC
一.引言 本文采用gRPC官方提供的一个教程例子,通过这个例子可以学习到在.proto文件中定义服务.使用protocol buffer编译器生成服务器和客户端代码.使用C#gRPC API为您的服务 ...
- python进程池 使用Queue实现计数功能
多进程中各个进程间相互隔离,进程间通信需要使用到通道. 多进程中使用Queue实现进程中通信 from multiprocessing import Process,Queue import time ...
- win10从零安装eclipse并配置SVN和Maven
原因:公司的新电脑,重新安装eclipse并通过SVN检入项目,中间经历了各种坎坷,终于在周五配置项目并启动成功:在此记录一下,给后来人以警戒,同时自己也可以常温常新. 刚开始安装的是eclipse4 ...
- 对Python中print函数参数的认识
输出函数是最常用的,对print()参数的准确认识尤为重要. sep='':sep参数表示函数中不同value的分隔符,默认为一个空格. end='':end参数表示函数结尾的处理,默认换行. 例如: ...
- Pycharm超级好用的快捷键——效率之王
Pycharm超级好用的快捷键--效率之王 IT界老黑 IT界老黑 带你领略Python的魅力 关注他 270 人赞同了该文章 最重要的快捷键 ctrl+shift+A:万能命令行 shift两次: ...
- Windows一键设置环境变量(以设置java环境变量为例)
右击以管理员方式运行 JDKSetting.bat @echo off color 0a echo.------------------------------------ echo.TODO:设 ...