这玩意为啥是紫。

考虑对每个小于\(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. LDAP-初见

    目录 什么是LDAP? LDAP 协议能解决什么问题? Spring Boot中使用LDAP来统一管理用户信息 添加用户 连接LDAP服务端 什么是LDAP? LDAP 的全称是 Lightweigh ...

  2. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  3. Scrum Meeting 0503

    零.说明 日期:2021-5-3 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成登录.后端管理 ...

  4. java监控JVM的内存使用情况等

    以下的程序监控参数的代码,有些是从网络上获取的,此处进行一个记录是为了以后如果要用到方便记录. 1.引入jar包,为了获取一些cpu的使用率等信息 <dependency> <gro ...

  5. 【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)

    简介 学习Redis Cluster的第一步,即本地搭建Redis Cluster.但是在Redis的官方文档中,是介绍在Linux系统中搭建Redis Cluster.本文主要介绍在Windows系 ...

  6. stm32看门狗详细解答,看了觉得一下子明白了很多

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  7. Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了

    转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...

  8. [转]浅谈电路设计中应用DDR3处理缓存问题

    本文转自:浅谈电路设计中应用DDR3处理缓存问题_若海人生的专栏-CSDN博客 DDR系列SDRAM存储芯片的高速率.高集成度和低成本使其理所当然成为存储芯片中的一霸.在PC和消费电子领域自是如此,它 ...

  9. Python NameError: name 'unicode' is not defined

    Python2 的unicode 函数在 Python3 中被命名为 str.在 Python3 中使用 ·str 来代替 Python2 中的 unicode.

  10. hdu 1069 Monkey and Banana(记忆搜)

    题意: N(不超过30)种木块,每种木块有长.宽.高x,y,z. 木块A可以搭在木块B上当且仅当A的底面长和宽都分别小于B的顶面的长与宽,即不能有超出B的部分. 问垒起来的"木块塔" ...