CF1539F Strange Array
这玩意为啥是紫。
考虑对每个小于\(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的更多相关文章
- [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 ...
- 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 ...
- 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 ...
- [Swift]LeetCode664. 奇怪的打印机 | Strange Printer
There is a strange printer with the following two special requirements: The printer can only print a ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- JavaScript Array对象
介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- 关于面试题 Array.indexof() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
随机推荐
- python的参数传递是值传递还是引用传递??
函数参数传递机制,传值和引用的是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(pa ...
- JVM详解(六)——对象的实例化、内存布局与访问定位
一.对象的实例化 1.创建对象的方式 2.创建对象的步骤 脑图:https://www.processon.com/view/link/61701a927d9c087040525226 3.对象属性赋 ...
- Node.js CMS——基于 NestJS/NuxtJS 的完整开源项目
这是一款轻量级的基于 Node.js 的开源 CMS,采用前后端分离开发模式,集成了 API.后台管理.WEB 展示三个完整项目.开箱即是一套完整的企业网站,适合企业.个人直接使用或二次开发. API ...
- 天脉2(ACoreOS653)操作系统学习02
天脉2(ACoreOS653)操作系统学习02 一.分区内通信方法 分区内通信指同一分区内进程之间的通信.ARINC 653定义的分区内进程通信机制,包括:缓存队列(Buffers-Queue).黑板 ...
- 机器学习:EM算法
EM算法 各类估计 最大似然估计 Maximum Likelihood Estimation,最大似然估计,即利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程. 直白来讲,就 ...
- OO_JAVA_JML系列第三次作业__架构之谈
OO_JAVA_JML系列第三次作业 ## ----架构之谈 目录 OO_JAVA_JML系列第三次作业 出发点 操作的可分离性 操作本身的多样性 实现手段:表驱动编程 储存 注册 出发点 操作的可分 ...
- Azure File Storage(一)为本地机器配置网络磁盘
一,引言 本地机器硬盘空间不够了怎么办?重要文件不想存储在本地硬盘怎么办?加外接移动硬盘:或者换大容量存储设备,都是解决方案.但是每次都得携带,还得考虑当前设备是否支持外接硬盘. 1,这个时候 Win ...
- opencv学习(一)——图像入门
图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...
- Openeuler安装完整man手册
Openeuler安装完整man手册 在 Debian 和 Ubuntu 中安装了Shell 前端软件包管理器apt(Advanced Packaging Tool),可以通过如下方式安装. ...
- 通过silky框架在.net平台构建微服务应用
目录 必要前提 使用Web主机构建微服务应用 使用.NET通用主机构建微服务应用 构建具有websocket服务能力的微服务应用 构建Silky微服务网关 开源地址 在线文档 在线示例 必要前提 (必 ...