一开始写这一题,总觉得自己的代码会超时,后来看了下大佬的代码,果然,两秒的时间限制不是白给的,如果时间给的比较大的话,那么就不能局限于思维,使用一些平常觉得必超时的方法再进行部分优化也是可以的。
大佬代码
代码也就是线段树和双端队列的使用,挺易懂的。(这题让我对时间限制有了新的理解)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<deque>
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define ll long long
using namespace std;
const int MX=3e5+9;
deque<int> que[MX];
int a[MX],t[MX<<2],n,m;
void build(int k,int l,int r){
t[k]=0;
if( l==r ){
t[k]=a[l];
return ;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void pushdown(int k){
if( t[k] ){
t[k<<1]=t[k];
t[k<<1|1]=t[k];
t[k]=0;
}
}
void update(int k,int l,int r,int L,int R,int val){
if( L<=l && r<=R ){
t[k]=val;
return ;
}
pushdown(k);
int mid=(l+r)>>1;
if( L<=mid )
update(lson,L,R,val);
if( mid<R )
update(rson,L,R,val);
}
int query(int k,int l,int r,int pos){
if( l==r )
return t[k];
pushdown(k);
int mid=(l+r)>>1;
if( pos<=mid )
return query(lson,pos);
else
return query(rson,pos);
}
void solve(){
build(1,1,n);
while( m-- ){
int k;
scanf("%d",&k);
if( que[k].size()<2 )
continue;
int l=que[k].front(),r=que[k].back();
while( query(1,1,n,l)!=k && !que[k].empty() ){
que[k].pop_front();
if( !que[k].empty() )
l=que[k].front();
}
while( query(1,1,n,r)!=k && !que[k].empty() ){
que[k].pop_back();
if( !que[k].empty() )
r=que[k].back();
}
if( que[k].size()>1 )
update(1,1,n,l,r,k);
}
for( int i=1 ; i<=n ; i++ )
printf("%d ",query(1,1,n,i));
printf("\n");
return ;
}
int main()
{
// freopen("input.txt","r",stdin);
while( ~scanf("%d",&n) ){
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
for( int i=1 ; i<=n ; i++){
scanf("%d",&a[i]);
que[a[i]].push_back(i);
}
scanf("%d",&m);
solve();
}
return 0;
}