bzoj1298题解
【题意分析】
要求设计一组n个m面的骰子,使每一个骰子i对骰子a[i]的胜率都大于50%。
【算法分析】
对于每个i,连一条从i指向a[i]的边,那么题目给出的关系构成了一个有向基环树森林。
对于树上的点,我们按入度进行拓扑排序,当排序到i时,已经没有能战胜i的点,于是剩下最大的m个点就分配给它,这样构造能保证树上的情况。
拓扑排序后,只剩下环上的点还未构造。
对于环上的点,观察1、4样例可以发现一个构造方式:对于一个大小为n的环,从第一个点开始,逆着有向边放入1~n;再从第二个点开始,逆着有向边依次放入n+1~2*n,以此类推,直到放满n*m个数。
但是这个构造法在样例3中失败了。事实上,可以证明,只有在像样例3这种环大小为3,骰子面数为4的情况下,该方法会失效。对于这种情况,进行特判。
注意环大小为2或是m<=2的情况,一定无法构造。
【参考代码】
#pragma GCC optimize(2)
#include <cstdio>
#define REP(i,low,high) for(register int i=(low);i<=(high);i++)
#define PER(i,high,low) for(register int i=(high);i>=(low);i--)
using namespace std;
static const int table[][]={{,,,},{,,,},{,,,}};
static int n,m; bool vis[]={}; int p[],q[],ind[]={},ans[][];
inline int move(const int &one,const int &lim) {return one==?lim:one-;}
inline bool special(const int &len,const int &idx)
{
if(len!=||m!=) return ; REP(i,,) REP(j,,) ans[q[i]][j]=table[i-][j-]+idx; return ;
}
int main()
{
scanf("%d%d",&n,&m); REP(i,,n) scanf("%d",p+i),ind[p[i]]++; int tail=,idx=n*m;
REP(i,,n) if(!ind[i]) q[++tail]=i; for(int head=;head++<tail;)
{
int fr=q[head],to=p[fr]; PER(i,m,) ans[fr][i]=idx--; vis[fr]=; if(!--ind[to]) q[++tail]=to;
}
REP(i,,n) if(!vis[i])
{
vis[q[tail=]=i]=; for(int j=p[i];j!=i;j=p[j]) vis[q[++tail]=j]=;
if(tail<) return puts(""); if(!special(tail,idx-=tail*m))
{
int k=,tdx=idx; REP(j,,m)
{
ans[q[k=move(k,tail)]][j]=++tdx;
for(int t=move(k,tail);t!=k;t=move(t,tail)) ans[q[t]][j]=++tdx;
}
}
}
REP(i,,n) {REP(j,,m-) printf("%d ",ans[i][j]); printf("%d\n",ans[i][m]);} return ;
}
【特别膜拜感谢】
/orz mogician::GhostReach as "看一眼就胡出标算的神犇"
/orz undefined::Dmute as "比我讲的不知道高到哪里去了"
bzoj1298题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ1298[SCOI2009]骰子的学问
Description Input 第一行为两个整数n, m.第二行有n个整数,为a1,a2, -, an. Output 包含n行,每行m个1~n×m的正整数,各不相同,以空格分开.如果有多解,输出 ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- Text Justification 实现两端对齐功能
实现office word中的两端对齐功能. 只有个单词时,右边补齐空格.最后一行每个词间一个空格,整下的空格右边补齐.给定字符串,和每行的字符数L.进行两端对齐输出. 我的思路是写一个函数,给定相应 ...
- linux_shell 特殊符号的介绍
linux_shell 特殊符号的介绍 2011-12-17 17:54:07 分类: 原文地址:linux_shell 特殊符号的介绍 作者:xu_liuzhen linux_shell 特殊符号的 ...
- 藏地传奇js
http://zd.163.com/m/zhenyan/ js很厉害,有很多值得学习的地方,记录下来. http://res.nie.netease.com/zdcq/qt/13/0625_zheny ...
- 一个ASP.NET Web API 2.0应用
在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.N ...
- Linq无聊练习系列2--select/distinct练习
void dataBindByWhere() { /**************select/distinct 练习*******************/ //获 ...
- Binder机制,从Java到C (4. Parcel)
1. 远程调用的数据传输 在远程的函數中,必然会需要传递一些数据,那这些数据是怎么传输的呢? 在IPC中,Proxy端的作用就是将一些参数打包,然后发送出去,下面是在Proxy端经常会遇见的调用远程方 ...
- APNs功能之Node.js和Mysql应用总结
APNs功能之Node.js和Mysql应用总结 这篇文档主要是总结Node.js和Mysql的学习心得体会.当然也可以看作是此前所写的消息推送服务的续篇. 简单描述下应用背景,我们的应用需要实现苹果 ...
- SET IDENTITY_INSERT详解
声明:本博文摘自http://www.lmwlove.com/ac/ID500 自增列默认是不能插入显式值的,当我们试图给自增列插入值时,会报以下错误:当 IDENTITY_INSERT 设置为 OF ...
- [置顶] 实现360度全景图像的利器--PanoramaGL
传送门 ☞轮子的专栏 ☞转载请注明 ☞ http://blog.csdn.net/leverage_1229 介绍 本指南将介绍一个PanoramaGL 0.1类库的简单用法,更多的细节请签出 Hel ...
- Google Adsense(Google网站联盟)广告申请指南
Google AdSense 是一种获取收入的快速简便的方法,适合于各种规模的网站发布商.它可以在网站的内容网页上展示相关性较高的 Google 广告,并且这些广告不会过分夸张醒目.由于所展示的广告同 ...