NOI模拟(3.3)螺旋序列(出题人一定是月厨)
Description
S也想寻求真正的智慧,然而由于“抑制力”的存在,她必须先解决一系列询
问。
有一个长度为n的序列a,一个长度为m序列b被称为螺旋序列当且仅当
b1=bm且对于1<=i<=m有bi<=b1。
S需要回答q个询问,每个询问用l,r两个参数描述,表示询问区间[l,r]的最长
连续子螺旋序列的长度。
Input
第一行两个整数n,q,表示序列长度和询问数。
第二行n个整数ai表示序列a。
以下q行,每行两个整数l,r表示一次询问。
Output
对每次询问输出一行一个整数表示最大连续螺旋序列的长度。
Sample Input
5 3
3 2 1 2 3
1 4
2 5
1 5
Sample Output
3
3
5
Data Constraint
本题采用捆绑测试,只有通过一个子任务的全部数据才能得到该子任务分
数,否则不得分。
子任务1(20分):n,m<=10
子任务2(20分):n,m<=1000
子任务3(20分):n,m<=2*10^5,1<=ai<=10
子任务4(40分):n,m<=5*10^5;|ai|<=10^9
Solution
30分的裸暴力
离散化相等的数字,做一个链表,st表处理区间最大值,对每个询问都暴力去跳
#include <map>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rg register template<class T> inline T dma(rg T x,rg T y) {return x>y?x:y;}
template<class T> inline void read(rg T &x)
{
rg int c=getchar();rg bool b=0;
for(;c<48||c>57;c=getchar())
if(c==45)b=1;
for(x=0;c>47&&c<58;c=getchar())
x=(x<<1)+(x<<3)+c-48;
if(b)x=-x;
} const int N=500010;
std::vector<int>vc;
std::map<int,int>hc;
int n,q,seq[N],fir[N],nex[N],st[20][N],bin[20],lgg[20],ans; void sequence_table()
{
lgg[0]=-1;for(rg int i=1;i<=n;i++)lgg[i]=lgg[i>>1]+1;
for(rg int i=0;i<20;i++)bin[i]=1<<i;
for(rg int i=1;i<=n;i++)st[0][i]=seq[i];
for(rg int t=1;t<20;t++)
for(rg int i=1;i<=n;i++)
if(i+bin[t]-1<=n)st[t][i]=dma(st[t-1][i],st[t-1][i+bin[t-1]]);
} int sequence_query(rg int x,rg int y)
{
rg int t=lgg[y-x+1];
return dma(st[t][x],st[t][y-bin[t]+1]);
} void jump(rg int x,rg int lim)
{
for(rg int rig=x,lef=nex[x];lef>=lim;lef=nex[lef])
{
while(rig>lef&&sequence_query(lef,rig)>seq[lef])rig=nex[rig];
ans=dma(ans,rig-lef+1);
}
} int main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
read(n),read(q);
for(rg int i=1;i<=n;i++)
{
read(seq[i]);
vc.push_back(seq[i]);
}
std::sort(vc.begin(),vc.end());
vc.erase(std::unique(vc.begin(),vc.end()),vc.end());
for(rg int i=0;i<vc.size();i++)
hc[vc[i]]=i+1;
for(rg int i=1;i<=n;i++)seq[i]=hc[seq[i]];
memset(fir,-1,sizeof fir);
for(rg int i=1;i<=n;i++)
{
nex[i]=fir[seq[i]];
fir[seq[i]]=i;
}
sequence_table();
for(rg int x,y;q;q--)
{
ans=1;
read(x),read(y);
for(rg int i=y;i>=x;i--)
jump(i,x);
printf("%d\n",ans);
}
fclose(stdin);
fclose(stdout);
return 0;
}
出题人一定是月厨,有爱~
考虑将这些进行jump的操作序列转化成链,离线后,用链来更新询问
对于所有链长度小于s的,用树状数组区间最值+扫描线做
对于所有链长度大于s的,这样的链只有n/s条,对每条链的下标预处理每个下标i所在链上的位置,对每个询问算出最优值并更新,复杂度为n*n/s
取s=sqrt(n/logn),可以得到O(n*sqrt(n*logn))的复杂度
#include <map>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm> template<class T> T mex(T x,T y) {return x>y?x:y;}
template<class T> void read(T &x)
{
int c=getchar();bool b=0;
for(;c<48||c>57;c=getchar())if(c==45)b=1;
for(x=0;c>47&&c<58;c=getchar())x=(x<<1)+(x<<3)+c-48;
if(b)x=-x;
} const int maxn=500010;
bool vis[maxn];
int n,m,lim,A[maxn],st[20][maxn],lgg[maxn],L[maxn],R[maxn],ans[maxn],nex[maxn],big[maxn],cur[maxn],tr[maxn]; std::map<int,int> pool;
std::vector<int> seq;
std::vector<std::pair<int,int> > Q[maxn]; inline void Add(int x,int c)
{
for(;x<=n;x+=x&-x)tr[x]=mex(tr[x],c);
} inline int Get(int x)
{
int ret=0;
for(;x;x-=x&-x)ret=mex(ret,tr[x]);
return ret;
} inline int maxi(int x,int y)
{
int t=lgg[++y-x];
return mex(st[t][x],st[t][y-(1<<t)]);
} int main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
read(n),read(m);
lgg[0]=-1;for(int i=1;i<=n;i++)
{
read(A[i]);
st[0][i]=A[i];
lgg[i]=lgg[i>>1]+1;
}
for(int i=1;i<=m;i++)
{
read(L[i]),read(R[i]);
Q[L[i]].push_back(std::make_pair(R[i],i));
ans[i]=1;
}
for(int t=1;t<20;t++)
for(int i=1;i+(1<<t)-1<=n;i++)
st[t][i]=mex(st[t-1][i],st[t-1][i+(1<<t-1)]);
for(int i=n,j;i;i--)
{
if(pool.count(A[i]))
{
j=pool[A[i]];
if(maxi(i,j)<=A[i])nex[i]=j;
}
pool[A[i]]=i;
}
lim=static_cast<int>(sqrt(n/log(n)/log(2)));
for(int i=1;i<=n;i++)
if(!vis[i])
{
seq.clear();
seq.push_back(0);
for(int j=i;j;j=nex[j])
{
seq.push_back(j);
vis[j]=true;
}
if(seq.size()>=lim)
{
for(int j=1,k=0;j<=n;j++)
{
for(;k<seq.size()&&j>=seq[k];k++)big[seq[k]]=1;
cur[j]=k-1;
}
for(int j=1,x,y;j<=m;j++)
if(cur[L[j]-1]+1<seq.size())
{
x=seq[cur[L[j]-1]+1];
y=seq[cur[R[j]]];
ans[j]=mex(ans[j],y-x+1);
}
}
}
for(int i=n;i;i--)
{
if(!big[i])
for(int j=i;j;j=nex[j])
Add(j,j-i+1);
for(int j=0;j<Q[i].size();j++)
ans[Q[i][j].second]=mex(ans[Q[i][j].second],Get(Q[i][j].first));
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
NOI模拟(3.3)螺旋序列(出题人一定是月厨)的更多相关文章
- Java实现 LeetCode 521 最长特殊序列 Ⅰ(出题人:“就是喜欢看你们不敢相信那么简单,又不敢提交的样子。”)
521. 最长特殊序列 Ⅰ 给定两个字符串,你需要从这两个字符串中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列). 子序列可以通过删去字符串中 ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- D.出题人的手环
链接:https://ac.nowcoder.com/acm/contest/358/D 题意: 出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数. 有一天,出题人和妹子分 ...
- ACM_出题人这样不好吧
出题人这样不好吧 Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为编协的第一次月赛,肯定是要有防AK(ALL KILL)的题目 ...
- 牛客 545C 出题人的数组 (贪心)
出题人有两个数组A,B,请你把两个数组归并起来使得$cost=\sum i c_i$最小. 归并要求原数组的数的顺序在新数组中不改变. 贪心水题 对于一段序列$A_i,A_{i+1},...,A_r$ ...
- 6.6 NOI 模拟
\(T1\)括号序列 --那是,朝思夜想也未尝得到的自由 一个比较常见的转化,考虑如何判断前一段和后一段能够拼成一个合法的括号序列 充要条件: 前半部分,'('看为\(1\), ')'看为\(-1\) ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- 牛客练习赛38 D 出题人的手环
链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...
随机推荐
- Golang 入门 : 理解并发与并行
Golang 的语法和运行时直接内置了对并发的支持.Golang 里的并发指的是能让某个函数独立于其他函数运行的能力.当一个函数创建为 goroutine 时,Golang 会将其视为一个独立的工作单 ...
- POJ 2255 Tree Recoveryw(二叉树)
题目原网址:http://poj.org/problem?id=2255 题目中文翻译: Description 小瓦伦丁非常喜欢玩二叉树. 她最喜欢的游戏是用大写字母构造的随机二叉树. 这是她的一个 ...
- [SDOI2013]spring
Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT 容 ...
- 题解报告:hdu 2057 A + B Again
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 问题描述 我们的HDOJ必须有许多A + B问题,现在又有新的问题出现. 给你两个十六进制整数, ...
- Linux环境下SolrCloud集群环境搭建关键步骤
Linux环境下SolrCloud集群环境搭建关键步骤. 前提条件:已经完成ZooKeeper集群环境搭建. 一.下载介质 官网下载地址:http://www.apache.org/dyn/close ...
- js中实现json格式的转换
function person(id,name,age){ this.id=id; this.name=name; this.age=age; } var p=new person(1001,'tom ...
- Object C学习笔记18-SEL,@ selector,Class,@class--转
一. SEL 类型 在上一篇介绍了几个方法,都只是介绍了其使用方式但是没有具体介绍参数: - (id)performSelector:(SEL)aSelector; - (id)performSele ...
- ambari-server启动报错500 status code received on GET method for API:/api/v1/stacks/HDP/versions/2.4/recommendations Error message : Server Error解决办法(图文详解)
问题详情 来源是,我在Ambari集群里,安装Hue. 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解 所遇到的这个问题. 然后,去ambari-server的log日志,查看,如下 ...
- ADO.net数据访问
需要引用对应命名空间:System.Data.SqlClient; SqlConnection:连接对象SqlCommand:命令对象SqlDataReader:读取器对象 //造连接字符串 stri ...
- 微信小程序组件解读和分析:六、progress进度条
progress进度条组件说明: 进度条,就是表示事情当前完成到什么地步了,可以让用户视觉上感知事情的执行.progress进度条是微信小程序的组件,和HTML5的进度条progress类似. pro ...