题目链接

link

Solution

暴力一眼就可以看出来,枚举分界点,然后左右两边统计答案即可,但复杂度是我们无法接受的

然后我们看我们可以优化哪一部分

\(1^0\) 枚举:这部分没有办法优化

\(2^0\) 统计答案

这里我们看每一个位置上的数字在什么时候会有增加答案

当这种有的位置可以改变答案的时候,我们就要考虑贡献法

由题意,分割点位置不同时,每个位置对于该状态下答案是否贡献是不同的

“是否贡献”还是连续的,直接上线段树维护就好

(这里解释有点玄学,但是用贡献法还是不难理解的)

CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
const int N=2e5+10;
struct node{
int minn,add,l,r;
#define l(p) t[p].l
#define r(p) t[p].r
#define add(p) t[p].add
#define minn(p) t[p].minn
}t[N<<2];
int sum[N],a[N],val[N],pos[N],n,ans;
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
inline void push_up(int p)
{
return minn(p)=min(minn(p<<1),minn(p<<1|1)),void();
}
inline void spread(int p)
{
if(add(p))
{
minn(p<<1)+=add(p); minn(p<<1|1)+=add(p);
add(p<<1)+=add(p); add(p<<1|1)+=add(p);
} return add(p)=0,void();
}
inline void build(int p,int l,int r)
{
l(p)=l; r(p)=r; if(l==r) return minn(p)=sum[l],void();
int mid=(l+r)>>1;
build(p<<1,l,mid); build(p<<1|1,mid+1,r);
return push_up(p),void();
}
inline void change(int p,int l,int r,int d)
{
if(l(p)>r||r(p)<l) return ;
if(l<=l(p)&&r(p)<=r){minn(p)+=d; add(p)+=d; return ;} spread(p);
int mid=(l(p)+r(p))>>1;
change(p<<1,l,r,d); change(p<<1|1,l,r,d);
return push_up(p),void();
}
signed main()
{
n=read(); for(int i=1;i<=n;++i) a[i]=read(),pos[a[i]]=i;
for(int i=1;i<=n;++i) val[i]=read(),sum[i]=sum[i-1]+val[i];
build(1,1,n-1); ans=minn(1);
for(int i=1;i<=n;++i)
{
change(1,1,pos[i]-1,val[pos[i]]);
change(1,pos[i],n-1,-val[pos[i]]);
ans=min(ans,minn(1));
} return printf("%lld\n",ans),0;
}
}
signed main(){return yspm::main();}

Codeforces 1295E Permutation Separation的更多相关文章

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

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

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

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

  3. codeforces 895A Pizza Separation 枚举

    codeforces 895A Pizza Separation 题目大意: 分成两大部分,使得这两部分的差值最小(注意是圆形,首尾相连) 思路: 分割出来的部分是连续的,开二倍枚举. 注意不要看成0 ...

  4. 贪心 CodeForces 137B Permutation

    题目传送门 /* 贪心:因为可以任意修改,所以答案是没有出现过的数字的个数 */ #include <cstdio> #include <algorithm> #include ...

  5. codeforces B. Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/359/B 题目意思:给定n和k的值,需要构造一条长度为2n(每个元素取值范围只能是[1,2n])且元素各不 ...

  6. Codeforces 818B Permutation Game

    首先看一下题目 B. Permutation Game time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. Codeforces 1158C Permutation recovery

    https://codeforces.com/contest/1158/problem/C 题目 已知 $p_1, p_2, \dots, p_n$ 是 $1$ 到 $n$ 的一个排列. 给出关于这个 ...

  8. Codeforces - 1033C - Permutation Game - 简单dp - 简单数论

    https://codeforces.com/problemset/problem/1033/C 一开始觉得自己的答案会TLE,但是吸取徐州赛区的经验去莽了一发. 其实因为下面这个公式是 $O(nlo ...

  9. Codeforces 1159E Permutation recovery(构造+拓扑)

    这道题其实只要解决了什么时候输出 -1 ,那么此题的构造方法也就解决了.首先我们可以观察这组 3 3 4 和 3 4 4 ,可以算出第二组是不成立的,在观察一组 2 3 4 5 和  3 2 4 5 ...

随机推荐

  1. hibernate.hbm.xml必须必须配置主键

    hibernate.hbm.xml必须必须配置主键 <id name="XXid" type="java.lang.long" column=" ...

  2. Linux 正则表达式与文本处理器 三剑客

    Linux 正则表达式与文本处理器 三剑客 一.正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linu ...

  3. 在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4

    上次在网上找了一个在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4的文档,可能是这个文档不是最新版的,安装的时候遇到了很多问题, 最后跟一个大神要了一 ...

  4. html5有哪些新特性、移除了那些元素?

    新增的元素: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 拖拽释放(Drag and drop) API 语义化更好的内容标签(header,nav, ...

  5. 题解 P1654 【OSU!】

    题面 一序列\(a\), 对于每一个\(i\)均有\(a_i\)有\(p_i\)的几率为1, 否则为\(0\) 求: \(a\)中极长全\(1\)子序列长度三次方之和的期望 前置知识 基本期望(期望的 ...

  6. 18 11 27 高级的服务器连接 epoll

    ---恢复内容开始--- 之前的  http 服务器  都是采用 轮询的方式(就像 厨师挨个问谁饿了好做饭 一样  ) 而  epoll 用着高级的 方式  事件通知 (直接问谁饿了) 同时还和  计 ...

  7. mysql 杂

    mysql> show create table  table_name|view_name \G; 可以查看是视图还是表      \G 放到sql语句后,可以使每个字段打印到单独的行 1 I ...

  8. Java web实现综合查询+SQL语句拼接

    首先展示图形界: 界面比较简单,但麻雀虽小五脏俱全.因为数据库只有六种数据类型,所以最多添加六个查询框. 测试以下问题: 删除方式是从上往下开始的,如果删除之后会有问题.(后续改进ing) 若干个并且 ...

  9. c++ 深度优先算法

    #include <iostream> using namespace std; #define VertexNum 9 /*定义顶点数*/ struct Node /*声明图形顶点结构* ...

  10. ADO多线程数据库查询

    {ADO查询多线程单元} unit ADOThread; interface uses Classes,StdCtrls,ADODB; type TADOThread = class(TThread) ...