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\ ...
随机推荐
- MyBatis使用技巧、总结、注意事项
目录 1.mybatis的官方文档地址 2.其他技巧: 2.1 如何在代码中拼接 like %% 2.2 数据库比较时日期的错误操作 2.2.1 异常情况: 2.2.2 为什么会在后面指定jdbcTy ...
- Django之会话机制cookie、session使用
login视图函数: def login(request): if request.method == 'POST': username = request.POST.get('username') ...
- pandas越来越难学,只能自己找趣味了,你该这么学,No.11
啊,大海啊,全是水 pandas啊,全是坑 没错,今天继续学习难的 其实从这篇开始,每一篇都是难得...... 你必须要努力看了 文末有彩蛋 分层/多级索引 我们先创建一个分层索引,看看效果 这个创建 ...
- jquery设置input不可编辑,背景变灰,鼠标变禁止
先看效果 $("#id").attr("onfocus", "this.blur()"); $("#id").css(& ...
- [转帖]centos7上设置中文字符集
centos7上设置中文字符集 https://www.cnblogs.com/kaishirenshi/p/10528034.html author: headsen chen date: 201 ...
- python 基础例子 双色球 查询天气 查询电话
# 随机生成双色球import random# 随机数 1-16之间# r = random.randint(1,16)# print(r)phone_numbers_str = "匪警[1 ...
- 第1章:Python语言与Linux系统管理
1.Python语言为什么流行 1).简单易学 2).丰富强大的库 3).开发效率高 2.Python语言有什么缺点 1).Python的执行速度不够快 2).Python的GIL锁限制并发:GIL是 ...
- element-ui当中table组件的合并行和列的属性:span-method的用法
背景 最近基本上都是以Vue来构建项目,而UI框架也基本上都是使用的element-ui,所以里面组件用的也是越来越多,今天想记录的是非常非常小的一个属性的用法. Table组件 Table组件用了真 ...
- js date对象传参获取特定日期的时间戳
当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象inva ...
- margin:0 auto;生效条件
1.position:absolute下不生效 原因:position:absolute只能相对于父元素进行定位top.left定位,相当于浮在父元素上面,所以margin:0 auto;就没有了参考 ...