线段树

难得把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. 1 #include <bits/stdc++.h>
  2. 2 #define m_k make_pair
  3. 3 #define int long long
  4. 4 #define inf (int)1e18
  5. 5 using namespace std;
  6. 6 const int N=2*1e5+100;
  7. 7 int n,p[N],v[N],sum[N],ans;
  8. 8 struct node
  9. 9 {
  10. 10 int MIN,lazy;
  11. 11 }sh[N*4];
  12. 12 void pushup(int x)
  13. 13 {
  14. 14 sh[x].MIN=min(sh[x+x].MIN,sh[x+x+1].MIN);
  15. 15 }
  16. 16 void pushdown(int x)
  17. 17 {
  18. 18 int v=sh[x].lazy;
  19. 19 sh[x+x].lazy+=v;
  20. 20 sh[x+x].MIN+=v;
  21. 21 sh[x+x+1].lazy+=v;
  22. 22 sh[x+x+1].MIN+=v;
  23. 23 sh[x].lazy=0;
  24. 24 }
  25. 25 void build(int x,int l,int r)
  26. 26 {
  27. 27 if (l==r)
  28. 28 {
  29. 29 sh[x].lazy=0;
  30. 30 sh[x].MIN=sum[n]-sum[l];//此时将k取到n,所有元素都在左边集合
  31. 31 return;
  32. 32 }
  33. 33 int mid=(l+r)>>1;
  34. 34 build(x+x,l,mid);
  35. 35 build(x+x+1,mid+1,r);
  36. 36 pushup(x);
  37. 37 }
  38. 38 void change(int x,int l,int r,int L,int R,int v)//线段树维护区间修改
  39. 39 {
  40. 40 if (L<=l && R>=r)
  41. 41 {
  42. 42 sh[x].MIN+=v;
  43. 43 sh[x].lazy+=v;
  44. 44 return;
  45. 45 }
  46. 46 pushdown(x);
  47. 47 int mid=(l+r)>>1;
  48. 48 if (L<=mid) change(x+x,l,mid,L,R,v);
  49. 49 if (R>mid) change(x+x+1,mid+1,r,L,R,v);
  50. 50 pushup(x);
  51. 51 }
  52. 52 signed main()
  53. 53 {
  54. 54 scanf("%lld",&n);
  55. 55 for (int i=1;i<=n;i++)
  56. 56 scanf("%lld",&p[i]);
  57. 57 for (int i=1;i<=n;i++)
  58. 58 {
  59. 59 int a;
  60. 60 scanf("%lld",&a);
  61. 61 v[p[i]]=a;//记录每一个数值的代价
  62. 62 }
  63. 63 for (int i=1;i<=n;i++) sum[i]=sum[i-1]+v[i];//计算前缀和
  64. 64 build(1,0,n);
  65. 65 ans=inf;//由于k不能取到n,所有ans不进行计算,直接赋值为inf
  66. 66 for (int i=n;i>=2;i--)
  67. 67 {
  68. 68 change(1,0,n,p[i],n,v[p[i]]);//同上
  69. 69 change(1,0,n,0,p[i]-1,-v[p[i]]);
  70. 70 ans=min(ans,sh[1].MIN);
  71. 71 }
  72. 72 printf("%lld\n",ans);
  73. 73 }

CF1295E Permutation Separation的更多相关文章

  1. [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和)

    [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和) E. Permuta ...

  2. Codeforces 1295E. Permutation Separation (线段树)

    https://codeforces.com/contest/1295/problem/E 建一颗线段树,叶子结点是花费从1到i所需要花费的前缀和,表示前i个元素全部移动到右边的花费,再维护区间最小值 ...

  3. Codeforces 1295E Permutation Separation

    题目链接 link Solution 暴力一眼就可以看出来,枚举分界点,然后左右两边统计答案即可,但复杂度是我们无法接受的 然后我们看我们可以优化哪一部分 \(1^0\) 枚举:这部分没有办法优化 \ ...

  4. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  5. Educational Codeforces Round 81 (Rated for Div. 2) 题解

    过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...

  6. Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...

  7. Codeforces Educational Round 81 解题报告

    前置扯淡 赛前:这场\(Div2\)呀,那我写\(3\)题就行,\(D\)题尽力就好 赛中:啊啊,\(ABC\)我全过了\(pretest\),我太强了!!这把上蓝稳了 赛后:\(woc\),为啥被\ ...

  8. Codeforces题解集 1.0

    记录 Codeforces 2019年12月19日到 2020年2月12日 的部分比赛题 Educational Codeforces Round 82 (Rated for Div. 2) D Fi ...

  9. 论文翻译:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation

    我醉了呀,当我花一天翻译完后,发现已经网上已经有现成的了,而且翻译的比我好,哎,造孽呀,但是他写的是论文笔记,而我是纯翻译,能给读者更多的思想和理解空间,并且还有参考文献,也不错哈,反正翻译是写给自己 ...

随机推荐

  1. Varnish 6.2.2 的介绍与安装

    一.简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 Squid 相比,Varnish 具有性能更高.速度更快 ...

  2. 网站搭建-云服务器ECS的使用

    1. 查看购买的云服务器实例,重置密码 2. 查找IP进行查看,此时网页时不存在的,开始配置: 3. 登录putty或其他终端,进行网页搭建,先按教程走一遍,然后再做个性化处理: #安装Apache ...

  3. SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源码

    页面展现 后台任务处理:恢复任务 15s执行一次后台打印消息 不BB了,直接上代码 import... /** * 调度工厂类 * Created by jinyu on 2018/4/14/014. ...

  4. pytest文档59-运行未提交git的用例(pytest-picked)

    前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例. pytest-picked 插件可 ...

  5. sublime text2的插件

    编写html代码,一定要使用emmet(前身是zencoding),还有以下插件也是可以考虑的:bracketHighter 高亮引号.括号等code Aligment 代码对齐DocBlockr 如 ...

  6. WebFlux快速上手

    一.新建项目 示例使用IDEA快速创建基于SpringBoot的工程. springboot 2.3.1 java 8 WebFlux 必须选用Reactive的库 POM 依赖 <depend ...

  7. thinkpad怎么设置u盘启动

    1.按下笔记本的开机键,当屏幕出现"Press F1 for ThinkPad BIOS Setup Utility"提示时,迅速按下f1键,此时系统就自动进入到ThinkPad的 ...

  8. Helium文档8-WebUI自动化-wait_until等待元素出现

    前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...

  9. Anderson《空气动力学基础》5th读书笔记导航

    没错,在2018年,我正式启程了安德森教授这本空气动力学圣经的阅读,为了深入理解概念,特写此刊,边读边写,2020年一定写完,写不完我就/¥@%¥---! 以下是导航: 第一章任务图: 第一章思维导图 ...

  10. IL角度理解C#中字段,属性与方法的区别

    IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...