[CCPC2019秦皇岛] E. Escape

[CCPC2019秦皇岛E] Escape

Link

https://codeforces.com/gym/102361/problem/E

Solution

观察到性质若干然后建图跑最大流即可。

我的 ISAP 被卡了,换成 Dinic 却过了。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 200005;
const int inf = 1e+9;

#define reset(x) memset(x,0,sizeof x)

int dis[maxn], ans, cnt = 1, s, t, pre[maxn * 10], nxt[maxn * 10], h[maxn], v[maxn * 10];
std::queue<int> q;
void make(int x, int y, int z) {
    pre[++cnt] = y, nxt[cnt] = h[x], h[x] = cnt, v[cnt] = z;
    pre[++cnt] = x, nxt[cnt] = h[y], h[y] = cnt;
}
bool bfs() {
    memset(dis, 0, sizeof dis);
    q.push(s), dis[s] = 1;
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int i = h[x]; i; i = nxt[i])
            if (!dis[pre[i]] && v[i])
                dis[pre[i]] = dis[x] + 1, q.push(pre[i]);
    }
    return dis[t];
}
int dfs(int x, int flow) {
    if (x == t || !flow)
        return flow;
    int f = flow;
    for (int i = h[x]; i; i = nxt[i])
        if (v[i] && dis[pre[i]] > dis[x]) {
            int y = dfs(pre[i], min(v[i], f));
            f -= y, v[i] -= y, v[i ^ 1] += y;
            if (!f)
                return flow;
        }
    if (f == flow)
        dis[x] = -1;
    return flow - f;
}

int T,n,m,a,b,p[105],e[105];
char c[105][105];

int calch(int i,int j)
{
    return 3+((i-1)*m+j-1)*2;
}
int calcv(int i,int j)
{
    return 4+((i-1)*m+j-1)*2;
}
int calcx(int i,int j)
{
    return 3+2*n*m+((i-1)*m+j-1);
}
int calcy(int i,int j)
{
    return 3+3*n*m+((i-1)*m+j-1);
}

signed main()
{
    ios::sync_with_stdio(false);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&n,&m,&a,&b);
        reset(dis); reset(pre); reset(nxt); reset(h); reset(v); cnt=1;
        //cout<<calch(n,m)<<" "<<calcv(n,m)<<" "<<calcx(n,m)<<" "<<calcy(n,m)<<endl;
        for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
        for(int i=1;i<=a;i++) scanf("%d",&p[i]);
        for(int i=1;i<=b;i++) scanf("%d",&e[i]);
        for(int i=1;i<=n-1;i++)
            for(int j=1;j<=m;j++)
                if(c[i][j]=='0' && c[i+1][j]=='0')
                    make(calcv(i,j),calcv(i+1,j),1),
                    make(calcv(i+1,j),calcv(i,j),1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m-1;j++)
                if(c[i][j]=='0' && c[i][j+1]=='0')
                    make(calch(i,j),calch(i,j+1),1),
                    make(calch(i,j+1),calch(i,j),1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(c[i][j]=='0')
                    make(calch(i,j),calcv(i,j),1),
                    make(calcv(i,j),calch(i,j),1);
        for(int i=1;i<=a;i++) if(c[1][p[i]]=='0') make(1,calcv(1,p[i]),1);
        for(int i=1;i<=b;i++) if(c[n][e[i]]=='0') make(calcv(n,e[i]),2,1);
        s=1;t=2;
        ans = 0;
        for (; bfs(); ans += dfs(s, inf));
        if(ans == a) printf("Yes\n");
        else printf("No\n");
    }
}

原文地址:https://www.cnblogs.com/mollnn/p/11731500.html

时间: 2024-10-02 11:50:04

[CCPC2019秦皇岛] E. Escape的相关文章

[CCPC2019秦皇岛] F. Forest Program

[CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林(一棵树也是森林),求方案数. \(n \le 300000, m \le 500000\) Solution 用 DFS 暴力找环,然后乘法原理算一下即可.注意非环边也会有贡献. DFS 可以模仿 Tarjan 算法写. Code #include <bits/stdc++.h> using n

Codeforces Gym 102361A Angle Beats CCPC2019秦皇岛A题 题解

题目链接:https://codeforces.com/gym/102361/problem/A 题意:给定二维平面上的\(n\)个点,\(q\)次询问,每次加入一个点,询问平面上有几个包含该点的直角三角形. 分析:这是一篇鸽了很久的题解,主要原因就是现场赛的时候这题惨遭卡常,锅++.现在回过头来想这题,主要问题出在现场赛时误判了\(map\)的时间复杂度,把极角排序的正确想法成功叉掉,以及现场赛时候的共线计数使用了\(gcd\),使得整体复杂度上升.(但还是有大佬拿gcd思想过了,我太菜了)现

2019-ccpc秦皇岛现场赛

https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到题,,,(感觉在cf上做过,, (然后写反输出白白wa一发,,,,,emmmmmmmm F - Forest Program 这题我感觉是第二道签到题,,,很简单,,但是我一个人读完题后就想着怎么写代码,,,然后wa了无数发才反应过来还要考虑树边的情况,,,丧失理智 ,,,, 题意就是给一个 仙人掌

newLISP处理mysql escape character

什么是转义字符 mysql的escape character指的是需要转义的特殊字符,这些字符出现在sql语句中,如果没有转移会导致sql语法报错或者有sql注入攻击的可能. 主要有以下几种都需转义: \x00, \n, \r, \, ', " and \x1a. 比如' 就需要变成\' 下面是sql测试: mysql> INSERT INTO nodes(name) VALUES ('select a.dt, count(*), count(distinct a.uv) from (se

hzau 1204 Escape from the Darkness

1204: Escape from the Darkness Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 93  Solved: 3[Submit][Status][Web Board] Description Xiao Ming, a high school student, learnt blackbody radiation from the physics class. The black body on the book is ind

Python 3 与 Javascript escape 传输确保数据正确方法和中文乱码解决方案

前几天用Python的Bottle框架写个小web程序,在进行Ajax交互之时,前端则先用 JSON.stringify 来将类序列化,然后用escape() 函数将其编码,确保传输正确. 再基本上配合上Jquery的$.ajax应该就可以了,可能是经验不足,即使编码之后的数据依然在 Python 中难以处理. 后来慢慢思考出一种方式,在网上也发现了类似的方式,于是将其实现. 基本思路如下: escape('你好世界ABC'); //返回 "%u4F60%u597D%u4E16%u754CABC

【转】escape()、encodeURI()、encodeURIComponent()区别详解

escape().encodeURI().encodeURIComponent()区别详解 原文链接:http://www.cnblogs.com/tylerdonet/p/3483836.html JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 下面简单介绍一下它们的区别 1 escape()函数 定义和用法 e

hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 8001    Accepted Submission(s): 1758 Problem Description 2012 If this is the end of th

ZOJ3640-Help Me Escape

Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at the door. And unto thee shall be his desire, and thou shalt rule over him. And Ca