ARC089E GraphXY 构造
在Luogu上评了”NOI“之后评级变成了”普及+/提高“……我觉得我可能要退群了
考虑构造一个这样的图:

其中上半部分是从\(S\)开始的一条长\(100\)、每条边权都为\(x\)的链(长度超过\(100\)显然是没有意义的),下半部分是以\(T\)结束的一条长\(100\)、每条边权都为\(y\)的链。在这两条链中间,有\(101 \times 101\)条边(上图中只画出了部分),边权为一个矩阵\(f_{i,j}\)。如果要经过\(f_{i,j}\)对应的边,那么需要从\(S\)开始沿着上半部分的链走\(i\)步,然后经过\(f_{i,j}\),最后沿着下半部分的链走\(j\)步到达\(T\),总边权就是\(xi+yj+f_{i,j}\)。
在这个图中,有\(d_{x,y} = \min\limits_{a,b \geq 0} xa + yb + f_{a,b}\),松弛条件得\(\forall a , b \geq 0 , d_{x,y} \leq xa + yb + f_{a,b}\),即\(f_{a,b} \geq d_{x,y} - xa - yb\)。
这样可以对于每个\(f_{a,b}\)得到\(A \times B\)个不等式,可得\(f_{a,b}\)的解集。而\(f_{a,b}\)一定需要取到其中的最小值(如果不取到最小值,可能存在\(x,y\)满足\(\min\limits_{a,b \geq 0} xa + yb + f_{a,b} > d_{x,y}\)),所以可以得到\(f_{a,b}\)的确切值。然后再代入\(d_{x,y}\)的式子检验以下图是否合法即可。
时间复杂度\(O(N^3)\)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<cmath>
#include<random>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF)
c = getchar();
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
}
int d[12][12] , f[107][107];
signed main(){
int A = read() , B = read();
for(int i = 1 ; i <= A ; ++i)
for(int j = 1 ; j <= B ; ++j)
d[i][j] = read();
for(int i = 0 ; i <= 100 ; ++i)
for(int j = 0 ; j <= 100 ; ++j)
for(int p = 1 ; p <= A ; ++p)
for(int q = 1 ; q <= B ; ++q)
f[i][j] = max(f[i][j] , d[p][q] - i * p - j * q);
for(int i = 1 ; i <= A ; ++i)
for(int j = 1 ; j <= B ; ++j){
int minN = 1e9;
for(int p = 0 ; p <= 100 ; ++p)
for(int q = 0 ; q <= 100 ; ++q)
minN = min(minN , f[p][q] + p * i + q * j);
if(minN != d[i][j]){
puts("Impossible");
return 0;
}
}
puts("Possible");
puts("202 10401");
for(int i = 1 ; i <= 100 ; ++i)
printf("%d %d X\n" , i , i + 1);
for(int i = 102 ; i < 202 ; ++i)
printf("%d %d Y\n" , i , i + 1);
for(int i = 0 ; i <= 100 ; ++i)
for(int j = 0 ; j <= 100 ; ++j)
printf("%d %d %d\n" , 1 + i , 202 - j , f[i][j]);
puts("1 202");
return 0;
}
ARC089E GraphXY 构造的更多相关文章
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
- 一步步构造自己的vue2.0+webpack环境
前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...
- About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...
- Eos开发——构造查询条件
1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...
- 【C++】类和对象(构造与析构)
类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...
- Spring 设值注入 构造注入 p命名空间注入
注入Bean属性---构造注入配置方案 在Spring配置文件中通过<constructor-arg>元素为构造方法传参 注意: 1.一个<constructor-arg>元素 ...
- 并发包的线程池第二篇--Executors的构造
上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...
- 10、代码块、构造代码块、静态代码块及main方法之间的关系
1.普通代码块: 在方法或语句中出现在{}之间的类容就称为普通代码块,简称代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”,即顺序执行. /*下面第一个类时合法的 ...
- json 构造和解析
目录: (1)引入jar包: (2)json的构造: (3)json的解析: (4)遍历未知key. (1)java对json的处理,可借助org.json.jar. <!-- https:// ...
随机推荐
- 二进制安装部署kubernetes集群---超详细教程
本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...
- Java——重载和重写
前言 在程序设计中经常会遇到对对方法的重载或者重写,下面将介绍重载和重写. 重载(Overloade) 重载出现的原因 任何程序设计语言都具备的一项重要特性就是对名字的运用.当创建一个对象时,就给对象 ...
- [React] 从零开始的react
组件 1. 无状态组件 在React中,组件的名字必须用大写字母开头,而包含该组件定义的文件名也应该是大写字母(便于区分,也可以不是). 无状态组件是纯展示组件,仅仅只是用于数据的展示,只根据传入的p ...
- C#反射与特性使用简介
本文是学习特性与反射的学习笔记,在介绍完特性和反射之后,会使用特性与反射实现一个简单的将DataTable转换为List的功能,水平有限,如有错误,还请大神不吝赐教. 1. 反射:什么是反射 ...
- Java开发笔记(三十六)字符串的常用方法
不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...
- Python数据类型(python3)
Python数据类型(python3) 基础数据类型 整型 <class 'int'> 带符号的,根据机器字长32位和64位表示的范围不相同,分别是: -2^31 - 2^31-1 和 - ...
- Css实现手机端页面强制横屏的方法示例
样式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @media screen ...
- 日志管理工具之logrotate
Logrotate配置和测试 logrotate软件是一个日志管理工具,用于非分隔日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间.logrotate是基于cron ...
- Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥。
Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥. #!/usr/bin/env python # -*- coding: utf- -*- import os im ...
- selenium-配置文件定位元素(九)
原文链接:https://mp.weixin.qq.com/s?__biz=MzU5NTgyMTE3Mg==&mid=2247483802&idx=1&sn=3218e34b6 ...