Submission #724646

#TimeUsernameProblemLanguageResultExecution timeMemory
724646TimDeeHomecoming (BOI18_homecoming)C++17
31 / 100
75 ms100368 KiB
// you're already the best // _ // ^ ^ // // >(O_O)<___// // \ __ __ \ // \\ \\ \\\\ #include "homecoming.h" #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3","unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using ll = long long; #define int long long //#define double long double #define forn(i,n) for(int i=0; i<(n); ++i) #define pb push_back #define pi pair<int,int> #define f first #define s second #define vii(a,n) vector<int> a(n); forn(i,n) cin>>a[i]; #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int inf = 1e18; const int mod = 998244353; struct sgt { vector<int> t,lazy; int sz; void push(int v) { t[v]+=lazy[v]; lazy[2*v+1]+=lazy[v]; lazy[2*v+2]+=lazy[v]; lazy[v]=0; } sgt(int n) { sz=1; while (sz<n) sz<<=1; t.assign(2*sz-1,0); lazy.assign(4*sz-1,0); } int query(int v, int l, int r, int lx, int rx) { if (lazy[v]) push(v); if (rx<=l || r<=lx) return -inf; if (lx<=l && r<=rx) { return t[v]; } int m=(l+r)>>1; int lq=query(2*v+1,l,m,lx,rx); int rq=query(2*v+2,m,r,lx,rx); t[v]=max(t[2*v+1],t[2*v+2]); return max(lq,rq); } int query(int l, int r) { return query(0,0,sz,l,r); } void add(int v, int l, int r, int lx, int rx, int x) { if (lazy[v]) push(v); if (rx<=l || r<=lx) return; if (lx<=l && r<=rx) { lazy[v]+=x; push(v); return; } int m=(l+r)>>1; add(2*v+1,l,m,lx,rx,x); add(2*v+2,m,r,lx,rx,x); t[v]=max(t[2*v+1],t[2*v+2]); } void add(int l, int r, int x) { add(0,0,sz,l,r,x); } }; #undef int long long solve(int N, int K, int *A, int *B) { #define int long long const int inf = 1e18; int ans=0; int n=N, k=K; vector<int> a,b; forn(i,n) a.pb(A[i]); forn(i,n) a.pb(a[i]); forn(i,n) b.pb(B[i]); forn(i,n) b.pb(b[i]); forn(i,n) b.pb(b[i]); vector<int> pra(2*n+1,0), prb(3*n+1,0); forn(i,2*n) pra[i+1]=pra[i]+a[i]; forn(i,3*n) prb[i+1]=prb[i]+b[i]; vector<int> dp(2*n+1,0); sgt st(2*n+1); if (n>5000) return 0; for (int i=1; i<=2*n; ++i) { dp[i]=max(dp[i],dp[i-1]); int sub=(i>=n)?dp[i-n]:0; int l=max(0ll,i-n); int r=i; int x=st.query(l,r); //cout<<l<<' '<<r<<' '<<x<<": "<<a[i-1]<<' '<<(prb[i+k-1]-prb[i-1])<<'\n'; dp[i] = max(dp[i],x+a[i-1]-(prb[i+k-1]-prb[i-1])-sub); st.add(i,i+1,dp[i]); st.add(0,i,a[i-1]-b[i-1]); if (i+k-1>=n) st.add(0,i+k-n,b[i+k-1-n]); //for(auto&x:st.t) cout<<x<<' '; cout<<'\n'; //for(auto&x:st.lazy) cout<<x<<' '; cout<<'\n'; //forn(j,i+1) cout<<st.query(j,j+1)<<' '; cout<<'\n'; } return dp[2*n]; #undef int }

Compilation message (stderr)

homecoming.cpp:5:1: warning: multi-line comment [-Wcomment]
    5 | //   \ __ __  \
      | ^
homecoming.cpp: In function 'long long int solve(int, int, int*, int*)':
homecoming.cpp:82:15: warning: unused variable 'inf' [-Wunused-variable]
   82 |     const int inf = 1e18;
      |               ^~~
homecoming.cpp:84:9: warning: unused variable 'ans' [-Wunused-variable]
   84 |     int ans=0;
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...