[Ynoi2015]即便看不到未来
题目大意:
给定一个序列,每次询问,给出一个区间$[l,r]$。
设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数。
长度为$L$的极长值域连续段的定义为:存在$l,r\in[1,|p|]$满足$r-l+1=L$且$\forall i\in[l,r),p_i=p_{i+1}-1$,且$l-1,r$和$l,r+1$均不满足条件。
解题思路:
在太阳西斜的这个世界里,置身天上之森。等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去、逐渐消逝的未来。我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。————世界上最幸福的女孩
珂朵莉……
看memset0的题解都要想那么久窝真是没用
这题考虑对询问离线,然后从左往右依次加上数,计算贡献。
考虑一个数$x$新加进来,会和哪些数产生贡献。
1. 在$x$上一次出现之后的数。
2. 值域在$[x-11,x+11]$之间的数(这里取$11$是因为还需要减去贡献),当然只考虑和当前位置最接近的那个数。
我们记录每个数之前出现的位置,然后把可能和当前$x$产生贡献的数拿出来,重新计算贡献。
把这些数按照位置从大到小排序,按次序加入。每加入一个数,扫一遍$x+1$开头的和$x-1$结尾的极长值域连续段,减去这一部分贡献。然后加上两边合起来的贡献。每次的贡献影响到的是加进来的数的位置到下一个加进来的数的位置之前的所有位置。
然后就搞个区间修改、单点查询的数据结构,用树状数组即可。
时间复杂度$O(22^2n+22n\log 22)$。
有点卡常数。
C++ Code:
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long LL;
const unsigned U1=-1;
namespace fastread{
char C[(int)1e8],*buf=C;
inline void init(){C[fread(C,1,(int)1e8-1,stdin)]='\n';fclose(stdin);}
inline int readint(){
int d=0;
while(!isdigit(*buf))++buf;
while(isdigit(*buf))d=d*10+(*buf++^'0');
return d;
}
}
char FW[(int)2e7],*buf=FW;
const int N=1e6+5;
int n,m,a[N],pre[N],ans[N][11];
bool vis[N];
vector<LL>num,vec[N];
int b[11][N];
inline void add(int i,int x,const int&p){for(;i<=n;i+=i&-i)b[p][i]+=x;}
inline int ask(int i,const int&p){int x=0;for(;i;i^=i&-i)x+=b[p][i];return x;}
inline void modify(int l,int r,int x,const int&p){add(l,x,p),add(r+1,-x,p);}
int main(){
fastread::init();
n=fastread::readint(),m=fastread::readint();
for(int i=1;i<=n;++i)a[i]=fastread::readint();
for(int i=1;i<=m;++i){
int l=fastread::readint(),r=fastread::readint();
vec[r].push_back((LL)l<<32|i);
}
for(int it=1;it<=n;++it){
const int v=a[it],mn=max(1,v-11),mx=min(1000000,v+11);
num.clear();
for(int i=mn;i<=mx;++i)
if(pre[i]&&pre[i]>pre[v])num.push_back((LL)pre[i]<<32|i);
num.push_back((LL)it<<32|v),num.push_back((LL)pre[v]<<32|1000002);
sort(num.rbegin(),num.rend());
for(int i=0;i<num.size()-1;++i){
int l=0,r=0;
vis[num[i]&U1]=1;
while(v-l-1&&l<=10&&vis[v-l-1])++l;
while(v+r+1<=1000000&&r<=10&&vis[v+r+1])++r;
const int all=l+r+1;
if(l&&l<=10)modify((num[i+1]>>32)+1,num[i]>>32,-1,l);
if(r&&r<=10)modify((num[i+1]>>32)+1,num[i]>>32,-1,r);
if(all<=10)modify((num[i+1]>>32)+1,num[i]>>32,1,all);
}
pre[v]=it;
for(int i:num)vis[i]=0;
for(LL i:vec[it])
for(int j=1;j<=10;++j)
ans[i&U1][j]=ask(i>>32,j)%10;
}
for(int i=1;i<=m;++i,*buf++='\n')
for(int j=1;j<=10;++j)
*buf++=ans[i][j]^'0';
fwrite(FW,1,buf-FW,stdout);
return 0;
}
在太阳西斜的这个世界里,置身天上之森。等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去、逐渐消逝的未来。我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。————世界上最幸福的女孩
珂朵莉……
---
~~看memset0的题解都要想那么久窝真是没用~~
这题考虑对询问离线,然后从左往右依次加上数,计算贡献。
考虑一个数$x$新加进来,会和哪些数产生贡献。
1. 在$x$上一次出现之后的数。2. 值域在$[x-11,x+11]$之间的数(这里取$11$是因为还需要减去贡献),当然只考虑和当前位置最接近的那个数。
我们记录每个数之前出现的位置,然后把可能和当前$x$产生贡献的数拿出来,重新计算贡献。
把这些数按照位置从大到小排序,按次序加入。每加入一个数,扫一遍$x+1$开头的和$x-1$结尾的极长值域连续段,减去这一部分贡献。然后加上两边合起来的贡献。每次的贡献影响到的是加进来的数的位置到下一个加进来的数的位置之前的所有位置。
然后就搞个区间修改、单点查询的数据结构,用树状数组即可。
时间复杂度$O(22^2n+22n\log 22)$。
有点卡常数。
[Ynoi2015]即便看不到未来的更多相关文章
- 十分钟看懂,未来Web前端开发最新趋势
首先,展望未来趋势我们就要弄懂过去的一年,也就是18年,web前端开发的重要新闻.重要事件和JavaScript的各种流行框架.模式发展趋势. 我们来快速回顾一下. NPM热门前端框架下载 先来看最热 ...
- 从西班牙、英国出租车与Uber之争,看共享打车未来发展趋势
一种新事物.新服务的崛起,必然会损害传统事物和服务的既得利益.比如在电灯泡发明之初,煤油灯企业就将电灯泡专利收购并"雪藏"以维护自己的利益.而电商的崛起,也让传统的线下实体店受到严 ...
- 既然还看不到未来之光,那就从骄阳开始的地方--IT携行
对于还没真正踏入IT的小白菜来说,哪有资格把刚学到的鸡毛蒜皮儿,三脚猫都不算的东西逮出来献丑,献丑都不算,还不如我们来谈谈人生,练练脸皮...... 我出发的起点肯定不同,多方限制,可能缺乏时光;那正 ...
- 我的周记12——"站在现在看前人对未来的预测,很有意思"
万里风云三尺剑,一庭花草半床书 聊聊最近很火的5G B站有个up主 老师好我叫何同学 优秀啊,点赞. 他做了一个5G测速的视频火啦 视频链接:https://www.bilibili.com/vi ...
- 从又一家外卖被Uber收购,看美团打车未来
别以为Uber在中国失利,连优步中国都被滴滴收购了,就认为Uber已经不行了.其实从全球范围内来看,Uber还是相当强势的--创始人的那些破事儿不算在内.此外,更重要的是Uber已经不单单是在打车业务 ...
- 从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展
从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展 Gartner与IDC的三份报告,描绘出中国RPA的市场规模与未来宏图 文/王吉伟 近期的国产RPA,可谓捷报频频.三个重量级行 ...
- 关于Apple Pay,一篇让你不看就会后悔的文章
编者按:本文作者康上明学为“小米生活”产品经理,在苹果Apple Pay发布后,他对该产品做了深入研究,带来这篇文章. 对于 Apple Pay ,我有几个疑问: 线下支付是一个庞大复杂的流程,当中涉 ...
- 预见未来丨机器学习:未来十年研究热点 量子机器学习(Quantum ML) 量子计算机利用量子相干和量子纠缠等效应来处理信息
微软研究院AI头条 https://mp.weixin.qq.com/s/SAz5eiSOLhsdz7nlSJ1xdA 预见未来丨机器学习:未来十年研究热点 机器学习组 微软研究院AI头条 昨天 编者 ...
- [Ynoi2015]纵使日薄西山
题目大意: 给定一个序列,每次单点修改,然后进行询问. 定义一次操作为,选择一个位置$x$,将这个位置的数和左边.右边两个位置的数(不存在则忽略)各减去1,然后和0取max. 对序列中最大的位置进行一 ...
随机推荐
- java调用c++ dll出现中文乱码
近期的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作. 在调用中假设路径中包括有中文字符就会出现故障.程序执行就会中止. 以下用一个小样例,来说明记 ...
- C++第11周(春)项目3 - 点类派生直线类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目3 - 点类派生直线类]定义点类Poin ...
- 【Discuz】去除版权信息,标题栏与底部改动
这篇文章尽管是介绍怎么把Discuz!的版权信息怎么搞得无影无踪,可是还是建议在不影响论坛视觉效果的情况下,保留Discuz的版权信息,毕竟它为我奉献了一个这么出色的开源论坛的phpproject.主 ...
- 将byte[]转为各种进制的字符串
/** * 将byte[]转为各种进制的字符串 * @param bytes byte[] * @param radix 基数可以转换进制的范围(2-36),从Chara ...
- C++_class_powerpoint_1.2
用英文编写(复制黏贴)果然比较吃力啊,果然还是要写中文. Expressions and Statements Operator summary Scope resolution class::m ...
- Cuckoo for Hashing
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2719 #include <stdio.h ...
- 试用php的ping命令
使用PHP自动PING IP,校检网络连接是否正常! <?php $server = 'ping kalvin.cn -n 1'; $last_line = exec($server, $arr ...
- [Apple开发者帐户帮助]三、创建证书(6)创建创建VoIP服务证书
VoIP:基于IP的语音传输(英语:Voice over Internet Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行 ...
- Visual Studio q启动卡顿
在开发人员CMD下面执行 Devenv.exe /ResetSettings ,然后顺利打开 总发现vs2015经常把cpu给占满了,导致电脑卡的不要不要的.这是CodeLens引起的,因为装了VAs ...
- APP加固反调试(Anti-debugging)技术点汇总
0x00 时间相关反调试 通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time.gettimeofday,或者直接通过sys call来获取当前时间.另外,还可以通过自定 ...