这玩意为啥是紫。

考虑对每个小于\(x\)的数值设为1,大于\(x\)的数值设为-1.

那么对于答案要求的就是绝对值最大的连续段。

线段树是很显然的。

考虑我们不能对每个数都进行一遍重构,这样就退化到了\(O(n^2log)\)

我们对每个数的权值排序,那么更改操作变成了\(O(nlog)\)

然后我们用线段树维护前缀和就好了。

CF1539F Strange Array
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 200005 ll n;
ll num[N]; struct P{int v,to;}e[N]; bool operator < (P a,P b){
return a.v < b.v;
} struct Q{ll mx,mn,tag,s;Q(){mx = 0;mn = 0;tag = 0;}}t[N << 1];//维护前缀和,支持区间加,区间min,区间max #define l(x) (x << 1)
#define r(x) (x << 1 | 1)
#define mid ((l + r) >> 1) inline void pushdown(int u){
t[l(u)].mn += t[u].tag;
t[r(u)].mn += t[u].tag;
t[l(u)].mx += t[u].tag;
t[r(u)].mx += t[u].tag;
t[l(u)].tag += t[u].tag;
t[r(u)].tag += t[u].tag;
t[u].tag = 0;
} inline void up(int u){
t[u].mx = std::max(t[l(u)].mx,t[r(u)].mx);
t[u].mn = std::min(t[l(u)].mn,t[r(u)].mn);
} ll l = 1; inline void change(int u,int l,int r,int tl,int tr,int p){
pushdown(u);
if(tl <= l && r <= tr){
t[u].mx += p;
t[u].mn += p;
t[u].tag += p;
// std::cout<<u<<"mx:"<<t[u].mx<<"mi:"<<t[u].mn<<" "<<l<<" "<<r<<" "<<tl<<" "<<tr<<" "<<p<<std::endl;
return;
}
if(tl <= mid)
change(l(u),l,mid,tl,tr,p);
if(tr > mid)
change(r(u),mid + 1,r,tl,tr,p);
up(u);
// std::cout<<u<<"mx:"<<t[u].mx<<"mi:"<<t[u].mn<<" "<<l<<" "<<r<<" "<<tl<<" "<<tr<<" "<<p<<std::endl;
} inline ll qx(int u,int l,int r,int tl,int tr){
if(tr == 0)
return 0;
pushdown(u);
ll ans = -0x3f3f3f3f;
if(tl <= l && r <= tr)
return t[u].mx;
if(tl <= mid)
ans = std::max(ans,qx(l(u),l,mid,tl,tr));
if(tr > mid)
ans = std::max(ans,qx(r(u),mid + 1,r,tl,tr));
return ans;
} inline ll qi(int u,int l,int r,int tl,int tr){
// std::cout<<u<<" "<<t[u].mn<<" "<<l<<" "<<r<<" "<<tl<<" "<<tr<<std::endl;
if(tr == 0)
return 0;
pushdown(u);
ll ans = 0x3f3f3f3f;
if(tl <= l && r <= tr)
return t[u].mn;
if(tl <= mid)
ans = std::min(ans,qi(l(u),l,mid,tl,tr));
if(tr > mid)
ans = std::min(ans,qi(r(u),mid + 1,r,tl,tr));
return ans;
} ll f[N],fa[N]; int main(){
scanf("%lld",&n);
for(int i = 1;i <= n;++i)
scanf("%lld",&num[i]);
for(int i = 1;i <= n;++i)
e[i].v = num[i],e[i].to = i;
for(int i = 1;i <= n;++i)
change(1,1,n,i,n,1);
std::sort(e + 1,e + n + 1);
for(int i = 1;i <= n;++i){
ll now = e[i].to;
std::cout<<e[i].v<<" "<<e[i].to<<":"<<std::endl;
change(1,1,n,e[i].to,n,-1);
while(e[l].v <= e[i].v && l < i){
// std::cout<<l<<" "<<std::endl;
change(1,1,n,e[l].to,n,-2);
l ++ ;
}
l = i + 1;
while(e[l].v == e[i].v){
change(1,1,n,e[l].to,n,-2)
++l;
std::cout<<l<<std::endl;
}
l -- ;
// std::cout<<qx(1,1,n,now,n)<<" "<<std::min(qi(1,1,n,1,now - 1),(ll)0)<<std::endl;
// std::cout<<qi(1,1,n,now,n)<<" "<<std::max(qx(1,1,n,1,now - 1),(ll)0)<<std::endl;
ll ans = std::max((std::abs(qx(1,1,n,now,n) - std::min(qi(1,1,n,1,now - 1),(ll)0)) + 1),std::abs(qi(1,1,n,now,n) - std::max(qx(1,1,n,1,now - 1),(ll)0)));
f[now] = ans / 2;
change(1,1,n,e[i].to,n,1);
while(l > i){
change(1,1,n,e[l].to,n,2); }
}
for(int i = 1;i <= n;++i)
std::cout<<f[i]<<" ";
}

CF1539F Strange Array的更多相关文章

  1. [CF1539F] Strange Array (线段树)

    题面 有一个长度为 n \tt n n 的序列 a \tt a a ,对于每一个位置 i ∈ [ 1 , n ] \tt i\in[1,n] i∈[1,n]: 选择一个区间 [ l , r ] \tt ...

  2. Codeforces Round #326 (Div. 2) D. Duff in Beach dp

    D. Duff in Beach Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/probl ...

  3. codeforces 587B B. Duff in Beach(dp)

    题目链接: B. Duff in Beach time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. [Swift]LeetCode664. 奇怪的打印机 | Strange Printer

    There is a strange printer with the following two special requirements: The printer can only print a ...

  5. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  6. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  7. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  8. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  9. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

随机推荐

  1. beta事后分析

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 软件要解决的问题是是开发一个简易方便,为用户带来便捷且功能齐全的表情包管理小程序: 预期的典型用户 ...

  2. vcs(UST)Undefined System Task Call

    转载:VCS求助啊 - 微波EDA网 (mweda.com) Error-[UST] Undefined System Task Call../../path/bench/path.v, 51Unde ...

  3. SVN查看项目修改记录及修改内容

    工具/原料 svn 一,查看修改记录 1 选择要查看的文件夹,打开之后在空白的地方右键. 2 选择svn里面的"查看日志".show_Log 3 在弹出的日志框里,可以看到,你可以 ...

  4. Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和

    题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...

  5. poj 1704 Georgia and Bob (nim)

    题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ...

  6. linux基本命令二

    组管理与权限管理  文件/目录所有者  修改文件所有者 chown 用户名 文件名 创建文件所在组  groupadd 修改文件所在组 chgrp  组名  文件名 其他组:除文件的所有者和所在组的用 ...

  7. DeWeb 与 Unigui的区别

    DeWeb 与 Unigui 相同: 都是采用Delphi开发网页的平台 不同: 1 DeWeb不需要安装控件, 而Unigui需要安装自己的控件 2 DeWeb无需要学习HTML/CSS/JavaS ...

  8. Trap (陷入/中断) 源码解析

    用户空间和内核空间之间的切换通常称为trap trap的三种形式 系统调用引发 异常发生 设备中断 (时间中断.IO中断.网络中断等) supervise mode的权限 用户态和内核态之间的到底有什 ...

  9. 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常

    前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...

  10. k8s入坑之路(11)kubernetes服务发现

    kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...