【8.27-模拟赛】remove

题解:

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int maxn=500010;
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){s=s*10+ch-‘0‘;ch=getchar();}
	return s*w;
}
int n,s[maxn],t[maxn],a[maxn],b[maxn],f[maxn];
int Abs(int x){
    if(x<0)return -x;
    return x;
}
void add1(int pos,int k){
    for(int i=pos;i<=n;i+=(i&-i))
        s[i]=min(s[i],k);
}

void add2(int pos,int k){
    pos = n - pos + 1;
    for(int i=pos;i<=n;i+=(i&-i))
        t[i]=min(t[i],k);
}

int query1(int pos){
    int re=1e18;
    for(int i=pos;i>=1;i-=(i&-i))
        re=min(re,s[i]);
    return re;
}

int query2(int pos){
    pos=n-pos+1;
    int re=1e18;
    for(int i=pos;i>=1;i-=(i&-i))
        re=min(re,t[i]);
    return re;
}

signed main(){
	#ifdef yilnr
	#else
	freopen("remove.in","r",stdin);
	freopen("remove.out","w",stdout);
	#endif
	n=read();
	for(int i=1;i<=n;++i)
		b[i]=a[i]=read();
	memset (s,127/3,sizeof(s));
	memset (t,127/3,sizeof(t));
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+1+n,a[i])-b;
    f[2]=Abs(b[a[2]]-b[a[1]]);
	f[3]=Abs(b[a[3]]-b[a[1]]);
    add1(a[3],f[2]-b[a[3]]);
	add2(a[3],f[2]+b[a[3]]);
    for(int i=4;i<=n;i++){
        f[i]=Abs(b[a[i]]-b[a[1]]);
        int tmp1=query1(a[i]);
        int tmp2=query2(a[i]);
        f[i]=min(f[i],tmp1+b[a[i]]);
        f[i]=min(f[i],tmp2-b[a[i]]);
        add1(a[i],f[i-1]-b[a[i]]);
		add2(a[i],f[i-1]+b[a[i]]);
    }
    printf("%lld\n",f[n]);
    return 0;
}

  

原文地址:https://www.cnblogs.com/yelir/p/11416415.html

时间: 2024-11-08 21:40:15

【8.27-模拟赛】remove的相关文章

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm

2.27模拟赛

pdf版题面 水题赛无题解 sol:可以用权值并查集搞,但感觉还是建图跑bfs比较容易 定义S[i]表示前缀和 读入a,b,c:就是S[a-1] + c=S[b],那就从a-1向b连一条c,b向a-1连一条-c 但这样有可能这张图并不联通,于是每次bfs时给节点染色,颜色不同显然to hard 询问随便处理下就可以了 /* S[3]-S[0]=10 S[3]-S[2]=5 */ #include <bits/stdc++.h> using namespace std; #define int

2017 9 27 模拟赛T1

题意简述: 求1-n中所有数的k次方的和,答案对1234567891取模. 样例输入格式: 一行,两个整数n,k 样例输出格式: 一个整数,即所求的和. 数据范围:n<10^9,k<100 这道题n非常大,即使是O(n)的算法也不能承受,但是此题的k却非常小,这也就提醒由k入手. 首先预处理前k+1个数的k次方的和,如果n<=k+1的话其实就可以直接输出a[0][n]了,不过我觉得出题人不会出这样的数据. 为什么是k+1个数呢?这是为了能处理一些差分的问题. 然后不断地计算每一行的差分,

2017 9 27 模拟赛 T2

原题题意:给出一个集合S,现满足以下关系: 实际题意:求32的n次方(这...)

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],