[NOI online2022提高C] 如何正确地排序
题目描述
有一个 \(m\times n\) 的数组 \(a_{i,j}\)。
定义:
\(f(i,j)=\min\limits_{k=1}^m(a_{k,i}+a_{k,j})+\max\limits_{k=1}^m(a_{k,i}+a_{k,j})\)
你需要求出 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(i,j)\)
输入格式
第一行两个正整数 \(m,n\)。
接下来 \(m\) 行,每行 \(n\) 个正整数表示 \(a_{i,j}\)。
输出格式
一行一个正整数,表示答案。
输入输出样例
输入 #1
3 5
1 7 2 2 7
9 10 4 10 3
7 7 8 10 2
输出 #1复制
564
说明/提示
【样例 1 解释】
以 \(f(3,5)\) 为例:
\(\begin{aligned}f(3,5)&=\max(a_{1,3}+a_{1,5},a_{2,3}+a_{2,5},a_{3,3}+a_{3,5})+\min(a_{1,3}+a_{1,5},a_{2,3}+a_{2,5},a_{3,3}+a_{3,5})\\&=\max(9,7,10)+\min(9,7,10)\\&=10+7\\&=17\end{aligned}\)
下面给出 \(f(i,j)\) 的数表,第 \(i\) 行第 \(j\) 列表示 \(f(i,j)\):
\(\begin{array}{|c|c|c|c|c|}\hline20&27&18&22&20\\\hline27&34&24&29&23\\\hline18&24&20&22&17\\\hline22&29&22&24&22\\\hline20&23&17&22&18\\\hline\end{array}\)
它们的和是答案 \(564\)。
统一一下,为了避免繁琐的分类讨论,我们把第一行多复制几次,填满四行。这样子答案很明显是不会变的,本来的最大值和最小值不会变。所以我们同意\(m=4\)处理。
首先我们考虑计算出一个数\(a_{i,j}\)会被计算多少次,然后乘上。但是这样子计算需要三维偏序,代码量巨大,同时容易被卡常。所以我们反着来考虑,设他在每次涉及这一列时都会被计算一次,那么总答案为\(2\times n\times sum\),sum为\(a_{i,j}\)的和。要注意\(f(i,j)\)和\(f(j,i)\)都会被计算到。
然后考虑一个数什么时候是没有贡献的,当存在$$a_i+a_j\le b_i+b_j\le c_i+c_j$$时,\(b_j\)在计算\(f(i,j)\)时没有贡献。我们可以枚举a,b,c数组然后减去b的在上面这种情况中的不合法现象。
如何计算是一个重点。首先对式子进行移项,得到$$a_i-b_i\le b_j-a_j$$
\]
对于j这个位置来说,要求有多少个数是满足上面两个式子的,这很明显是一个二位偏序问题。我们把所有\(a_i-b_i\)和$ b_j-a_j$进行排序,然后遍历。如果是前者那就更新,如果是后者那就询问。题目为了帮我们卡常,很良心地把范围缩小。
其实大体就是这样了。注意其实一个不在范围里的数他也会被减去两次,设\(a<b<c<d\),在\(a,b,d\)和\(a,b,c\)两次枚举中都会减去b的不合法情况,刚好和一开始算的两倍抵消。
还有一个值得注意的地方,设\(a<b=c\),那么在\(a,b,c\)和\(a,c,b\)两次都会减去\(b,c\)的情况,然而我们需要保留一个。所以我们需要给b和c定一个大小的顺序,我这里是额定行数大的数大,在排序时做一个偏移就可以了。就是在\(a_i-b_i\)上增加上a的行数是否大于b的判断。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int m,n,a[5][N],tr[N+N],lsh[N+N],ret,mx,mn,t;
long long sum;
struct node{
int x,y,val,z;
bool operator<(const node&n)const{
if(x!=n.x)
return x<n.x;
return z<n.z;
}
}q[N+N];
int ask(int x)
{
ret=0;
for(;x;x-=x&-x)
ret+=tr[x];
return ret;
}
void update(int x)
{
for(;x<=N+N;x+=x&-x)
tr[x]++;
}
void solve(int x,int y,int z)
{
memset(tr,0,sizeof(tr));
for(int i=1;i<=n;i++)
{
q[i<<1]=(node){a[y][i]-a[x][i],a[z][i]-a[y][i],a[y][i],1};
q[2*i-1]=(node){a[x][i]-a[y][i]+(x>y),a[y][i]-a[z][i]+(y>z),0,0};
}
sort(q+1,q+n+n+1);
for(int i=1;i<=n+n;i++)
{
if(q[i].z)
sum-=1LL*q[i].val*ask(q[i].y+N);
else
update(q[i].y+N);
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",a[i]+j);
for(int i=m+1;i<=4;i++)
for(int j=1;j<=n;j++)
a[i][j]=a[1][j];
for(int i=1;i<=4;i++)
for(int j=1;j<=n;j++)
sum+=a[i][j];
sum=sum*n*2;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(i!=j)
for(int k=1;k<=4;k++)
if(i!=k&&j!=k)
solve(i,j,k);
printf("%lld",sum);
return 0;
}
[NOI online2022提高C] 如何正确地排序的更多相关文章
- [NOI Online 2022 提高组] 如何正确地排序
\(\text{Solution}\) 当 \(m=2\) 时,\(ans=2n\sum a_{i,j}\) 当 \(m=3\) 时 当然先套路地考虑某一行的贡献,记为第 \(x\) 行 则当取 \( ...
- 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序
洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...
- 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 输入三个数,比较其大小,并从大到小输出. 输入格式 一行三个整数. 输出格式 一行三个整数,从大到小排序. 样例输入 33 88 77 样 ...
- NOI Online 提高组 题解
来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...
- [NOI Online 提高组]冒泡排序
题目 洛谷等许多 \(OJ\) 都有 思路 考试题,今日无意又做了一次 然后发现自己读错题了······ 其实询问时只要 \(k\) 轮排序后的逆序对个数并不需要真的对序列进行更改 很显然 \(k\) ...
- Vijos1605 NOIP2008 提高组T4 双栈排序 BFS
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - Vijos1605 题意概括 有1个1~n的排列,有2个栈,现在通过以下操作,使得出栈序列有序. 操作a 当前 ...
- [NOI.AC#35]string 缩点+拓扑排序
链接 因为有交换相邻字母,因此给你字符串就相当于给你了这个字符串的所有排列 把等价的串映射到整数范围,再根据 \(m\) 种魔法连边,缩点后在 DAG 上DP即可 无耻地用了int128 #inclu ...
- NOI ONLINE 提高组 序列 根据性质建图
题目链接 https://www.luogu.com.cn/problem/P6185 题意 应该不难懂,跳过 分析 说实话第一眼看到这题的时候我有点懵,真不知道怎么做,不过一看数据,还好还好,暴力能 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
随机推荐
- 开源Java诊断工具Arthas:开篇之watch实战
一.前言 还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您 本文开篇主要介绍 阿里开源的诊断神器Arthas 3.7.0版本,watch.jad.classloa ...
- Redis从入门到放弃(11):雪崩、击穿、穿透
1.前言 Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力.然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩.缓存穿透和缓存击穿.本文将深入探讨这 ...
- 数据可视化【原创】vue复合数字形式展示
做数据可视化的时候,经常碰到需要很灵活的数字形式展示. 先上个效果图: 如图包括名称,数量,别名,单位,上升下降,环比等等的复合数据展示,并且需要支持样式灵活配置. 此组件包括2个模块,父容器组件bo ...
- 【译】在 Visual Studio 中处理图像变得更容易了
任何 Web.桌面或移动开发人员都经常使用图像.你可以从 C#.HTML.XAML.CSS.C++.TypeScript 甚至代码注释中引用它们.有些图像是本地的,有些存在于线上或网络共享中,而其他图 ...
- vue3探索——组件通信之依赖注入
背景 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props.想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据.在 ...
- 代码检视的新姿势!在IDEA中得到沉浸式Code Review新体验
大家好,好久不见,又见面了. 在消失的这段时间里,我做了件大事,见证了儿子的出生并陪伴其一天天的成长.停止更文的200多天里,还能得到小伙伴们持续的支持,让我备受鼓励.对一个技术人员而言,分享技术观点 ...
- 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题
一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...
- Jmeter获取Websocket多帧消息的实现方法
由于需要对WebSocket进行压力测试,因此又回归到了JMeter的使用.网络上缺少具体的获取多帧消息的操作,且自己也踩了两个坑,总结一下可行的操作供大家参考. 一.情况说明 ...
- 你准备好了吗,9月19日Java21要来了
前言 9月份的TIOBE编程语言榜单已公布,Python依然是第一,Java第四. 而这个月还有一个重要的事情,就是9月19日Java21将会全面发布,一段时间没关注的我一口老血喷在屏幕上. 我记得我 ...
- ionic4请求skynet服务器的资源跨域问题
最近在做一个后台接口, 顺便用ionic4写了个简单的管理后台, 本来skynet管理后台监听的端口是6666, 但是发现chrome默认对一些接口不友善, 虽然可以通过设置启动参数来解决, 但是还是 ...