제출 #912398

#제출 시각아이디문제언어결과실행 시간메모리
912398vjudge1Rabbit Carrot (LMIO19_triusis)C++17
100 / 100
196 ms20608 KiB
#include <bits/stdc++.h>
#define f first
#define s second	
#define ent '\n'
#define int long long

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")

using namespace std;
typedef long long ll;
const int mx=1e6+12;
const int mod=1e9+7;
int dx[]={1,-1,0,0,1,-1,1,-1};
int dy[]={0,0,1,-1,1,-1,-1,1};

int dp[5001][5001];
int tp[mx*4];
int t[mx*4];
int p[mx*4];
int a[mx];
int n,m,k;

void pull(int v,int tl,int tr,int type,int x){
	if(type==2){
		t[v]=x;
		p[v]=x;
		tp[v]=2;
	}
	else{
		t[v]+=x;
		p[v]+=x;
		if(tp[v]!=2)tp[v]=1;
	}
}
 
void push(int v,int tl,int tr){
	if(tl==tr || !tp[v])return;
	int mid=tl+tr>>1;
	pull(v*2,tl,mid,tp[v],p[v]);
	pull(v*2+1,mid+1,tr,tp[v],p[v]);
	tp[v]=0;
	p[v]=0;
}
 
void upd(int v,int tl,int tr,int l,int r,int x,int type){
	if(l>r)return;
	push(v,tl,tr);
	if(tl>r || l>tr)return;
	if(tl>=l && tr<=r){
		tp[v]=type;
		pull(v,tl,tr,tp[v],x);
		return;
	}
	int mid=tl+tr>>1;
	upd(v*2,tl,mid,l,r,x,type);
	upd(v*2+1,mid+1,tr,l,r,x,type);
	t[v]=max(t[v*2],t[v*2+1]);
}
 
int get(int v,int tl,int tr,int l,int r){
	push(v,tl,tr);
	if(tl>r || l>tr)return -1e18;
	if(tl>=l && tr<=r)return t[v];
	int mid=tl+tr>>1;
	return max(get(v*2,tl,mid,l,r),get(v*2+1,mid+1,tr,l,r));
}

int get(int v,int tl,int tr,int x){
	if(t[v]<x)return n+2;
	push(v,tl,tr);
	if(tl==tr){
		return tl;
	}
	int mid=tl+tr>>1;
	if(t[v*2]<x){
		return get(v*2+1,mid+1,tr,x);
	}
	return get(v*2,tl,mid,x);
}

void Press_Fn_with_F11(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	upd(1,0,n,0,n,-1e18,2);
	upd(1,0,n,n,n,0,2);
	for(int i=1;i<=n;i++){
		int pos=get(1,0,n,a[i]-m);
		if(pos>n)pos++;
		int x=get(1,0,n,n-i+1,n-i+1);
		upd(1,0,n,n-i+1,n,m,1);
		upd(1,0,n,pos-1,get(1,0,n,a[i]+1)-1,a[i],2);
		if(x+m>=a[i]){
			upd(1,0,n,n-i,n-i,a[i],2);
		}
	}
	cout<<get(1,0,n,0)<<ent;
}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int Alikhan_abi_crush=1;
	// cin>>Alikhan_abi_crush;
	while(Alikhan_abi_crush--){
		Press_Fn_with_F11();
	}
}

컴파일 시 표준 에러 (stderr) 메시지

triusis.cpp: In function 'void push(long long int, long long int, long long int)':
triusis.cpp:39:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |  int mid=tl+tr>>1;
      |          ~~^~~
triusis.cpp: In function 'void upd(long long int, long long int, long long int, long long int, long long int, long long int, long long int)':
triusis.cpp:55:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |  int mid=tl+tr>>1;
      |          ~~^~~
triusis.cpp: In function 'long long int get(long long int, long long int, long long int, long long int, long long int)':
triusis.cpp:65:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |  int mid=tl+tr>>1;
      |          ~~^~~
triusis.cpp: In function 'long long int get(long long int, long long int, long long int, long long int)':
triusis.cpp:75:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   75 |  int mid=tl+tr>>1;
      |          ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...