例题两则(不无聊的子序列,HNOI2016序列)
分享例题两则主要是分享一种
题目描述
给定一个长度为
思路点拨
类似于这样的题目,可以按照我下述的方法进行思考。
对于一个元素而言,我们记录上一个与他值相同的元素的下标
如果对于点
时间复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int MAXN=4e5+10;
int T,n,a[MAXN];
map<int,int> pre,suc;
int lef[MAXN],rig[MAXN];
struct node{
int l,r,h,w;
bool friend operator<(const node &A,const node &B){
return A.h<B.h;
}
}line[MAXN];
struct seg{
int l,r;
int sum,len;
}t[MAXN<<3];
void pushup(int i){
if(t[i].sum) t[i].len=t[i].r-t[i].l+1;
else t[i].len=t[i<<1].len+t[i<<1|1].len;
}
void build(int i,int l,int r){
t[i].l=l,t[i].r=r;
t[i].sum=t[i].len=0;
if(l==r) return ;
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
void update(int i,int l,int r,int w){
if(l<=t[i].l&&t[i].r<=r){
t[i].sum+=w;
pushup(i);
return ;
}
if(t[i].l>r||t[i].r<l) return ;
update(i<<1,l,r,w);
update(i<<1|1,l,r,w);
pushup(i);
}
signed main(){
T=read();
while(T--){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
pre.clear(),suc.clear();
for(int i=1;i<=n;i++){
lef[i]=pre[a[i]];
if(!lef[i]) lef[i]=0;
pre[a[i]]=i;
}
for(int i=n;i;i--){
rig[i]=suc[a[i]];
if(!rig[i]) rig[i]=n+1;
suc[a[i]]=i;
}
for(int i=1;i<=n;i++){
//(lef[i]+1,i),(i,rig[i]-1)
line[(i<<1)-1].l=line[i<<1].l=lef[i]+1;
line[(i<<1)-1].r=line[i<<1].r=i;
line[(i<<1)-1].h=i,line[i<<1].h=rig[i];
line[(i<<1)-1].w=1,line[i<<1].w=-1;
}
sort(line+1,line+n*2+1);
build(1,1,n);
int ans=0,pos=1;
for(int i=1;i<=n;i++){
while(pos<=n*2&&line[pos].h<=i){
update(1,line[pos].l,line[pos].r,line[pos].w);
pos++;
}
ans+=t[1].len;
}
if(ans==n*(n+1)/2) cout<<"non-boring"<<endl;
else cout<<"boring"<<endl;
}
return 0;
}
题目描述
给定一个长度为
思路点拨
相信大家看到上面的题目之后,看这题已经是比较简单的了。我们考虑使用单调栈求出对于下标
5 2 4 1 3
我们构建出来的矩阵就是:
0 0 0 0 3
0 0 0 1 1
0 0 4 1 1
0 2 2 1 1
5 2 2 1 1
每一次查询
我们需要编写一种数据结构,支持:
-
矩阵加一个数
-
矩阵求和
这不是随便写吗。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!