【Luogu】P3933 Chtholly Nota Seniorious
【题意】将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小。n,m<=2000
【算法】二分
【题解】极差的数值满足单调性,所以考虑二分极差。
对于给定的极差,将所有数值排序后,1~a[n*m]-num-1必须选择A,a[1]+num+1~n*m必须选择B,其它不要求。(开始的时候想二分图染色,后来发现排序一下规律就十分明显了)
现在问题转化为矩阵中已知一些格子选A,一些格子选B,求能否组成合法方案。
观察要求满足的条件,很容易得出结论:分界线必须单调,所以就有上A下B或上B下A,递增或递减,组合成四种情况。
针对上B下A,递增的情况(其他情况类似),对于每一列,找到最下面的B和最上面的A,维护A的递增同时看B是否严格在A上方。
复杂度O(n*m log max(Ai))。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a<b?b:a;}
int abs(int x){return x>?x:-x;}
void mins(int &a,int b){if(a>b)a=b;}
void maxs(int &a,int b){if(a<b)a=b;}
//void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=; int n,m,A,B,tot,a[maxn*maxn],c[maxn*maxn],minA[maxn],minB[maxn],maxA[maxn],maxB[maxn];
struct cyc{int id,num;}b[maxn*maxn];
bool cmp(cyc a,cyc b){return a.num<b.num;}
int find(int x,int y){
int id=c[(x-)*m+y];
if(id<A)return ;
if(A<=id&&id<B)return ;
return ;
}
bool check(int number)
{
bool ok=;int num;
A=lower_bound(a+,a+tot+,a[tot]-number)-a;
B=upper_bound(a+,a+tot+,a[]+number)-a;
if(A>B)return ;
memset(maxA,0x3f,sizeof(maxA));memset(maxB,0x3f,sizeof(maxB));
memset(minA,,sizeof(minA));memset(minB,,sizeof(minB));
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
if(find(j,i)==&&maxA[i]==inf)maxA[i]=j;
if(find(j,i)==&&maxB[i]==inf)maxB[i]=j;
if(maxA[i]!=inf&&maxB[i]!=inf)break;
}
for(int j=n;j>=;j--){
if(find(j,i)==&&!minA[i])minA[i]=j;
if(find(j,i)==&&!minB[i])minB[i]=j;
if(minA[i]&&minB[i])break;
}
}
num=n+;ok=;
for(int i=;i<=m;i++){
num=min(num,maxA[i]);
if(minB[i]>=num){ok=;break;}
}
if(ok)return ; num=n+;ok=;
for(int i=;i<=m;i++){
num=min(num,maxB[i]);
if(minA[i]>=num){ok=;break;}
}
if(ok)return ; num=n+;ok=;
for(int i=m;i>=;i--){
num=min(num,maxA[i]);
if(minB[i]>=num){ok=;break;}
}
if(ok)return ; num=n+;ok=;
for(int i=m;i>=;i--){
num=min(num,maxB[i]);
if(minA[i]>=num){ok=;break;}//
}
if(ok)return ; return ;
}
int main()
{
n=read();m=read();
int l=,r=,mid;
for(int i=;i<=n;i++)for(int j=;j<=m;j++){
int num=read();r=max(r,num);
b[++tot]=(cyc){(i-)*m+j,num};
}
sort(b+,b+tot+,cmp);
for(int i=;i<=tot;i++)c[b[i].id]=i;
for(int i=;i<=tot;i++)a[i]=b[i].num;
while(l<r)
{
mid=(l+r)>>;
if(check(mid))r=mid;else l=mid+;
}
printf("%d",l);
return ;
}
【Luogu】P3933 Chtholly Nota Seniorious的更多相关文章
- 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...
- 【题解】Willem, Chtholly and Seniorious Codeforces 896C ODT
Prelude ODT这个东西真是太好用了,以后写暴力骗分可以用,写在这里mark一下. 题目链接:ヽ(✿゚▽゚)ノ Solution 先把原题解贴在这里:(ノ*・ω・)ノ 简单地说,因为数据是全部随 ...
- 【CF896C】Willem, Chtholly and Seniorious
ODT模板题,ODT适合随机数据下具有维护区间推平操作的序列维护题目,时间复杂度较为玄学.. 代码如下 #include <bits/stdc++.h> #define pb push_b ...
- Chtholly Nota Seniorious
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...
- noip模拟赛 Chtholly Nota Seniorious
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...
- 【Luogu】P1613 跑路
[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...
- 【Luogu】P3930 SAC E#1 - 一道大水题 Knight
[题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...
- 【Luogu】P3927 SAC E#1 - 一道中档题 Factorial
[题目]洛谷10月月赛R1 提高组 [题意]求n!在k进制下末尾0的个数,n<=1e18,k<=1e16. [题解]考虑10进制末尾0要考虑2和5,推广到k进制则将k分解质因数. 每个质因 ...
- 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2
[题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstri ...
随机推荐
- Debian常用软件
1. 有道词典 https://github.com/justzx2011/openyoudao
- iOS- <项目笔记>UI控件常见属性总结
1.UIView // 如果userInteractionEnabled=NO,不能跟用户交互 @property(nonatomic,getter=isUserInteractionEnabled) ...
- 第三章 持续集成jenkins工具使用之邮件配置
1 Email Extension Plugin插件安装 持续集成很重要的一环就是及时将构建结果通知到对应的责任人,如:构建失败了,至少需要下发通知给造成本次构建失败的开发人员,如果包含自动化测试 ...
- AMH面板命令操作大全
LNMP面板 - AMH 命令使用nginx篇 » SSH Nginx1) 有步骤提示操作: ssh执行命令: amh nginx然后选择对应选项进行操作. 2) 或直接操作: 启动Nginx: am ...
- Oracle导数据到SQL server的方法总结
通过oracle10g 访问sql server 2008 导数据步骤 最近在项目中遇到要将Oracle数据库的数据导入到SQL server数据库中,解决办法如下: 一.准备工作 配置Oracle ...
- 为windows phone listbox 添加触摸倾斜效果
在开发windows phone程序时,经常会用到listbox或者是longlistselector等列表控件.当点击时没有触摸效果体验会稍差一些,像windows phone中的设置页面一样,点击 ...
- 【题解】CF#285 E-Positions in Permutations
挺有收获的一道题ヾ(◍°∇°◍)ノ゙ 恰好为 m ,这个限制仿佛不是很好处理.一般而言,我所了解的恰好为 k 的条件,不是用组合数 / dp状态转移 / 斜率二分就只剩下容斥了.我们可以先处理出 nu ...
- 【题解】CF#1012 C-Hill
感觉这题的状态还是比较明显的.设置状态 \(f[i][j][0/1]\) 表示dp到第 \(i\) 个位置,前面(包括这里)已经出现了 \(j\) 个山峰,当前位置是不是山峰即可 dp.这样的状态有一 ...
- [CF888G]Xor-MST
题目大意:给一个$n$个点的完全图,第$i$个点有点权$v_i$,一条边$x-y$的边权为$v_x\oplus v_y$,求最小生成树 题解:明显$Kruskal$和$Prim$都会$TLE$,有一种 ...
- 控制Docker Compose的启动顺序的一个思路
起源 守护进程daemon 从守护进程的角度看Docker Compose Docker的解决方案 思路 代码 结果 起源 Docker Compose提供了一个depends_on参数. https ...