zoukankan      html  css  js  c++  java
  • bzoj1298题解

    【题意分析】

    要求设计一组nm面的骰子,使每一个骰子i对骰子a[i]的胜率都大于50%

    【算法分析】

    对于每个i,连一条从i指向a[i]的边,那么题目给出的关系构成了一个有向基环树森林。

    对于树上的点,我们按入度进行拓扑排序,当排序到i时,已经没有能战胜i的点,于是剩下最大的m个点就分配给它,这样构造能保证树上的情况。

    拓扑排序后,只剩下环上的点还未构造。

    对于环上的点,观察14样例可以发现一个构造方式:对于一个大小为n环,从第一个点开始,逆着有向边放入1~n;再从第开始,逆着有向依次放入n+1~2*n以此类推,直到放满n*m个数。

    但是这个构造法在样例3中失败了。事实上,可以证明,只有在像样例3这种环大小为3骰子面数为4的情况下,该方法会失效。对于这种情况,进行特判。

    注意环大小为2或是m<=2的情况,一定无法构造。

    【参考代码】

     1 #pragma GCC optimize(2)
     2 #include <cstdio>
     3 #define REP(i,low,high) for(register int i=(low);i<=(high);i++)
     4 #define PER(i,high,low) for(register int i=(high);i>=(low);i--)
     5 using namespace std;
     6 static const int table[3][4]={{1,3,10,11},{2,7,8,9},{4,5,6,12}};
     7 static int n,m; bool vis[210]={0}; int p[210],q[210],ind[210]={0},ans[210][210];
     8 inline int move(const int &one,const int &lim) {return one==1?lim:one-1;}
     9 inline bool special(const int &len,const int &idx)
    10 {
    11     if(len!=3||m!=4) return 0; REP(i,1,3) REP(j,1,4) ans[q[i]][j]=table[i-1][j-1]+idx; return 1;
    12 }
    13 int main()
    14 {
    15     scanf("%d%d",&n,&m); REP(i,1,n) scanf("%d",p+i),ind[p[i]]++; int tail=0,idx=n*m;
    16     REP(i,1,n) if(!ind[i]) q[++tail]=i; for(int head=0;head++<tail;)
    17     {
    18         int fr=q[head],to=p[fr]; PER(i,m,1) ans[fr][i]=idx--; vis[fr]=1; if(!--ind[to]) q[++tail]=to;
    19     }
    20     REP(i,1,n) if(!vis[i])
    21     {
    22         vis[q[tail=1]=i]=1; for(int j=p[i];j!=i;j=p[j]) vis[q[++tail]=j]=1;
    23         if(tail<3) return puts("0"); if(!special(tail,idx-=tail*m))
    24         {
    25             int k=2,tdx=idx; REP(j,1,m)
    26             {
    27                 ans[q[k=move(k,tail)]][j]=++tdx;
    28                 for(int t=move(k,tail);t!=k;t=move(t,tail)) ans[q[t]][j]=++tdx;
    29             }
    30         }
    31     }
    32     REP(i,1,n) {REP(j,1,m-1) printf("%d ",ans[i][j]); printf("%d
    ",ans[i][m]);} return 0;
    33 }
    View Code

    【特别膜拜感谢】

      /orz mogician::GhostReach as "看一眼就胡出标算的神犇"

      /orz undefined::Dmute as "比我讲的不知道高到哪里去了"

    We Secure, We Contain, We Protect.
  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/spactim/p/6285794.html
Copyright © 2011-2022 走看看