【NOI2018模拟3.26】Cti

2023-11-06

Description

有一个 n × m 的地图, 地图上的每一个位置可以是空地, 炮塔或是敌人. 你需要操纵炮塔消灭敌人.
对于每个炮塔都有一个它可以瞄准的方向, 你需要在它的瞄准方向上确定一个它的攻击位置,当然也可以不进行攻击. 一旦一个位置被攻击, 则在这个位置上的所有敌人都会被消灭.
保证对于任意一个炮塔, 它所有可能的攻击位置上不存在另外一个炮塔.
定义炮弹的运行轨迹为炮弹的起点和终点覆盖的区域. 你需要求出一种方案, 使得没有两条炮弹轨迹相交.

Input

第一行两个整数 n,m.
接下来 n 行, 每行 m 个整数, 0 表示空地, −1,−2,−3,−4 分别表示瞄准上下左右的炮塔, 正整
数 p 表示表示此位置有 p 个敌人.

Output

一行一个整数表示答案.

Sample Input

输入1:
3 2
0 9
-4 3
0 -1

输入2:
4 5
0 0 -2 0 0
-4 0 5 4 0
0 -4 3 0 6
9 0 0 -1 0

Sample Output

输出1:
9

输出2:
12

Data Constraint

对于前 20% 的数据, n,m ≤ 5;
对于另 20% 的数据, 朝向上下的炮塔至多有 2 个;
对于另 20% 的数据, 至多有 6 个炮塔;
对于 100% 的数据, 1 ≤ n,m ≤ 50, 每个位置的敌人数量 < 1000.

Solution

一眼网络流。
然而这个的建模方法一前没弄过。
最小割模型。
对于横向射出的,依次连边连成一条链。
对于纵向的,依次反向连边练成一条链。
源点向横向的炮塔连正无穷,纵向炮塔向汇点连正无穷。
这样流都会从源点出发沿着边流到汇点。
而因为不能交叉,即不能存在这样的流,即割掉。
一开始把每个炮塔射程上的最大值统计进答案里,割表示选一个小一点的,即减掉一些,就是直接最小割就好了。
但是流从横的流到竖的后不能再流到横的那里。
所以分点就行了。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define N 100010
#define INF 214748347
using namespace std;
int S,T,n,m,last[N*10],nxt[N*10],to[N*10],data[N*10],tot=1,ans=0,d[N],bz[N],a[60][60];
void putin(int x,int y,int z)
{
    nxt[++tot]=last[x];last[x]=tot;to[tot]=y;data[tot]=z;
    nxt[++tot]=last[y];last[y]=tot;to[tot]=x;data[tot]=0;
}
bool bfs()
{
    int i=0,j=1;memset(bz,0,sizeof(bz));d[1]=S;bz[S]=1;
    while(i<j)
    {
        int x=d[++i];
        for(int k=last[x];k;k=nxt[k])
        if(bz[to[k]]==0&&data[k]>0) bz[to[k]]=bz[x]+1,d[++j]=to[k];
    }
    return bz[T]>0;
}
int dinic(int x,int v)
{
    if(x==T) return v;
    int ans=0;
    for(int i=last[x];i;i=nxt[i])
    {
        int y=to[i],qq=0;
        if(bz[y]==bz[x]+1&&data[i]>0)
        {
            qq=dinic(y,min(v,data[i]));
            if(qq) data[i]-=qq,ans+=qq,v-=qq,data[i^1]+=qq;
            if(v==0) return ans;
        }
    }
    if(ans==0) bz[x]=-1;
    return ans;
}
int p(int x,int y,int z)
{
    return (x-1)*m+y+n*m*z;
}
int main()
{
    freopen("cti.in","r",stdin);
    freopen("cti.out","w",stdout);
    scanf("%d%d",&n,&m);
    S=2*n*m+1;T=S+1;
    fo(i,1,n) fo(j,1,m) scanf("%d",&a[i][j]);
    fo(i,1,n)
    {
        fo(j,1,m)
        {
            putin(p(i,j,0),p(i,j,1),INF);
            if(a[i][j]==-1)
            {
                int jy=0;
                fd(k,i-1,1) jy=max(jy,a[k][j]);
                ans+=jy;
                a[i][j]=0;
                fd(k,i-1,1)
                {
                    putin(p(k,j,1),p(k+1,j,1),jy-a[k+1][j]);
                }
                putin(p(i,j,1),T,INF);
            }
            if(a[i][j]==-2)
            {
                int jy=0;
                fo(k,i+1,n) jy=max(jy,a[k][j]);
                ans+=jy;
                a[i][j]=0;
                fo(k,i+1,n)
                {
                    putin(p(k,j,1),p(k-1,j,1),jy-a[k-1][j]);
                }
                putin(p(i,j,1),T,INF);
            }
            if(a[i][j]==-3)
            {
                int jy=0;
                fd(k,j-1,1) jy=max(jy,a[i][k]);
                ans+=jy;
                a[i][j]=0;
                fd(k,j-1,1)
                {
                    putin(p(i,k+1,0),p(i,k,0),jy-a[i][k+1]);
                }
                putin(S,p(i,j,0),INF);
            }
            if(a[i][j]==-4)
            {
                int jy=0;
                fo(k,j+1,m) jy=max(jy,a[i][k]);
                ans+=jy;
                a[i][j]=0;
                fo(k,j+1,m)
                {
                    putin(p(i,k-1,0),p(i,k,0),jy-a[i][k-1]);
                }
                putin(S,p(i,j,0),INF);
            }
        }
    }
    while(bfs()) ans-=dinic(S,INF);
    printf("%d\n",ans);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【NOI2018模拟3.26】Cti 的相关文章

  • [极客大挑战 2019]Http(BUUCTF)

    前言 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具 我用fiddler抓包 burpsuite也可以 解题过程 用F12查看一下源代码 发现Secret php 进入是一个高档页面 翻译一下意思是 来源不是
  • Reactor Cooling【ZOJ 2314】【无源汇有上下界可行流】

    题目链接 无源汇上下界可行流 没有源点 S 汇点 T 在网络中求可行流或者指出不存在 对于这个问题 不好处理 但是如果我们去掉流量下界限制 B 那么就是最大流的模型了 问题就可以解决了 但是 我们不能直接去掉 因为有可能存在入 出的情况 也
  • 剑指offer—40.最小的K个数—分析及代码(Java)

    剑指offer 40 最小的K个数 分析及代码 Java 一 题目 二 分析及代码 1 排序 1 思路 2 代码 3 结果 2 Partition 1 思路 2 代码 3 结果 3 堆 1 思路 2 代码 3 结果 三 其他 一 题目 输入
  • HDU - 2100 Lovekey

    XYZ 26进制数是一个每位都是大写字母的数字 A B C X Y Z 分别依次代表一个0 25 的数字 一个 n 位的26进制数转化成是10进制的规则如下 A0A1A2A3 An 1 的每一位代表的数字为a0a1a2a3 an 1 则该X
  • POJ 1251 Jungle Roads (最小生成树 prime )

    POJ 1251 Jungle Roads The Head Elder of the tropical island of Lagrishan has a problem A burst of foreign aid money was
  • HDU-2061 汉诺塔III (简单DP)

    约19世纪末 在欧州的商店中出售一种智力玩具 在一块铜板上有三根杆 最左边的杆上自上而下 由小到大顺序串着由64个圆盘构成的塔 目的是将最左边杆上的盘全部移到右边的杆上 条件是一次只能移动一个盘 且不允许大盘放在小盘的上面 现在我们改变游戏
  • LeetCode1748. 唯一元素的和(python)

    题目 给你一个整数数组 nums 数组中唯一元素是那些只出现 恰好一次 的元素 请你返回 nums 中唯一元素的 和 示例 1 输入 nums 1 2 3 2 输出 4 解释 唯一元素为 1 3 和为 4 示例 2 输入 nums 1 1
  • [剑指offer] JAVA版题解(完整版)

    本文首发于我的个人博客 尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 剑指offer 二维数组中的查找 二维数组中的查找 数组 04 剑指offer 替换空格 替换空格 字符串 05 剑指offer 从尾到头打印链表 从尾到头打印链
  • 网络流dinic算法复杂度

    Dinic算法的时间复杂度的理论上界是O N2 M N是结点数 M是边数 但实际上Dinic算法比这个理论上界好得多 如果所有边容量均为1 那么时间复杂度是O min N0 67 M0 5 M 对于二分图最大匹配这样的特殊图 时间复杂度是O
  • POJ 1302 Blue Gene, Jr.(递归实现)

    Inspired by IBM s Blue Gene project the CEO of Universal Biological Machinery UBM has called on you UBM s top software e
  • 七校联合NewStarCTF 公开赛赛道WEEK2 web wp

    也不知道是不是公开赛和内部赛是不是同一套题 week1的题挺简单的 这里小记一下week2的题目 如有侵权立刻删除 Word For You 2 Gen 这题很简单就带过一下吧 报错注入就行 1 updatexml 1 concat 0x7
  • CF76E Points 题解

    题目大意 给出 n n n 个点的坐标 x x x 和 y y y 让你求
  • PowerOJ 2543: 赛场布置

    题目链接 对于每个点 它可以选择男或者女 如果要加上的贡献 那么相邻的一定得是异性才可以 所以 对相邻的 我们可以考虑成 然后 我们对于点坐标的的奇偶性分别讨论即可 当然 还需要考虑的贡献 然后就是全选减去最少割去的即可 include
  • 【团体程序设计天梯赛-练习集】L2-009 抢红包(25分)

    团体程序设计天梯赛 练习集 L2 009 抢红包 25分 题目 题目链接 L2 009 抢红包 25 分 没有人没抢过红包吧 这里给出N个人之间互相发红包 抢红包的记录 请你统计一下他们抢红包的收获 输入格式 输入第一行给出一个正整数N 1
  • CF1512C A-B Palindrome 题解

    题目大意 给定一个字符串 长度为 a b a b a b 给定 a a a
  • 【CCPC-2019】【江西省赛】【霖行】J-Worker

    CCPC 2019 江西省赛 霖行 J Worker 题目 Avin meets a rich customer today He will earn 1 million dollars if he can solve a hard pro
  • 2011年北京大学计算机研究生机试真题(题解)

    九度OJ题目传送门 2011年北京大学计算机研究生机试真题 鸡兔同笼 题目描述 一个笼子里面关了鸡和兔子 鸡有2只脚 兔子有4只脚 没有例外 已经知道了笼子里面脚的总数a 问笼子里面至少有多少只动物 至多有多少只动物 输入 第1行是测试数据
  • 【codeforces #290(div 1)】ABC题解

    A Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o
  • P1609 最小回文数 题解

    本题位数较大 所以只能使用字符串读入 因为是回文数 所以我们只考虑前半部分的情况就能确定一个回文数 如一个型为 x y z overline xyz xy
  • POJ - 1129 Channel Allocation(染色问题)

    题意 AC代码 When a radio station is broadcasting over a very large area repeaters are used to retransmit the signal so that

随机推荐

  • idea运行SSM项目及启动(tomcat),详细图解

    1 导入进项目 配置maven 2 配置本地的tomcat 3 选择本地的Tomcat Server 选择Local 点击create 4 tomcat路径配置 名称配置 端口及访问配置 5 项目war包配置生成 进入项目配置 1 进入Ar
  • Vuebnb:一个用vue.js和Laravel构建的全栈应用

    今年我一直在写一本新书叫全栈Vue网站开发 Vue js Vuex和Laravel 它会在Packt出版社在2018年初出版 这本书是围绕着一个案例研究项目 Vuebnb 简单克隆Airbnb 在这篇文章中 我会把它如何工作做一个高层次的概
  • 机器学习 day22(ReLU激活函数,激活函数的种类,如何选择激活函数)

    1 ReLU激活函数 当问题的结果是二元的 则a的范围是 0 1 激活函数g z 可以用sigmoid激活函数 如果问题的结果是无穷多个 如让a的范围取 0 激活函数g z 可以选用ReLU激活函数 他在z 0时取0 在z 0时取z 2 常
  • CDN服务技术架构图

    为什么80 的码农都做不了架构师 gt gt gt 前言 在博文中 解读大型网站的演变过程 浅谈 举家搬迁静态文件到CDN 博文中都有涉及CDN 这次我们来详细讲解下CDN的架构 简介 CDN是构建在网络之上的内容分发网络 依靠部署在各地的
  • linux搭建ftp修改域名访问,linux下构建建设完美FTP服务器

    关键字 ubuntu linux Apache2 PHP5 Pure FTPD pureftpd MySQL5 linux下构建建设完美FTP服务器 可管理 WEB管理 管理界面 一 安装Ubuntu5 Desktop版 来源博客 url
  • 对遗留系统组织重构项目

    很多IT组织都面临一个难题 老系统的维护 升级越来越难做 特别是那些价值高 生命周期长 规模大的核心业务系统 越到后来 要修复一个缺陷或者新增一个功能就需要越大的工作量 这是为什么呢 软 件的质量体现在两方面 商业方面的质量 以及技术方面的
  • 线性链表和顺序表的基本操作

    线性链表和顺序表的基本操作 一 实验目的 线掌握线性表的逻辑特性以及在计算机内的两种存储结构 线性链表和顺序表存储结构下基本操作的实现 会灵活应用线性表结构解决某些实际问题 二 实验内容 1 线性表顺序存储结下的基本操作的实现 初始化 赋值
  • 【2022年研究生科研素养提升系列公益讲座】课程笔记2——一些有用的数据库和科研工具

  • mobx基本使用

    mobx是一个简单可扩展的状态管理库 基本概念 state 状态 状态是驱动应用的数据 像有数据的excel表格 2 derivations 衍生 任何源自状态并且不会再进一步相互作用的东西 比如用户界面 待办事件的数量 把变化发送到服务端
  • c语言利用公式sin x=,用泰勒公式求sin(x)的近似值

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 include include define PI 3 1415927 double FACT double x double fact int n int main int n i k fla
  • java小笔记,List实体类对象的去重

    java小笔记 List实体类对象的去重 去除重复的数据 ArrayList lt 实体类 gt collect orderPOList stream collect Collectors collectingAndThen Collect
  • MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

    目录 MySQL中的DDL操作 一 创建表与删除表 1 创建表 2 查看已创建的表 3 删除表 二 修改表 1 修改表名 2 修改列名 3 修改列类型 4 添加新列 5 删除指定列 三 MySQL的约束 1 修改表添加主键约束 2 删除主键
  • 记录电脑弹垃圾广告的处理方案

    今天电脑突然弹出了垃圾广告 作为一个看不得广告弹窗的人 务必把他扼杀了 他要获取广告信息可能会用到网络 这是一种思路 不同程序运行方式不一样 弹出广告后 打开任务管理器 资源监视器 可以看到有一个可以程序 通过 Wox 查找定位到程序存储路
  • Python 基于pickle的 保存和加载训练后的模型

    pickle允许我们将Python保存为硬盘驱动器上的二进制文件 在pickle我们的对象后 可以结束我们的Python 对话 并在之后将对象在加载到Python中 pickle文件可以备份到云盘或者移动盘里或者拿来想给谁给谁 警告 不要加
  • linux内核的编译和安装

    linux内核的编译和安装 文章目录 linux内核的编译和安装 1 获取内核源码 2 编译源码 3 安装内核 4 reboot 系统加载新的内核 1 获取内核源码 登录Linux内核官方网站 可以获取源代码 使用git获取最新提交到Lin
  • flask虚拟环境搭建及flask基础

    常用端口号 http 80 https 443 ssh 22 远程访问 ftp 21 文件传输mysql 3306 redis 6379 smtp 25 邮件发送服务 pop3 110 邮件接收服务 虚拟环境 pip是python的包管理工
  • BSN-DDC 基础网络关键知识点(一)DDC背景介绍

    id BSN 2021 公众号 BSN研习社 2022年1月25日 区块链服务网络发展联盟 简称 BSN联盟 上线推出了 BSN DDC基础网络 并进入试商用阶段 同时 BSN DDC官网门户 ddc bsnbase com 上线发布 供D
  • Python——人工智能时代的通用语言

    Python对于从事数据分析的专业人士来说 并不陌生 而我正在熟悉Python的道路上 先易后难 快速驶过高速公路后 目前正在泥泞山路上挣扎 期待雨过天晴 顺利跨过瓶颈期 学习Python就像学一门外语 需要了解它的语法 按照既定的规则组词
  • TypeScript语法

    TypeScript基础语法 1 1 js与ts的区别 最大区别 js不会在赋值时检查是否与类型匹配 而ts会检查所赋的值是否与类型匹配 若不匹配则会进行报错提示 1 2 js的数据类型 两大类 1 2 1 原始数据类型 5种 原始数据类型
  • 【NOI2018模拟3.26】Cti

    Description 有一个 n m 的地图 地图上的每一个位置可以是空地 炮塔或是敌人 你需要操纵炮塔消灭敌人 对于每个炮塔都有一个它可以瞄准的方向 你需要在它的瞄准方向上确定一个它的攻击位置 当然也可以不进行攻击 一旦一个位置被攻击