线段树

难得把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的更多相关文章

  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. iNeuOS工业互联平台,在“智慧”楼宇、园区等领域的应用

    目       录 1.      概述... 1 2.      平台演示... 2 3.      硬件网关... 2 4.      平台接入硬件网关... 4 1.      概述 " ...

  2. 无所不能的embedding 3. word2vec->Doc2vec[PV-DM/PV-DBOW]

    这一节我们来聊聊不定长的文本向量,这里我们暂不考虑有监督模型,也就是任务相关的句子表征,只看通用文本向量,根据文本长短有叫sentence2vec, paragraph2vec也有叫doc2vec的. ...

  3. 实验报告系列:实验一 HTML语言的简单网页制作

    实验一 HTML语言的简单网页制作 一.实验目的: 1.掌握常用的HTML语言标记: 2.利用文本编辑器建立HTML文档,制作简单网页. 3.学习将其它格式的文档转换成HTML格式的文档 二.实验内容 ...

  4. 多测师讲解python _类(原始版)_高级讲师肖sir

    # Python中的类: '''定义一个类:class +名称=类 在类当中定义:def +名称=实例方法(self)与类平齐def +名称=普通函数定义一个函数:def +名称=函数在函数中:函数( ...

  5. Cypress系列(65)- 测试运行失败自动重试

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 重试的介绍 学习前的三问 什么是重试测试 ...

  6. 基于Python的接口自动化实战-基础篇之读写配置文件

    引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值.为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这些变量和变 ...

  7. python BeautifulSoup的使用方法

    BeautifulSoup的使用 我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有id或 ...

  8. kafka-伪集群搭建

      一.简介 Apache Kafka是一个快速.可扩展的.高吞吐的.可容错的分布式"发布-订阅"消息系统,使用Scala与Java语言编写,能够将消息从一个端点传递到另一个端点, ...

  9. centos8平台使用vmstat监控系统

    一,vmstat的用途和特点: vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数. 相对于 iostat 来说,vmstat 可 ...

  10. JAVA XML格式化输出

    import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.OutputFormat; import o ...