CF1295E Permutation Separation
线段树
难得把E想出来,写出来,但却没有调出来(再给我5分钟),我的紫名啊,我一场上紫的大好机会啊
首先考虑是否能将$k$在$1$--$n-1$的每一个的最小代价都求出来
因为$k$从$i$到$i-1$左右两边的集合只相差一个数,所以可以考虑递推
可以发现如果最终满足条件,那么左边集合的最大数一定为该集合当前的大小
且在每一个小于此大小的数都存在于左边这个集合中
由于给出的序列是一个排列,每一个数的范围是$1$--$n$
那么只要对于每一个k都进行枚举左边集合的大小计算代价,取最小值,就是该取该k时最小值
但直接暴力枚举的复杂度时$O(n^{2})$的
那么可以线段树维护以左边集合大小为每一个元素的序列
我们让$k$从$n-1$到$1$开始考虑递推
对于将$k$减一,左边集合只差了一个数
设这个数为$p$,代价为$v$
那么这个数对枚举左边集合大小的影响即是
集合大小为$p$-$n$的代价$+v$
集合大小为$0$-$p-1$的代价$-v$
然后线段树维护区间修改即可
- 1 #include <bits/stdc++.h>
- 2 #define m_k make_pair
- 3 #define int long long
- 4 #define inf (int)1e18
- 5 using namespace std;
- 6 const int N=2*1e5+100;
- 7 int n,p[N],v[N],sum[N],ans;
- 8 struct node
- 9 {
- 10 int MIN,lazy;
- 11 }sh[N*4];
- 12 void pushup(int x)
- 13 {
- 14 sh[x].MIN=min(sh[x+x].MIN,sh[x+x+1].MIN);
- 15 }
- 16 void pushdown(int x)
- 17 {
- 18 int v=sh[x].lazy;
- 19 sh[x+x].lazy+=v;
- 20 sh[x+x].MIN+=v;
- 21 sh[x+x+1].lazy+=v;
- 22 sh[x+x+1].MIN+=v;
- 23 sh[x].lazy=0;
- 24 }
- 25 void build(int x,int l,int r)
- 26 {
- 27 if (l==r)
- 28 {
- 29 sh[x].lazy=0;
- 30 sh[x].MIN=sum[n]-sum[l];//此时将k取到n,所有元素都在左边集合
- 31 return;
- 32 }
- 33 int mid=(l+r)>>1;
- 34 build(x+x,l,mid);
- 35 build(x+x+1,mid+1,r);
- 36 pushup(x);
- 37 }
- 38 void change(int x,int l,int r,int L,int R,int v)//线段树维护区间修改
- 39 {
- 40 if (L<=l && R>=r)
- 41 {
- 42 sh[x].MIN+=v;
- 43 sh[x].lazy+=v;
- 44 return;
- 45 }
- 46 pushdown(x);
- 47 int mid=(l+r)>>1;
- 48 if (L<=mid) change(x+x,l,mid,L,R,v);
- 49 if (R>mid) change(x+x+1,mid+1,r,L,R,v);
- 50 pushup(x);
- 51 }
- 52 signed main()
- 53 {
- 54 scanf("%lld",&n);
- 55 for (int i=1;i<=n;i++)
- 56 scanf("%lld",&p[i]);
- 57 for (int i=1;i<=n;i++)
- 58 {
- 59 int a;
- 60 scanf("%lld",&a);
- 61 v[p[i]]=a;//记录每一个数值的代价
- 62 }
- 63 for (int i=1;i<=n;i++) sum[i]=sum[i-1]+v[i];//计算前缀和
- 64 build(1,0,n);
- 65 ans=inf;//由于k不能取到n,所有ans不进行计算,直接赋值为inf
- 66 for (int i=n;i>=2;i--)
- 67 {
- 68 change(1,0,n,p[i],n,v[p[i]]);//同上
- 69 change(1,0,n,0,p[i]-1,-v[p[i]]);
- 70 ans=min(ans,sh[1].MIN);
- 71 }
- 72 printf("%lld\n",ans);
- 73 }
CF1295E Permutation Separation的更多相关文章
- [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和)
[Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和) E. Permuta ...
- Codeforces 1295E. Permutation Separation (线段树)
https://codeforces.com/contest/1295/problem/E 建一颗线段树,叶子结点是花费从1到i所需要花费的前缀和,表示前i个元素全部移动到右边的花费,再维护区间最小值 ...
- Codeforces 1295E Permutation Separation
题目链接 link Solution 暴力一眼就可以看出来,枚举分界点,然后左右两边统计答案即可,但复杂度是我们无法接受的 然后我们看我们可以优化哪一部分 \(1^0\) 枚举:这部分没有办法优化 \ ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- Educational Codeforces Round 81 (Rated for Div. 2) 题解
过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...
- Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...
- Codeforces Educational Round 81 解题报告
前置扯淡 赛前:这场\(Div2\)呀,那我写\(3\)题就行,\(D\)题尽力就好 赛中:啊啊,\(ABC\)我全过了\(pretest\),我太强了!!这把上蓝稳了 赛后:\(woc\),为啥被\ ...
- Codeforces题解集 1.0
记录 Codeforces 2019年12月19日到 2020年2月12日 的部分比赛题 Educational Codeforces Round 82 (Rated for Div. 2) D Fi ...
- 论文翻译:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation
我醉了呀,当我花一天翻译完后,发现已经网上已经有现成的了,而且翻译的比我好,哎,造孽呀,但是他写的是论文笔记,而我是纯翻译,能给读者更多的思想和理解空间,并且还有参考文献,也不错哈,反正翻译是写给自己 ...
随机推荐
- Varnish 6.2.2 的介绍与安装
一.简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 Squid 相比,Varnish 具有性能更高.速度更快 ...
- 网站搭建-云服务器ECS的使用
1. 查看购买的云服务器实例,重置密码 2. 查找IP进行查看,此时网页时不存在的,开始配置: 3. 登录putty或其他终端,进行网页搭建,先按教程走一遍,然后再做个性化处理: #安装Apache ...
- SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源码
页面展现 后台任务处理:恢复任务 15s执行一次后台打印消息 不BB了,直接上代码 import... /** * 调度工厂类 * Created by jinyu on 2018/4/14/014. ...
- pytest文档59-运行未提交git的用例(pytest-picked)
前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例. pytest-picked 插件可 ...
- sublime text2的插件
编写html代码,一定要使用emmet(前身是zencoding),还有以下插件也是可以考虑的:bracketHighter 高亮引号.括号等code Aligment 代码对齐DocBlockr 如 ...
- WebFlux快速上手
一.新建项目 示例使用IDEA快速创建基于SpringBoot的工程. springboot 2.3.1 java 8 WebFlux 必须选用Reactive的库 POM 依赖 <depend ...
- thinkpad怎么设置u盘启动
1.按下笔记本的开机键,当屏幕出现"Press F1 for ThinkPad BIOS Setup Utility"提示时,迅速按下f1键,此时系统就自动进入到ThinkPad的 ...
- Helium文档8-WebUI自动化-wait_until等待元素出现
前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...
- Anderson《空气动力学基础》5th读书笔记导航
没错,在2018年,我正式启程了安德森教授这本空气动力学圣经的阅读,为了深入理解概念,特写此刊,边读边写,2020年一定写完,写不完我就/¥@%¥---! 以下是导航: 第一章任务图: 第一章思维导图 ...
- IL角度理解C#中字段,属性与方法的区别
IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...