4886: [Lydsy1705月赛]叠塔游戏

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 198  Solved: 76
[Submit][Status][Discuss]

Description

小Q正在玩一个叠塔的游戏,游戏的目标是叠出尽可能高的塔。在游戏中,一共有n张矩形卡片,其中第i张卡片的
长度为a_i,宽度为b_i。小Q需要把所有卡片按一定顺序叠成一座塔,要求对于任意一个矩形,它的长度要严格大
于它上边的任意一个矩形的长度。塔的高度为所有矩形的宽度之和。在游戏中,小Q可以将卡片翻转90度来使用,
而且必须用上全部n张卡片。请写一个程序,帮助计算小Q能叠出最高的塔的高度。

Input

第一行包含一个正整数n(1<=n<=250000),即卡片的个数。
接下来n行,每行两个正整数a_i,b_i(1<=a_i,b_i<=10^9),分别表示每张卡片的长度和宽度。

Output

输出一行一个整数,即最高的塔的高度,输入数据保证一定存在解。

Sample Input

3
5 16
10 5
5 10

Sample Output

20

HINT

Source

思路:要求长度递增,求最大宽度之和。 由于排序是自己定的,所以只要求长度不相同,求最大宽度之和。 这样的话,我们就尝试用最大费用流来建图,

S向每个矩形连(1,0)(表示容量为1,费用为0)的边;     每个矩形向x连(1,y)的边,向y连(1,x)的边;     然后每个数向T连(1,0)的边。然后就是跑最大费用流。 由于数据太大,显然会超时。  这样的题一般可以贪心优化,可以对比bzoj4883,是一个套路。

此题的定向和bzoj4883的定向不一样,此题的定向会决定答案的大小。  只有无环的连通块,根的贡献=度数,其他都是=度数-1。 所以此题不需要排序,只需要找连通块的最大值即可。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. using namespace std;
  5. const int maxn=;
  6. int N,cnt,ma,sum,tot,a[maxn],b[maxn],fa[maxn],tag[maxn];
  7. int val[maxn],d[maxn],mx[maxn],Laxt[maxn],To[maxn],Next[maxn];
  8. map<int,int>idx; bool vis[maxn];ll ans;
  9. void add(int u,int v){ d[u]++;To[++cnt]=v;Next[cnt]=Laxt[u];Laxt[u]=cnt;}
  10. int find(int x){
  11. if(x==fa[x]) return x;
  12. return fa[x]=find(fa[x]);
  13. }
  14. int main(){
  15. int u,v; scanf("%d",&N);
  16. rep(i,,N){
  17. scanf("%d%d",&u,&v);
  18. if(!idx[u]) idx[u]=++tot,val[tot]=u;
  19. if(!idx[v]) idx[v]=++tot,val[tot]=v;
  20. u=idx[u]; v=idx[v]; d[u]++; d[v]++;
  21. a[i]=u; b[i]=v;
  22. }
  23. rep(i,,tot) fa[i]=i,mx[i]=val[i];
  24. rep(i,,tot){
  25. int x=find(a[i]),y=find(b[i]);
  26. if(tag[x]&&tag[y]) continue;
  27. if(x==y) tag[x]=;
  28. else fa[y]=x,tag[x]|=tag[y],mx[x]=max(mx[x],mx[y]);
  29. }
  30. rep(i,,tot){
  31. ans+=(ll)(d[i]-)*val[i];
  32. if(find(i)==i&&!tag[i]) ans+=mx[i];
  33. }
  34. printf("%lld",ans);
  35. return ;
  36. }

BZOJ4886: [Lydsy1705月赛]叠塔游戏(环套树森林&贪心)的更多相关文章

  1. BZOJ4886 [Lydsy1705月赛]叠塔游戏[基环树]

    很妙的一道题. 由于本人过于zz,不会这道题,通过厚颜无耻翻阅题解无数终于懂了这道题,所以这里转载一位神仙的blog. 没有看懂?没事,再来一篇. 这题个人认为主要在于转化题意和建图,这两点想通了应该 ...

  2. bzoj4886 [Lydsy2017年5月月赛]叠塔游戏

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4886 [题解] 跟bzoj4883:http://www.cnblogs.com/galax ...

  3. BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小环套树森林&优化定向问题)

    4883: [Lydsy1705月赛]棋盘上的守卫 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 475  Solved: 259[Submit][St ...

  4. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  5. 【bzoj4883】[Lydsy2017年5月月赛]棋盘上的守卫 最小环套树森林

    题目描述 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个 ...

  6. [AGC008E] Next or Nextnext [环套树森林+结论讨论]

    题面 传送门 思路 p到a 首先,本题中如果对于所有的$i$,连边$<i,p_i>$,那么可以得到一批环 那么这个题另外一点就是,可以变成连边$<i,p_{p_i}>$ 我们分 ...

  7. 题解 [BZOJ4886] 叠塔游戏

    题面 解析 这是个有趣的建图题啊. 首先我们可以发现,宽度严格递增是没什么用的. 因为实际上我们在旋转完以后, 矩形的顺序是可以随便排的. 因此只要保证宽度互不相同就行了. 然后,我们对长和宽离散化, ...

  8. BZOJ1124 POI2008枪战Maf(环套树+贪心)

    每个点出度都为1,可以发现这张图其实是个环套树森林,树中儿子指向父亲,环上边同向. 首先自环肯定是没救的,先抬出去. 要使死亡人数最多的话,显然若一个点入度为0其不会死亡,而一个孤立的环至少会留下一个 ...

  9. [BZOJ4883][Lydsy1705月赛]棋盘上的守卫(Kruskal)

    对每行每列分别建一个点,问题转为选n+m条边,并给每条边选一个点覆盖,使每个点都被覆盖.也就是最小生成环套树森林. 用和Kruskal一样的方法,将边从小到大排序,若一条边被选入后连通块仍然是一个环套 ...

随机推荐

  1. python开发之路目录

    Python 目录 基础 python入门 python数据类型.字符编码.文件处理 python函数基础 python函数进阶 python装饰器函数 python装饰器函数 python递归函数 ...

  2. 详细解析Linux /etc/passwd文件

    本文转自:http://os.51cto.com/art/201003/187533.htm 在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性.系 ...

  3. linux wa%过高,iostat查看io状况

    命令总结: 1. top/vmstat 发现 wa%过高,vmstat b >1: 参考文章: 1. 关于Linux系统指令 top 之 %wa 占用高,用`iostat`探个究竟 最近测试一项 ...

  4. PHP获取代码段执行的毫秒时间和消耗内存

    我们在项目开发经常需要做一些优化型测试,比如优化代码段,排查代码段效率问题,或者降低内存消耗成本. <?php $start_memory = memory_get_usage(); //开始内 ...

  5. stm32 Flash读写[库函数]

    stm32 的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写:支持IAP特性使得开发 ...

  6. UVA 257 Palinwords(hash)题解

    思路:给你字符串,如果他包含至少两个长度大于等于3的回文,并且这些回文不能嵌套(例如aaa嵌套在aaaa,waw嵌套在awawa),如果这个字符串这么牛逼的话,就输出他. 思路:拿到字符串先正序has ...

  7. python应用-掷骰子模拟-pygal

    pygal安装: Linux下: pip install pygal Windows下: python -m pip install pygal 效果如图: # -*- coding: utf-8 - ...

  8. 如何创建.babelrc文件?

    方法一: 根目录下,创建  .babelrc.  文件名就可以了! 方法二: git进入根目录,输入   type>.babelrc  ,回车即可!

  9. shell 字符串加入变量

    your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo $str

  10. 插入10W数据的两个程序比较

    程序1 添加10W数据 $count = 0; for ($i = 1;$i <= 100000 ;$i++) { $add_data = [ 'id' => $i, 'username' ...