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() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
随机推荐
- .Net Core微信服务商二次进件
最近商城进行微信服务商二次进件的开发,大致有几个点 一,服务商签名 二,服务商证书获取 三,图片上传 四,敏感信息加密 五,查询进件状态 除此之外,就是进件信息的拼装 电商二级商户进件申请单-状态流转 ...
- 新手小白在github上部署一个项目
新手小白在github上部署一个项目 一. 注册github账号 github地址:https://www.github.com/ 二.下载安装Git 地址:https://git-scm.com/d ...
- 【UE4 设计模式】状态模式 State Pattern
概述 描述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式. 有限状态机(FSMs) ...
- 第七次Scrum Metting
日期:2021年5月5日 会议主要内容概述:前后端对接,以及接下来的测试优化等工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 测试数据模块和 ...
- [no code][scrum meeting] Alpha 4
项目 内容 会议时间 2020-04-09 会议主题 OCR相关的技术展示与讨论 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).ca ...
- 华为HG255D挂卡中继专用旋风科技固件
正的挂卡不掉线不掉速,稳定上网看上去好像很NB的样子 挂卡设置教程:http://picimg.lshou.com/pic/clou ... /6/t/1/30247515.mp4 固件链接: htt ...
- bash执行顺序:alias --> function --> builtin --> program
linux bash的执行顺序如下所示: 先 alias --> function --> builtin --> program 后 验证过程: 1,在bash shell中有内置 ...
- 关于linux的fork的一点学习总结
最近操作系统的实验要用到fork,于是去搜索了一下资料,很幸运地在博客中找到一篇深度好文: http://blog.csdn.net/jason314/article/details/5640969 ...
- 第03课 OpenGL 添加颜色
添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形 ...
- Harbor仓库搭建及使用
目录 一.docker配置 二.安装docker-compose 三.安装harbor 四.管理harbor 五.springboot项目配置docker 六.linux服务器上打包并推送至harbo ...