BZOJ4205 : 卡牌配对

对于两张卡牌,如果存在两种属性值不互质,则可以匹配。

只考虑200以内的质数,一共有46个,可以新建3*46*46个点来表示一类属性值中有这两种质数的卡牌。

然后对于每张卡牌,枚举它的质因子,最多只有3个,如此建图求出最大流即可。

#include<cstdio>
const int N=66500,inf=~0U>>2,P=201;
struct edge{int t,f;edge*nxt,*pair;}*g[N],*d[N],pool[3500000],*cur=pool;
int n,m,i,j,x,y,z,S,T,h[N],gap[N],maxflow;
int v[P],fac[P][4],cnt,id12[P][P],id13[P][P],id23[P][P],all;
inline int min(int x,int y){return x<y?x:y;}
inline void add(int s,int t){
  edge*p=cur++;p->t=t;p->f=1;p->nxt=g[s];g[s]=p;
  p=cur++;p->t=s;p->f=0;p->nxt=g[t];g[t]=p;
  g[s]->pair=g[t];g[t]->pair=g[s];
}
int sap(int v,int flow){
  if(v==T)return flow;
  int rec=0;
  for(edge*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
    int ret=sap(p->t,min(flow-rec,p->f));
    p->f-=ret;p->pair->f+=ret;d[v]=p;
    if((rec+=ret)==flow)return flow;
  }
  if(!(--gap[h[v]]))h[S]=T;
  gap[++h[v]]++;d[v]=g[v];
  return rec;
}
int main(){
  for(i=2;i<P;i++)if(!v[i])for(cnt++,j=i;j<P;j+=i)v[j]=1,fac[j][++fac[j][0]]=cnt;
  for(i=1;i<=cnt;i++)for(j=1;j<=cnt;j++)id12[i][j]=++all,id13[i][j]=++all,id23[i][j]=++all;
  scanf("%d%d",&n,&m);S=all+n+m+1,T=S+1;
  while(n--){
    add(S,++all);
    scanf("%d%d%d",&x,&y,&z);
    for(i=1;i<=fac[x][0];i++)for(j=1;j<=fac[y][0];j++)add(all,id12[fac[x][i]][fac[y][j]]);
    for(i=1;i<=fac[x][0];i++)for(j=1;j<=fac[z][0];j++)add(all,id13[fac[x][i]][fac[z][j]]);
    for(i=1;i<=fac[y][0];i++)for(j=1;j<=fac[z][0];j++)add(all,id23[fac[y][i]][fac[z][j]]);
  }
  while(m--){
    add(++all,T);
    scanf("%d%d%d",&x,&y,&z);
    for(i=1;i<=fac[x][0];i++)for(j=1;j<=fac[y][0];j++)add(id12[fac[x][i]][fac[y][j]],all);
    for(i=1;i<=fac[x][0];i++)for(j=1;j<=fac[z][0];j++)add(id13[fac[x][i]][fac[z][j]],all);
    for(i=1;i<=fac[y][0];i++)for(j=1;j<=fac[z][0];j++)add(id23[fac[y][i]][fac[z][j]],all);
  }
  for(gap[maxflow=0]=T,i=1;i<=T;i++)d[i]=g[i];
  while(h[S]<T)maxflow+=sap(S,inf);
  return printf("%d",maxflow),0;
}

  

时间: 2024-10-23 00:49:15

BZOJ4205 : 卡牌配对的相关文章

【BZOJ4205】卡牌配对 最大流

[BZOJ4205]卡牌配对 Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不同. 比如一张X类卡牌属性值分别是225,233,101,一张Y类卡牌属性值分别为115,466,99.那么这两张牌是可以配对的,因为只有101和99一组属性互质. 游戏的目的是最大化匹配上的卡牌组数,当然每张卡牌只能用一次. Input 数据第一行两个数

BZOJ 4205: 卡牌配对

4205: 卡牌配对 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 76[Submit][Status][Discuss] Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不同. 比如一张X类卡牌属性值分别是225,233,101,一张Y类卡牌属性值分别为11

4205: 卡牌配对 最大流+建图技巧

很明显该题应该是二分图最大匹配,但该题不可能N^2建图,那么我们要怎么办呢?而且有三个属性. 注意到 Ai <= 200 而且 200 以内的质数只有49个,那么我们就可以对着仅有的49个质数下毒手了.很明显如果 Ai 与 Aj 不互质的话, 两者应该有一个共同质因子. B和C同理. 那么我们可以在S集和T集中间建3层质因子的墙,分别为A和B, B和C, C和A. 只有当 Ai 被第 x 个质因子整除, Bi 被第 y 个质因子整除时, 我们从 i 往 P[0][x][y] 连边. 其他同理.

[JLOI2013]卡牌游戏

题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏.然后卡片将会被放回卡牌堆里并重新洗牌.被处决的人按顺时针的下一个人将会作为下一轮的庄家.那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者.现在你预先知道了总共有M张卡片,也知道每张卡片上的数字.现在你需要确定每个

cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)

刚开始做卡牌的时候没有想到要做loading,因为小游戏资源不多. 但是后来不断的加图片,直到在真机上发现卡顿的问题,我才知道该需要加loading了...... 首先,我们先定义类: class Loading : public Layer { public: bool init(); CREATE_FUNC( Loading); static Scene* CreateScene(); int total_pic_num;//需加载图片数 int total_sound_num;//需加载声

卡牌游戏

卡牌游戏 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ 和 java ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 敢于承认不足,敢于去接触和学习,同时又沉稳而镇静 题目 百练 1003 How far can y

cocos2d-X 卡牌手机游戏《刀塔传奇》完整源码下载

源码介绍 <刀塔传奇>--cocos2d-x手机游戏源码下载 <刀塔传奇>是一款以Dota故事为背景的动作卡牌手机游戏战斗DEMO,以创新的轻操作战斗玩法,打破传统卡牌游戏操作呆板.无脑等待的瓶颈,玩家指尖手动掌控英雄大招,把握施放大招的顺序,尽享酷炫技能带来的极致视觉体验.<刀塔传奇> iOS/安卓平台长时间高居排行榜榜首,创下了2014年手游人气神话. 大小:7 MB 测试环境 引擎版本:3.0 开发工具:vs2012 测试说明:基于cocos2d-x3.0和vs2

自然系卡牌主要增加血量m--4武侠联盟游戏

在<游戏降临>这一款手游中,有很多不同类型不同属性的卡牌,卡牌一共分为5个系,近百种卡牌,让玩家为之倾心.卡牌分为火,水,自然,雷,光5个系,火系卡牌主要增加攻击力,水系卡牌主要增加幸运,自然系卡牌主要增加血量,雷系卡牌主要增加敏捷,光系卡牌主要增加防御.每一种卡牌都有其特定的作用和效果,只要玩家善于运用和搭配,就能发挥卡牌的最大能量,引爆战争. 战术阵型的作用会愈来愈突出的.举个例子,你的球队实力2000,但却打不过实力1800的球队,这就是阵容战术在作怪!阵型战术的相克原理是:组织克防守,

【OpenGL】Shader实例分析(六)- 卡牌特效

转发请保持地址:http://blog.csdn.net/stalendp/article/details/30989295 本文将介绍怎么通过alpha通道来隐藏信息,并实现卡牌特效.运行效果如下: 代码如下: Shader "stalendp/imageShine" { Properties { _MainTex ("image", 2D) = "white" {} _NoiseTex("noise", 2D) = &qu