Submission #1182258

#TimeUsernameProblemLanguageResultExecution timeMemory
1182258cpdreamerGlobal Warming (CEOI18_glo)C++20
48 / 100
2096 ms27232 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define P pair #define F first #define all(v) v.begin(),v.end() #define V vector #define pb push_back #define S second void file() { freopen("input.txt.txt", "r", stdin); freopen("output.txt.txt", "w", stdout); } const ll MOD=(ll)1e9+7; struct segtree{ private: struct node{ int maxd; }; node single(int v){ return {v}; } node neutral={0}; node merge(node a,node b){ return {max(a.maxd,b.maxd)}; } public: int size; V<node>query; void init(int n){ size=1; while(size<n)size*=2; query.assign(2*size,neutral); } void set(int i,int v,int x,int lx,int rx){ if(rx-lx==1){ query[x]=single(v); return; } int m=(lx+rx)/2; if(i<m) set(i,v,2*x+1,lx,m); else set(i,v,2*x+2,m,rx); query[x]=merge(query[2*x+1],query[2*x+2]); } void set(int i,int v){ set(i,v,0,0,size); } node calc(int l,int r,int x,int lx,int rx){ if(lx>=r || rx<=l) return neutral; if(l<=lx && rx<=r) return query[x]; int m=(lx+rx)/2; node a=calc(l,r,2*x+1,lx,m); node b=calc(l,r,2*x+2,m,rx); return merge(a,b); } int calc(int l,int r){ return calc(l,r,0,0,size).maxd; } }; int f(V<int>A,int n,int x){ map<int,int>mp,mp1; V<int>B=A; sort(all(B)); int cnt=1; for(int i=0;i<n;i++){ if(mp[B[i]]==0){ mp[B[i]]=cnt; mp1[cnt]=B[i]; cnt++; } } V<int>dp0(cnt,0); V<int>dp1(cnt,0); segtree tree0,tree1; tree0.init(cnt); tree1.init(cnt); for(int i=0;i<n;i++){ dp0[mp[A[i]]]=max(dp0[mp[A[i]]],tree0.calc(0,mp[A[i]])+1); int ans=-1; int l=mp[A[i]],r=cnt-1; while(l<=r){ int m=l+(r-l)/2; if(mp1[m]-A[i]<x){ ans=m; l=m+1; } else r=m-1; } if(ans!=-1){ dp1[mp[A[i]]]=max(dp1[mp[A[i]]],tree0.calc(0,ans+1)+1); } dp1[mp[A[i]]]=max(dp1[mp[A[i]]],tree1.calc(0,mp[A[i]])+1); tree0.set(mp[A[i]],dp0[mp[A[i]]]); tree1.set(mp[A[i]],dp1[mp[A[i]]]); } int ans=0; for(int i=1;i<cnt;i++){ ans=max(ans,dp1[i]); ans=max(ans,dp0[i]); } return ans; } void solve() { int n; cin >> n; int x; cin >> x; V<int> A(n); for (int i = 0; i < n; i++) { cin >> A[i]; } int ans = f(A, n, x); reverse(all(A)); for(int i=0;i<n;i++){ A[i]=-A[i]; } ans=max(ans,f(A,n,x)); cout<<ans<<endl; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //file(); solve(); }

Compilation message (stderr)

glo.cpp: In function 'void file()':
glo.cpp:11:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     freopen("input.txt.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
glo.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     freopen("output.txt.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...