Submission #226827

#TimeUsernameProblemLanguageResultExecution timeMemory
226827EvirirSolar Storm (NOI20_solarstorm)C++17
18 / 100
2098 ms154028 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define watch(x) cout<<(#x)<<"="<<(x)<<'\n' #define mset(d,val) memset(d,val,sizeof(d)) #define setp(x) cout<<fixed<<setprecision(x) #define forn(i,a,b) for(int i=a;i<b;i++) #define fore(i,a,b) for(int i=a;i<=b;i++) #define pb push_back #define F first #define S second #define INF ll(1e18) #define MOD 998244353 #define pqueue priority_queue #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<ll,ll> ii; typedef pair<ii,ll> iii; typedef vector<ll> vi; typedef vector<ii> vii; typedef vector<iii> viii; typedef long double ld; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; #define MAXN 1000005 #define LG 22 int DEBUG=0; ll n,s,K; ll d[MAXN],v[MAXN]; ll loc[MAXN]; viii seg; int prt[MAXN][LG]; int goup(int u, int h){ for(int i=LG-1;i>=0;i--){ if(DEBUG) cout<<"test: u="<<u<<" i="<<i<<" prt[u][i]="<<prt[u][i]<<'\n'; if(h&(1LL<<i) && prt[u][i]!=-1){ if(DEBUG) cout<<"u="<<'\n'; u=prt[u][i]; } } return u; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); mset(prt,-1); cin>>n>>s>>K; for(int i=1;i<n;i++){ cin>>d[i]; if(i>0) loc[i]=loc[i-1]+d[i]; } for(int i=0;i<n;i++){ cin>>v[i]; if(i>0) v[i]+=v[i-1]; } for(int i=0;i<n;i++){ ll L=lower_bound(loc, loc+n, loc[i]-K)-loc; ll R=upper_bound(loc, loc+n, loc[i]+K)-loc-1; seg.pb({{L,R},i}); } for(int i=0;i<seg.size();i++){ while(i<seg.size()-1 && seg[i].F.F==seg[i+1].F.F) seg.erase(seg.begin()+i); } if(DEBUG){ for(int i=0;i<seg.size();i++) cout<<"i="<<i<<" ["<<seg[i].F.F<<","<<seg[i].F.S<<"] ("<<seg[i].S<<")"<<'\n'; } for(int i=0;i<seg.size();i++){ prt[i][0]=(--upper_bound(seg.begin(),seg.end(),iii(ii(seg[i].F.S+1,INF),INF)))->S; if(DEBUG) cout<<"i="<<i<<" ["<<seg[i].F.F<<","<<seg[i].F.S<<"] prt="<<prt[i][0]<<'\n'; } for(int j=1;j<LG;j++){ for(int i=0;i<seg.size();i++){ if(prt[i][j-1]!=-1) prt[i][j]=prt[prt[i][j-1]][j-1]; } } ll ans=-1, ansidx=0; for(int i=0;i<seg.size();i++){ int p=goup(i,s-1); iii L=seg[i]; iii R=seg[p]; if(DEBUG) cout<<"i="<<i<<" p="<<p<<'\n'; ll cur=v[R.F.S]-(L.F.F==0 ? 0LL : v[L.F.F-1]); if(DEBUG) cout<<"i="<<i<<" cur="<<cur<<" l="<<L.F.F<<" r="<<R.F.S<<'\n'; if(cur>ans){ ans=cur; ansidx=i; } } vi v; int cur=ansidx; for(int i=0;i<s;i++){ if(DEBUG) cout<<"cur="<<cur<<" prt[cur]="<<prt[cur][0]<<'\n'; if(cur==-1) break; v.pb(seg[cur].S); if(seg[cur].S==n-1) break; if(cur==prt[cur][0]) break; cur=prt[cur][0]; } cout<<v.size()<<'\n'; for(int i=0;i<v.size();i++){ cout<<v[i]+1<<" "; } cout<<'\n'; if(DEBUG) cout<<"Sum="<<ans<<'\n'; return 0; }

Compilation message (stderr)

SolarStorm.cpp: In function 'int main()':
SolarStorm.cpp:72:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<seg.size();i++){
              ~^~~~~~~~~~~
SolarStorm.cpp:73:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(i<seg.size()-1 && seg[i].F.F==seg[i+1].F.F) seg.erase(seg.begin()+i);
         ~^~~~~~~~~~~~~
SolarStorm.cpp:77:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<seg.size();i++) cout<<"i="<<i<<" ["<<seg[i].F.F<<","<<seg[i].F.S<<"] ("<<seg[i].S<<")"<<'\n';
               ~^~~~~~~~~~~
SolarStorm.cpp:80:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<seg.size();i++){
              ~^~~~~~~~~~~
SolarStorm.cpp:85:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<seg.size();i++){
               ~^~~~~~~~~~~
SolarStorm.cpp:91:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<seg.size();i++){
              ~^~~~~~~~~~~
SolarStorm.cpp:117:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<v.size();i++){
              ~^~~~~~~~~
#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...