이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
#define endl '\n'
llo n,d;
llo it[300001];
llo dp[7001][7001];
llo tree[4*300001];
llo tree2[4*300001];
llo lazy[4*300001];
llo dp2[300001];
void push(llo no,llo l,llo r){
if(lazy[no]){
tree[no]=0;
if(l<r){
lazy[no*2+1]=lazy[no];
lazy[no*2+2]=lazy[no];
}
lazy[no]=0;
}
}
void build(llo no,llo l,llo r){
if(l==r){
tree[no]=0;
}
else{
llo mid=(l+r)/2;
build(no*2+1,l,mid);
build(no*2+2,mid+1,r);
tree[no]=max(tree[no*2+1],tree[no*2+2]);
}
}
void update(llo no,llo l,llo r,llo aa,llo bb,llo j){
push(no,l,r);
if(r<aa or l>bb){
return ;
}
if(aa<=l and r<=bb){
if(j==0){
lazy[no]=1;
push(no,l,r);
}
else{
tree[no]=max(tree[no],j);
}
}
else{
llo mid=(l+r)/2;
update(no*2+1,l,mid,aa,bb,j);
update(no*2+2,mid+1,r,aa,bb,j);
tree[no]=max(tree[no*2+1],tree[no*2+2]);
}
}
llo query(llo no,llo l,llo r,llo aa,llo bb){
push(no,l,r);
if(r<aa or l>bb){
return 0;
}
if(aa<=l and r<=bb){
return tree[no];
}
else{
llo mid=(l+r)/2;
return max(query(no*2+1,l,mid,aa,bb),query(no*2+2,mid+1,r,aa,bb));
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>d;
llo ma=-1;
//llo ans=0;
map<llo,llo> sss;
for(llo i=0;i<n;i++){
cin>>it[i];
sss[it[i]]++;
// dp[i][
/* if(it[i]>ma){
ans++;
}
ma=max(ma,it[i]);*/
}
map<llo,llo> tt;
llo ind5=-1;
for(auto j:sss){
ind5++;
tt[j.a]=ind5;
}
vector<pair<llo,llo>> kk;
for(llo i=0;i<n;i++){
it[i]=tt[it[i]];
}
llo ans=0;
//build(0,0,n-1);
/*for(llo i=0;i<n;i++){
tree[i]={{0,n},i};
}*/
deque<pair<llo,llo>> xx;
/*for(llo i=0;i<n;i++){
cout<<it[i]<<":";
}
cout<<endl;*/
for(llo i=0;i<n;i++){
//le=i;
while(xx.size()){
if(xx.front().b<=i-d){
xx.pop_front();
}
else{
break;
}
}
//cout<<i-d<<endl;
while(xx.size()){
if(xx.back().a>=it[i]){
xx.pop_back();
}
else{
break;
}
}
xx.pb({it[i],i});
/*}
for(llo j=0;j<n;j++){
if(tree[j].a.b<i-d){
tree[j]={{(llo)0,n},j};
}
}*/
/* for(llo j=it[i];j<n;j++){
tree[j].a.b=max(tree[j].a.b,i);
}*/
//update2(0,0,n-1,it[i],n-1,i);
//if(it[i]>0){
//llo x=0;
llo x=0;
if(it[i]>0){
x=query(0,0,n-1,0,it[i]-1);
/*for(llo j=0;j<it[i];j++){
x=max(x,tree[j].a.a);
}*/
//x=query(0,0,n-1,0,it[i]-1);
}
//update(0,0,n-1,it[i],x+1);
update(0,0,n-1,it[i],it[i],x+1);
//tree[it[i]]=max(tree[it[i]],{{x+1,i},it[i]});
ans=max(ans,x+1);
if(i>=d){
//cout<<i<<":"<<xx.front().a<<endl;
if(xx.front().a>0){
update(0,0,n-1,0,xx.front().a-1,0);
}
/*for(llo j=0;j<xx.front().a;j++){
tree[j]={{(llo)0,n},j};
}*/
}
}
cout<<ans<<endl;
//cout<<ans<<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:86:6: warning: unused variable 'ma' [-Wunused-variable]
86 | llo ma=-1;
| ^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |