제출 #577991

#제출 시각아이디문제언어결과실행 시간메모리
577991new_accGlobal Warming (CEOI18_glo)C++14
100 / 100
984 ms14124 KiB
#include<bits/stdc++.h> #define fi first #define se second #define pitem item* using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<ll> vl; const int N=1e6+10; const int SS=1<<19; const int INFi=2e9; const ll INFl=1e13; const ll mod2=998244353; const ll mod=1e9+7; const ll mod3=1000696969; const ll p=70032301; const ull p2=913; const int L=20; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); struct item{ item *l,*r; int val,maxi,prior,key; }; int t[N],dp1[N],dp2[N]; void comb(pitem v){ v->maxi=max({v->val,(v->l!=nullptr?v->l->maxi:0),(v->r!=nullptr?v->r->maxi:0)}); } pair<pitem,pitem> split(pitem v,int x){ if(!v) return {nullptr,nullptr}; if((v->key)<=x){ pair<pitem,pitem> curr=split(v->r,x); v->r=curr.fi; comb(v); return {v,curr.se}; }else{ pair<pitem,pitem> curr=split(v->l,x); v->l=curr.se; comb(v); return {curr.fi,v}; } } pitem merge(pitem v1,pitem v2){ if(!v1 or !v2) return (!v1?v2:v1); if((v1->prior)>(v2->prior)){ v1->r=merge(v1->r,v2); comb(v1); return v1; }else{ v2->l=merge(v1,v2->l); comb(v2); return v2; } } pitem add(pitem v,int key,int x){ pair<pitem,pitem>curr1=split(v,key); pair<pitem,pitem>curr2=split(curr1.fi,key-1); if(!curr2.se){ pitem nn=new item; nn->l=nullptr,nn->r=nullptr,nn->val=x,nn->maxi=x,nn->key=key; nn->prior=uniform_int_distribution<int>(1,1000*1000*1000)(rng); return merge(merge(curr2.fi,nn),curr1.se); } curr2.se->val=max(curr2.se->val,x),curr2.se->maxi=max(curr2.se->maxi,x); return merge(merge(curr2.fi,curr2.se),curr1.se); } void clear(pitem v){ if(!v) return; clear(v->l),clear(v->r); delete v; } void solve(){ int n,d; cin>>n>>d; for(int i=1;i<=n;i++) cin>>t[i]; pitem v=nullptr; for(int i=1;i<=n;i++){ pair<pitem,pitem> s=split(v,t[i]-1); if(s.fi!=nullptr) dp1[i]=s.fi->maxi; dp1[i]++; v=merge(s.fi,s.se); v=add(v,t[i],dp1[i]); } clear(v); v=nullptr; for(int i=n;i>=1;i--){ pair<pitem,pitem> s=split(v,t[i]); if(s.se!=nullptr) dp2[i]=s.se->maxi; dp2[i]++; v=merge(s.fi,s.se); v=add(v,t[i],dp2[i]); } clear(v); v=nullptr; int res=0; for(int i=n;i>=1;i--){ pair<pitem,pitem> curr1=split(v,t[i]-d); res=max(res,dp1[i]+(curr1.se!=nullptr?curr1.se->maxi:0)); v=merge(curr1.fi,curr1.se); v=add(v,t[i],dp2[i]); } cout<<res<<"\n"; } int main(){ ios_base::sync_with_stdio(0),cin.tie(0); int tt=1; while(tt--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...