【vijos】1882 石阶上的砖(中位数+特殊的技巧)

https://vijos.org/p/1882

这种题很赞。。

以后记得这些绝对值最小的优先想中位数啊orz

首先我们将所有的高度都减掉他们的高度差,那么得到的应该是一串高低不平的数列,那么题目转化为,将这个改变后的数列变成一样高的最小费用。

那么显然是中位数啦。

好赞。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << ‘\t‘; cout << endl
inline const ll getint() { ll r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=300005;
int n;
ll x, nx[N+N], ans;

int main() {
	read(n);
	for1(i, 1, n) nx[i]=getint()-abs(n/2-i+1);
	for1(i, 1, n) nx[n+i]=getint()-abs(n/2-i+1);
	sort(nx+1, nx+1+n+n);
	x=nx[n];
	for1(i, 1, n<<1) ans+=abs(nx[i]-x);
	printf("%lld", ans);
	return 0;
}

背景

微雨的山门下
石阶湿着——
只有独立的我
和缕缕的游云
这也是‘同参密藏‘么

描述

清晨, Alice与Bob在石阶上玩砖块.
他们每人都有属于自己的一堆砖块.
每人的砖块都由N列组成且N是奇数.
Alice的第i列砖块有m[i]个.
而Bob的第i列砖块有s[i]个.

他们想建造城堡, 两座一样的城堡.
每一座城堡都是从正中间一列开始:
1)若往左侧看去,数量逐次增加,每一列都比右侧的一列多出恰一块砖.
2)若往右侧看去,数量逐次增加,每一列都比左侧的一列多出恰一块砖.

那么,最左侧与最右侧的高度当然是一样的呵.

每一次.
他们可以扔掉一块砖头,以减少某一列的砖头数量.这算是一次操作.
他们可以再找一块砖头,以增加某一列的砖头数量.这又算是一次操作.
但是.
不能从一列去除一块砖头,再放置到别的列中.
被扔掉的砖头,永远也不能再被使用.

最少,最少,需要多少次操作?

格式

输入格式

输入数据第一行: 一个奇数N, 1<=N<=300,000, 表示Alice和Bob分别有多少列砖头.
第二行有N个整数, m[i], 0<=m[i]<=1,000,000,000,000. 表示Alice每一列的砖头个数.
第三行有N个整数, s[i], 0<=s[i]<=1,000,000,000,000. 表示Bob每一列的砖头个数.

输出格式

输出只有一行, 要求输出最少的操作次数.

样例1

样例输入1[复制]

3
1 2 3
3 2 2

样例输出1[复制]

3

样例2

样例输入2[复制]

5
2 3 0 1 4
3 3 2 3 1

样例输出2[复制]

10

限制

对于40%的数据:N<=1000
对于60%的数据:N<=300,000;0<=s[i],m[i]<=1,000,000
对于100%的数据:N<=300,000;0<=s[i],m[i]<=1,000,000,000,000

提示

样例1的解释: Alice对于其第一列新添两块砖. Bob对于其第三列新添一块砖.
那么,两人所建城堡每一列的砖头个数为: 3 2 3 是相同的且满足要求.

时间: 2024-08-24 13:41:11

【vijos】1882 石阶上的砖(中位数+特殊的技巧)的相关文章

Vijos P1389婚礼上的小杉

背景 小杉的幻想来到了经典日剧<求婚大作战>的场景里……他正在婚礼上看幻灯片,一边看着可爱的新娘长泽雅美,一边想,如果能再来一次就好了(-.-干嘛幻想这么郁闷的场景……). 小杉身为新一代的山下智久,在虔诚地在心里呼喊了几千次以后,妖精终于出现了. 妖精说,我还是可以帮你回到这张照片的过去,让你再来一次,可是你要帮我一个忙. (若对情节有任何疑问,请观看原剧) 描述 原来妖精先生在夏威夷的教堂里住了太久,家里的信件堆积了太多,凌乱不堪,你的工作就是帮他整理信件. 总计N封的信件,每个信件都有自

【vijos】1447 开关灯泡(高精度+特殊的技巧)

https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇数!(包括1和他自己)!!! 在区间[1, n]中,一共有sqrt(n)个完全平方数!(这个多想想就知道了...) 然后就是高精度...高精度的开方不难写,(但是我在我的高精模板上找到了错误good..就是不要memset整个数组,要不然果断tle)二分mid然后验证即可. #include <cs

【vijos】1791 骑士的旅行(特殊的技巧)

https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没想到.. 为啥要bfs..这种找路径的依赖前边状态的不需要bfs啊! 因为bfs是无限拓展的,状态很大,本题又是8种决策,状态达到8^n啊....sad.. 我们可以这样想,因为状态是向前走的,而且当前状态只依赖于前一个状态,那么我们可以用dp思想啊..直接枚举当前状态然后看是否根据上一状态到达,标

史上最全的Chrome使用技巧集锦

1 Chrome的隐身模式 2 3 先来说说隐身模式的启用方法吧 4 5 1.键盘快捷:Ctrl + Shift + N. 6 7 2.在Windows7下的任务栏处,右击“Chrome”图标,会出一个下拉菜单,点击“新建隐身窗口”. 8 9 3.你还可以在一个正在浏览的页面中,通过“右键点击链接”出现下拉菜单,选择“在隐身窗口中打开链接”,直接进入隐身窗口(如下图). 10 11 简单一点的说,Chrome的隐身模式的好处就是保持你的隐私.具体表现在在此窗口中查看的网页不会显示在浏览器历史记录

本地上传文件至服务器的技巧(linux文件压缩及解压文件)

linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install unzip zip压缩文件夹,文件及解压文件的命令 1.压缩文件夹 zip -r 目标文件名.zip 要压缩的文件夹 2.把文件 unzip 文件 目的地 把/home目录下面的mydata.zip解压到mydatabak目录里面 3.把文件解压到当前目录 unzip 要解压的文件 其他的详细请查

用JavaScript获取页面上被选中的文字的技巧

这里介绍的一个小技巧是如何用JavaScript获取页面上被选中的文字的方法.最关键的JavaScript API是: event.selection = window.getSelection(); 这里的selection实际上是个对象,但如果我们使用 .toString()或强行转化成字符串,我们将得到被选中的文字. $(document).ready(function () { $(".contenttext").mouseup(function (e) { var txt;

网页设计上有哪些可以借鉴的技巧

说起网站,相信大家并不陌生,互联网快速发展,用户非常多,通过一个个网站组成了互联网,用户可以在其中尽情浏览,资讯新闻,影视,娱乐,学习,内容极其丰富,正是这样的用户量和信息传播速度让企业所看重,大力的进行网站的建设,为的便是能够累积用户量,帮助企业宣传,转化为客户,其实网页设计上有很多的技巧可以借鉴. 紧扣主题 一个网站的诞生,其前提便是确定网站的发展方向,然后便是风格主题,长春星宿科技www.zhxingxiu.cn认为这就意味这一切都要严格的按照主题来进行设计,恰恰是这样,设计师才容易构思,

VC++ 在控件上写字时 字体的设置技巧

//人物照片下方的文字 CFont* nFont = &afxGlobalData.fontRegular; CFont* oFont = pDc->SelectObject(nFont); CString str; str.Format(_T("姓名: %s "), m_StdName); pDc->SetBkMode(TRANSPARENT); pDc->TextOutW(22, 10, str); 解释一下: pDc->SetBkMode(TRAN

小结:特殊的技巧

对于这些题我只能说,太神了orz 中位数:中位数有个很好的性质,即在直线上所有的点到这些点的中位数的距离和是最小的.例题很多:[vijos]1882 石阶上的砖(中位数+特殊的技巧) 差分:差分是个好东西..能够进行一些区间操作orz.即我们可以将线段拆成点,权值为1(左端点)-1(右端点),那么离散端点后从左向右扫,根据所需要的维护信息,例如:[BZOJ]1637: [Usaco2007 Mar]Balanced Lineup(前缀和+差分+特殊的技巧),[BZOJ]1676: [Usaco2