Chtholly Nota Seniorious
题目背景
大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg
こんなにも、たくさんの幸せをあの人に分けてもらった
だから、きっと
今の、私は
谁が何と言おうと
世界一、幸せな女の子だ
题目描述
——“假如……我是说假如喔。
万一我再过五天就会死,你能不能对我温柔一点?”
巨大的六号兽五天后将袭击浮游大陆。
无数次计算得到的残酷数据表明,只有圣剑瑟尼欧尼斯的适格精灵——珂朵莉·诺塔·瑟尼欧尼斯(Chtholly Nota Seniorious)开启妖精乡之门,才可以以生命为代价守住浮游岛。
“至少,我也希望自己不用消失,也想让别人记住。我也想留下羁绊啊。”
留给妖精少女珂朵莉的时间似乎已经不多了。
年轻的二等技官,妖精仓库的管理员,世界上最后一个人类——威廉·克梅修,数百年前曾经是一名准勇者,掌握着成为一名勇者所需要的所有知识。
大战在即,调整圣剑的状态成为了一项重要的任务。
瑟尼欧里斯(セニオリス)
圣剑的其中之一,在现存的遗迹兵装中,拥有最强大的力量。
拥有非常特殊的资质,只有极少一部分的人才能使用。
由四十一个护符组成。能将所有事物包含不死者都回归「死亡」。
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nn行mm列的矩阵。
每一个护符都有自己的魔力值。现在为了测试圣剑,你需要将这些护符分成 A,B两部分。
要求如下:
圣剑的所有护符,恰好都属于两部分中的一部分。
- 每个部分内部的方块之间,可以通过上下左右相互到达,而且每个内部的方块之间互相到达,最多允许拐一次弯。
例如
AAAAA AAAAA AAAAA
AABAA BaAAA AAABB
ABBBA BBAAA AAABB
AABAA BaAAA ABBBB
AAAAA AAAAA BBBBB
(1) (2) (3)
其中(1)(2)是不允许的分法,(3)是允许的分法。在(2)中,a属于A区域,这两个a元素之间互相到达,没有办法最多只拐一次弯。
现在要问,所有合法的分法中,A区域的极差与B区域的极差 中间较大的一个的 最小值 是多少?
好心而可爱的在一旁默默观察奈芙莲悄悄地告诉你,极差就是区域内最大值减去最小值。
夜晚的风吹拂着,68号岛上的景色竟与地上的森林无异。转念又想,黄金妖精本身就是与森林之中出现,成长,消亡的神秘存在啊。
时间不早了,早上训练中落败的珂朵莉即将回来了。您要尽快和威廉一起调整好圣剑,千万不能迟哟。
输入输出格式
输入格式:
第一行两个自然数n,mn,m
接下来nn行,每行mm个自然数A_{i,j}Ai,j表示权值
输出格式:
一个整数表示答案。
输入输出样例
4 4
1 12 6 11
11 4 2 14
10 1 9 20
4 17 13 10
11
说明
样例解释
1 12 6 11
11 4 2 14
10 1 9 20
4 17 13 10
分法不唯一,如图是一种合法的分法。左边部分极差12-1=11,右边一块极差20-10=10,所以答案取这两个中较大者11。没有别的分法,可以使答案更小。
数据范围与约定
测试点 | n | m |
---|---|---|
#1-2 | \le 10≤10 | \le 10≤10 |
#3-4 | 1 | \le 2000≤2000 |
#5-7 | \le 200≤200 | \le 200≤200 |
#8-10 | \le 2000≤2000 | \le 2000≤2000 |
对于所有的权值1\le A_{i,j} \le 10^91≤Ai,j≤109
我们需要按行扫这个矩阵两遍,第一遍从上往下扫,第二遍从下往上扫。
基于贪心的原则,对于每一行,我们从右往左扫。当遇到这一行第一个(最靠右的一个)满足的格子的时候停止,然后下一行从同一个位置开始往左扫。这样贪心可以保证满足条件的同时给下一行更多的选择。
把左边的部分记为A部分,右边的部分记为B部分,则扫的时候顺便维护下每一部分扫到上一行为止的最大最小值,在扫这行的过程中就判断下最大值减最小值会不会爆……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[][],premax[][],premin[][];
int sufmax[][],sufmin[][],n,m,ans;
bool check1(int k)
{int i,j;
int lim=m,maxa=,mina=2e9,maxb=,minb=2e9;
for (i=;i<=n;i++)
{
int flag=;
for (j=lim;j>=&&flag==;j--)
{
if (max(max(maxa,premax[i][j])-min(mina,premin[i][j]),max(maxb,sufmax[i][j+])-min(minb,sufmin[i][j+]))<=k)
{
lim=j;
maxa=max(premax[i][j],maxa);
if (j+<=m)
maxb=max(sufmax[i][j+],maxb);
mina=min(premin[i][j],mina);
if (j+<=m)
minb=min(sufmin[i][j+],minb);
flag=;
}
}
if (flag==) return ;
}
return ;
}
bool check2(int k)
{int i,j;
int lim=m,maxa=,mina=2e9,maxb=,minb=2e9;
for (i=n;i>=;i--)
{
int flag=;
for (j=lim;j>=&&flag==;j--)
{
if (max(max(maxa,premax[i][j])-min(mina,premin[i][j]),max(maxb,sufmax[i][j+])-min(minb,sufmin[i][j+]))<=k)
{
lim=j;
maxa=max(premax[i][j],maxa);
if (j+<=m)
maxb=max(sufmax[i][j+],maxb);
mina=min(premin[i][j],mina);
if (j+<=m)
minb=min(sufmin[i][j+],minb);
flag=;
}
}
if (flag==) return ;
}
return ;
}
int main()
{int i,j;
cin>>n>>m;
for (i=;i<=n;i++)
for (j=;j<=m;j++)
scanf("%d",&a[i][j]);
for (i=;i<=n;i++)
{
premax[i][]=premin[i][]=a[i][];
for (j=;j<=m;j++)
{
premax[i][j]=max(premax[i][j-],a[i][j]);
premin[i][j]=min(premin[i][j-],a[i][j]);
}
sufmax[i][m]=sufmin[i][m]=a[i][m];
for (j=m-;j>=;j--)
{
sufmax[i][j]=max(sufmax[i][j+],a[i][j]);
sufmin[i][j]=min(sufmin[i][j+],a[i][j]);
}
sufmin[i][m+]=premin[i][]=2e9;
}
int l=;int r=1e9;
while (l<=r)
{
int mid=(l+r)/;
if (check1(mid)||check2(mid)) ans=mid,r=mid-;
else l=mid+;
}
cout<<ans;
}
Chtholly Nota Seniorious的更多相关文章
- noip模拟赛 Chtholly Nota Seniorious
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...
- 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...
- 【Luogu】P3933 Chtholly Nota Seniorious
[题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序 ...
- 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心
题目链接 题意 给你一个N*M的矩阵 (N,M <=2000) 把他分成两部分 使两部分的极差较大的一个最小 求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...
- Willem, Chtholly and Seniorious
Willem, Chtholly and Seniorious https://codeforces.com/contest/897/problem/E time limit per test 2 s ...
- CF&&CC百套计划1 Codeforces Round #449 C. Willem, Chtholly and Seniorious (Old Driver Tree)
http://codeforces.com/problemset/problem/896/C 题意: 对于一个随机序列,执行以下操作: 区间赋值 区间加 区间求第k小 区间求k次幂的和 对于随机序列, ...
- 【ODT】cf896C - Willem, Chtholly and Seniorious
仿佛没用过std::set Seniorious has n pieces of talisman. Willem puts them in a line, the i-th of which is ...
- Codeforces Round #449 (Div. 1) Willem, Chtholly and Seniorious (ODT维护)
题意 给你一个长为 \(n\) 的序列 \(a_i\) 需要支持四个操作. \(1~l~r~x:\) 把 \(i \in [l, r]\) 的 \(a_i\) 加 \(x\) . \(2~l~r~x: ...
- [Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)
无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机 ...
随机推荐
- eclipse如何debug调试jdk源码(任何源码)并显示局部变量
最近要看struts2源码 仿照了一下查看jdk源码的方式 首先你要有strtus2的jar包和源码,在struts官网上下载时,选择full版本,里面会有src也就是源码了. jar导入项目,保证可 ...
- 201621123031 《Java程序设计》第12周学习总结
作业12-流与文件 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 在Java中的java.io包中定义了许多类专门负责处理各种方式的输入与输出.其中,所有输入 ...
- Mysql 相关操作
1.用户管理 创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename us ...
- 22.C++- 继承与组合,protected访问级别
在C++里,通过继承和组合实现了代码复用,使得开发效率提高,并且能够通过代码看到事物的关系 组合比继承简单,所以在写代码时先考虑能否组合,再来考虑继承. 组合的特点 将其它类的对象作为当前类的成员使用 ...
- cord-in-a-box 2.0 安装指南
[TOC] 这篇文章简要介绍了 Ciab2.0 的安装. 包括硬件, 软件环境的选择, Ciab2.0的实际部署架构, 安装过程等. 下面就先对 Ciab2.0 部署环境做简要介绍. 1. 概述 这一 ...
- Mongodb 3 查询优化(慢查询Profiling)
开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...
- PHP分页初探 一个最简单的PHP分页代码的简单实现
PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核 ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- 点开GitHub之后,瑟瑟发抖...的我
我说句实在话啊,GitHub这个网址真的很能勾起人学习的欲望,一进入GitHub的注册页面真的让我这个英语学渣瑟瑟发抖,瞬间立下个flag:好好学习英语..... 我对python的求知欲怎么能被英语 ...