AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

#2057. 「TJOI / HEOI2016」游戏

思路:

  最大流;

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 2000005
int n,m,s,t,que[maxn],deep[maxn],toth,totl,F[maxn],cnt=1;
int idh[55][55],idl[55][55],E[maxn],V[maxn],head[maxn];
char map[55][55];
bool if_[500][500];
inline bool bfs()
{
    for(int i=s;i<=t;i++) deep[i]=-1;
    int h=0,tail=1,now;que[0]=s,deep[s]=0;
    while(h<tail)
    {
        now=que[h++];
        for(int i=head[now];i;i=E[i])
        {
            if(F[i]&&deep[V[i]]<0)
            {
                deep[V[i]]=deep[now]+1;
                if(V[i]==t) return true;
                que[tail++]=V[i];
            }
        }
    }
    return false;
}
inline int flowing(int now,int flow)
{
    if(now==t||flow<=0) return flow;
    int oldflow=0,pos;
    for(int i=head[now];i;i=E[i])
    {
        if(F[i]&&deep[V[i]]==deep[now]+1)
        {
            pos=flowing(V[i],min(flow,F[i]));
            F[i]-=pos,F[i^1]+=pos,oldflow+=pos,flow-=pos;
            if(!flow) return oldflow;
        }
    }
    if(!oldflow) deep[now]=-1;
    return oldflow;
}
inline void edge_add(int u,int v,int f)
{
    E[++cnt]=head[u],V[cnt]=v,F[cnt]=f,head[u]=cnt;
    E[++cnt]=head[v],V[cnt]=u,F[cnt]=0,head[v]=cnt;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",map[i]+1);
    for(int i=1;i<=n;i++)
        for(int v=1;v<=m;v++)
            if(map[i][v]==‘*‘&&!idh[i][v])
            {
                toth++;
                for(int l=v;l>0&&map[i][l]!=‘#‘;l--)
                {
                    idh[i][l]=toth;
                    if(map[i][l]==‘x‘) idh[i][l]=0;
                }
                for(int r=v+1;r<=m&&map[i][r]!=‘#‘;r++)
                {
                    idh[i][r]=toth;
                    if(map[i][r]==‘x‘) idh[i][r]=0;
                }
            }
    for(int i=1;i<=n;i++)
        for(int v=1;v<=m;v++)
            if(map[i][v]==‘*‘&&!idl[i][v])
            {
                totl++;
                for(int l=i;l>0&&map[l][v]!=‘#‘;l--)
                {
                    idl[l][v]=totl;
                    if(map[l][v]==‘x‘) idl[l][v]=0;
                }
                for(int r=i+1;r<=n&&map[r][v]!=‘#‘;r++)
                {
                    idl[r][v]=totl;
                    if(map[r][v]==‘x‘) idl[r][v]=0;
                }
            }
    for(int i=1;i<=n;i++)
        for(int v=1;v<=m;v++)
            if(idh[i][v]&&idl[i][v]&&!if_[idh[i][v]][idl[i][v]])
            {
                if_[idh[i][v]][idl[i][v]]=true;
                edge_add(idh[i][v],idl[i][v]+toth,1);
            }
    s=0,t=toth+totl+1;
    for(int i=1;i<=toth;i++) edge_add(s,i,1);
    for(int i=1;i<=totl;i++) edge_add(i+toth,t,1);
    int ans=0;
    while(bfs()) ans+=flowing(s,INF);
    cout<<ans;
    return 0;
}
时间: 2024-12-28 02:06:55

AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ的相关文章

dtoj4542. 「TJOI / HEOI2016」字符串

4542. 「TJOI / HEOI2016」字符串 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 $ n $ 的字符串 $ s $,和 $ m $ 个问题.佳媛姐姐必须正确回答这 $ m $ 个问题,才能打开箱子拿到礼物,升职加薪,出任 CEO,嫁给高富帅,走上人生巅峰.每个问题均有 $a, b, c, d$ 四个参数,问你子串 $s[a \ldots b]$ 的所有子串和 $s[c \ldots d]$ 的最长公共前缀的长度的最

dtoi4539「TJOI / HEOI2016」序列

题意: 玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可.每种变化最多只有一个值发生变化. 题解:      设Max[i]为a[i]可能变成的最大值,Min[i]为a[i]可能变成的最小值(Max[i]和Min[i]均包括a[i]本身).那么i,j(i<j)连在一起的条件可以很容易得出:即a[i]<=Min[

单词「TJOI 2013」(AC自动机)

传送门 我们正常的建好Trie后求一遍fail.之后对于每一个节点,从它的fail连向它一条单项边.然后从根节点开始dfs. 记sum[i]代表从根到i号节点所代表的的字符串出现的次数,即该点的权值. 设当前的节点为x,他有一个孩子y,则使sum[x] += sum[y]. 记得记录一下每个字符串结尾的节点编号,设第i个字符串结尾的编号为id[i],对于每个字符串i最后输出sum[id[i]]即可. #include <iostream> #include <cstdio> #in

AC日记——欧几里得的游戏 洛谷 P1290

题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0.然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利.下面是他们用(25,7)两个数游戏的过程: Start:25 7 Stan:11 7 Ollie:4 7 Stan:4 3 Ollie:1 3 Stan:1 0 Stan赢得

LibreOJ「LibreOJ β Round #4」 游戏

二次联通门 : LibreOJ「LibreOJ β Round #4」 游戏 /* LibreOJ「LibreOJ β Round #4」 游戏 找找规律就会发现.. 当有X的时候,答案跟X个数的奇偶有关 否则就求一下逆序对就好了.. 由于SB的错误..WA了3发才过 然后就签完到走人了 */ #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #defi

【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)

http://www.4gamer.net/games/216/G021678/20140703095/ 新连载「实验做出的游戏图形」,是聚焦在特定游戏的图形上, 对它的结构和使用的技术解说为主旨.之前笔者连载的「西川善司的3D游戏入迷」,覆盖范围都很广,而与特定游戏强关联的技术解说,会在今后的新连载中处理. 作为纪念的第一回选择的,是Arc System Works开发的,2014年2月在街机上运作的格斗游戏「GUILTY GEAR Xrd -SIGN-」 全3D图形的GUILTY GEAR

「AHOI2014/JSOI2014」骑士游戏

「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i = \min(K_i, S_i + \sum_{j = 1}^{R_i} dp_{v_j})\] 但是我们会发现这个东西是有后效性的... 所以我们会想要用建图然后跑一个最短路什么的来搞... 于是我们观察到上面那个 \(\text{DP}\) 式子中,\(dp_i\) 如果用后面那一项来转移,显然

中国特色程序猿的「钱途」

今天在微博看到一篇文章,程序猿转型书商 年交易额千万元.作为一个合格的中国特色的码农.忍不住想写点儿什么. 程序猿的「钱途」在那里? 从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是由于不喜欢这个类型,而此人也不会全不喜欢这些网络作品.究其原因,是由于网络作品都是让人先白看的,看的好了才出了头.而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾. 很多大牛都是写了博客,后来出了书.这些书也都不次,可能有人让为不好,是由于技术书不像小说.小说在读故事,技术书是在学知识或

「豆瓣时间」

变着花样,「豆瓣时间」的广告页已经在豆瓣App上轮播了一周.豆瓣er们被雨果.普希金.菏尔德林等大师邀请了那么多天,终于在今天见到这档付费音频节目的真面目. 今天是2017年3月7日,距分答上线近一年,距喜马拉雅FM“123知识狂欢节”过去3个月.如今,罗胖正在炮制概念的路上狂奔,知乎已然形成付费矩阵,科技媒体Pro版遍地开花. 以文艺青年为主要用户群的豆瓣,却还是秉持“慢工出细活”的态度,除了原创+打赏的标配功能,去年最大的动作就是阿北宣布要进军影业.虽然每个行为都指向内容,但都没真正涉及支付