제출 #370521

#제출 시각아이디문제언어결과실행 시간메모리
370521daniel920712Bigger segments (IZhO19_segments)C++14
100 / 100
622 ms52204 KiB
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <utility> #include <utility> #include <time.h> using namespace std; long long all[500005]; pair < long long ,long long > DP[500005]; long long sum[500005]={0},N; struct A { long long nxl,nxr; pair < long long , long long > ans; pair < long long , long long > tt; long long here; long long rnd; }Node[500005]; long long root=0; void UPD(long long here) { Node[here].ans=max(Node[Node[here].nxl].ans,Node[Node[here].nxr].ans); Node[here].ans=max(Node[here].ans,Node[here].tt); } void New(long long here,long long con,pair < long long ,long long > ans) { Node[here].ans=Node[here].tt=ans; Node[here].here=con; Node[here].nxl=0; Node[here].nxr=0; Node[here].rnd=rand(); } pair < long long , long long > split(long long here,long long con) { pair < long long , long long > tt; if(here==0) return make_pair(0,0); //printf("%lld\n",here); if(con>=Node[here].here) { tt=split(Node[here].nxr,con); Node[here].nxr=tt.first; tt.first=here; UPD(here); } else { tt=split(Node[here].nxl,con); Node[here].nxl=tt.second; tt.second=here; UPD(here); } return tt; } long long Merge(long long a,long long b) { if(a==0) return b; else if(b==0) return a; if(Node[a].here>Node[b].here) { //printf("%lld %lld\n",Node[a].here,Node[b].here); while(1); } //printf("%lld %lld\n",a,b); if(Node[a].rnd>Node[b].rnd) { Node[a].nxr=Merge(Node[a].nxr,b); UPD(a); return a; } else { Node[b].nxl=Merge(a,Node[b].nxl); UPD(b); return b; } } int main() { srand(time(NULL)); long long i,j,k,ans=0,tt=0; scanf("%lld",&N); for(i=1;i<=N;i++) { scanf("%lld",&all[i]); sum[i]=all[i]+sum[i-1]; } Node[0].ans=make_pair(-1e18,-1e18); Node[0].tt=make_pair(-1e18,-1e18); New(N+1,0,make_pair(0,0)); root=Merge(root,N+1); for(i=1;i<=N;i++) { //printf("aa %lld\n",i); pair < long long , long long > aa,bb; bb=split(root,sum[i]); aa=Node[bb.first].ans; //printf("%lld %lld %lld\n",bb.first,aa.first,aa.second); DP[i].first=aa.first+1; DP[i].second=sum[i]-sum[aa.second]; New(i,DP[i].second+sum[i],make_pair(DP[i].first,i)); root=Merge(bb.first,bb.second); bb=split(root,DP[i].second+sum[i]); root=Merge(Merge(bb.first,i),bb.second); tt=max(tt,DP[i].first); //printf("%lld %lld\n",DP[i].first,DP[i].second); } printf("%lld\n",tt); return 0; }

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

segments.cpp: In function 'int main()':
segments.cpp:83:17: warning: unused variable 'j' [-Wunused-variable]
   83 |     long long i,j,k,ans=0,tt=0;
      |                 ^
segments.cpp:83:19: warning: unused variable 'k' [-Wunused-variable]
   83 |     long long i,j,k,ans=0,tt=0;
      |                   ^
segments.cpp:83:21: warning: unused variable 'ans' [-Wunused-variable]
   83 |     long long i,j,k,ans=0,tt=0;
      |                     ^~~
segments.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   84 |     scanf("%lld",&N);
      |     ~~~~~^~~~~~~~~~~
segments.cpp:87:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   87 |         scanf("%lld",&all[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...