이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#include <holiday.h>
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define ll long long
#define itr ::iterator
typedef pair<ll,ll> pii;
const int MAX=3e5;
struct data
{
ll ind;
ll sum;
} seg[MAX];
vector<pii> sorted;
ll N,D,Start,pos[MAX],R[MAX],f[MAX][2],g[MAX][2],fans[MAX][2],gans[MAX][2];
void build(int low,int high,int node)
{
if(low==high)
{
if(low<=sorted.size())
{
seg[node].ind=1;
seg[node].sum=sorted[low-1].first;
}
else
{
seg[node].ind=0;
seg[node].sum=0;
}
return ;
}
int mid=(low+high)/2;
build(low,mid,2*node);
build(mid+1,high,2*node+1);
seg[node].ind=seg[2*node].ind+seg[2*node+1].ind;
seg[node].sum=seg[2*node].sum+seg[2*node+1].sum;
return ;
}
void update(int low,int high,int node,int idx,int delta)
{
if(idx>sorted.size() or idx<1)
return ;
if(low==high)
{
R[low]=delta;
seg[node].ind=delta;
if(delta)
seg[node].sum=sorted[low-1].first;
else
seg[node].sum=0;
return ;
}
int mid=(low+high)/2;
if(idx>=low and idx<=mid)
update(low,mid,2*node,idx,delta);
else
update(mid+1,high,2*node+1,idx,delta);
seg[node].ind=seg[2*node].ind+seg[2*node+1].ind;
seg[node].sum=seg[2*node].sum+seg[2*node+1].sum;
return ;
}
ll query(int low,int high,int node,int K)
{
if(low==high)
return seg[node].sum;
int mid=(low+high)/2;
if(seg[2*node].ind>=K)
return query(low,mid,2*node,K);
return seg[2*node].sum+query(mid+1,high,2*node+1,K-seg[2*node].ind);
}
// int active[MAX];
ll cal(int idx,int qlow,int qhigh,int type)
{
int rem;
pii res=mp(0,-qlow);
//for(int A=qhigh+1;A<=N;A++)
// /if(active[A])
/// {
// cout<<"ho ho "<<A<<" "<<type<<" "<<qlow<<" "<<qhigh<<" "<<idx<<"\n";
// }
// update(1,N,1,pos[qhigh+1],0);
for(int A=qhigh;A>=qlow;A--)
{
rem=idx-(type+1)*(A-Start);
if(rem>0)
res=max(res,mp(query(1,N,1,rem),(ll)-A));
update(1,N,1,pos[A],0);
}
for(int A=qlow;A<=qhigh;A++)
update(1,N,1,pos[A],1);
fans[idx][type]=res.first;
return -res.second;
}
//int active[MAX];
ll cal2(int idx,int qlow,int qhigh,int type)
{
int rem;
pii res=mp(0,qhigh);
//for(int A=1;A<qlow;A++)
// update(1,N,1,pos[qlow-1],0);
for(int A=qlow;A<=qhigh;A++)
{
rem=idx-(type+1)*(Start-A);
if(rem>0)
res=max(res,mp(query(1,N,1,rem),(ll)A));
update(1,N,1,pos[A],0);
}
for(int A=qlow;A<=qhigh;A++)
update(1,N,1,pos[A],1);
gans[idx][type]=res.first;
return res.second;
}
void cal(int low,int high,int qlow,int qhigh,int type)
{
if(low>high)
{
for(int A=qlow+1;A<=qhigh;A++)
update(1,N,1,pos[A],0);
return ;
}
//cout<<low<<" "<<high<<" "<<qlow<<" "<<qhigh<<"\n";
int mid=(low+high)/2;
f[mid][type]=cal(mid,qlow,qhigh,type);
if(low==high)
{
//if(qlow<qhigh)
// cout<<"iactive "<<qlow+1<<" "<<qhigh<<"\n";
for(int A=qlow+1;A<=qhigh;A++)
update(1,N,1,pos[A],0);
//cout<<active[5]<<"dekho \n";
return ;
}
cal(mid+1,high,f[mid][type],qhigh,type);
cal(low,mid-1,qlow,f[mid][type],type);
return ;
}
void cal2(int low,int high,int qlow,int qhigh,int type)
{
if(low>high)
{
for(int A=qlow;A<qhigh;A++)
update(1,N,1,pos[A],0);
return ;
}
int mid=(low+high)/2;
g[mid][type]=cal2(mid,qlow,qhigh,type);
if(low==high)
{
for(int A=qlow;A<qhigh;A++)
update(1,N,1,pos[A],0);
return ;
}
cal2(mid+1,high,qlow,g[mid][type],type);
cal2(low,mid-1,g[mid][type],qhigh,type);
return ;
}
ll find(int D)
{
ll res=0;
for(int A=0;A<=D;A++)
{
res=max(res,fans[A][1]+gans[D-A][0]);
res=max(res,gans[A][1]+fans[D-A][0]);
}
return res;
}
long long int findMaxAttraction(int n,int start,int d,int attraction[])
{
N=n;
D=d;
Start=start+1;
ll cur,res=0,tem=attraction[start];
attraction[start]=0;
for(int A=start;A<N;A++)
sorted.pb(mp(attraction[A],A+1));
sort(sorted.begin(),sorted.end());
reverse(sorted.begin(),sorted.end());
for(int A=0;A<sorted.size();A++)
pos[sorted[A].second]=A+1;
build(1,N,1);
cal(1,D,Start,N,0);
build(1,N,1);
cal(1,D,Start,N,1);
sorted.clear();
for(int A=0;A<=start;A++)
sorted.pb(mp(attraction[A],A+1));
sort(sorted.begin(),sorted.end());
reverse(sorted.begin(),sorted.end());
for(int A=0;A<sorted.size();A++)
pos[sorted[A].second]=A+1;
build(1,N,1);
cal2(1,D,1,Start,0);
build(1,N,1);
cal2(1,D,1,Start,1);
f[0][0]=Start;
f[0][1]=Start;
g[0][0]=Start;
g[0][1]=Start;
res=max(res,find(D));
res=max(res,tem+find(D-1));
return res;
}
/*int main()
{
ios_base::sync_with_stdio(false);
int n,d,s,attraction[100000]={10,2,20,30,1};
cout<<findMaxAttraction( n=5, s=2, d=7, attraction);
return 0;
}*/
컴파일 시 표준 에러 (stderr) 메시지
holiday.cpp: In function 'void build(int, int, int)':
holiday.cpp:28:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(low<=sorted.size())
~~~^~~~~~~~~~~~~~~
holiday.cpp: In function 'void update(int, int, int, int, int)':
holiday.cpp:50:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(idx>sorted.size() or idx<1)
~~~^~~~~~~~~~~~~~
holiday.cpp: In function 'long long int findMaxAttraction(int, int, int, int*)':
holiday.cpp:196:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int A=0;A<sorted.size();A++)
~^~~~~~~~~~~~~~
holiday.cpp:207:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int A=0;A<sorted.size();A++)
~^~~~~~~~~~~~~~
holiday.cpp:190:5: warning: unused variable 'cur' [-Wunused-variable]
ll cur,res=0,tem=attraction[start];
^~~
grader.cpp: In function 'int main()':
grader.cpp:7:12: warning: variable 'n_s' set but not used [-Wunused-but-set-variable]
int i, n_s;
^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |