이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int nmax=2e5+42,inf=1e9+42;
int n,q;
pair<int,int> inp[nmax];
int changes[nmax];
vector<int> tree[4*nmax];
void build(int node,int l,int r)
{
if(l==r)
{
tree[node].push_back(changes[l]);
return;
}
int av=(l+r)/2;
build(node*2,l,av);
build(node*2+1,av+1,r);
tree[node]=tree[node*2];
for(auto w:tree[node*2+1])tree[node].push_back(w);
sort(tree[node].begin(),tree[node].end());
}
int last_special[nmax];
int cnt(int node,int lower)
{
int pos=lower_bound(tree[node].begin(),tree[node].end(),lower)-tree[node].begin();
return tree[node].size()-pos;
}
int query(int node,int l,int r,int lq,int rq,int lower,int upper)
{
if(l==lq&&r==rq)
{
return cnt(node,lower)-cnt(node,upper+1);
}
int av=(l+r)/2,ret=0;
if(lq<=av)ret=ret+query(node*2,l,av,lq,min(av,rq),lower,upper);
if(av<rq)ret=ret+query(node*2+1,av+1,r,max(av+1,lq),rq,lower,upper);
return ret;
}
int main()
{
scanf("%i%i",&n,&q);
for(int i=1;i<=n;i++)
scanf("%i%i",&inp[i].first,&inp[i].second);
for(int i=1;i<=q;i++)scanf("%i",&changes[i]);
build(1,1,q);
for(int i=1;i<=n;i++)
{
int ok=0,not_ok=q+1;
int mini=min(inp[i].first,inp[i].second);
int maxi=max(inp[i].first,inp[i].second);
while(not_ok-ok>1)
{
int av=(ok+not_ok)/2;
if(query(1,1,q,av,q,mini,maxi-1)>0)ok=av;
else not_ok=av;
}
last_special[i]=ok;
}
long long output=0;
for(int i=1;i<=n;i++)
{
if(last_special[i]&&inp[i].first<inp[i].second)swap(inp[i].first,inp[i].second);
int swaps=0;
if(last_special[i]<q)swaps=query(1,1,q,last_special[i]+1,q,max(inp[i].first,inp[i].second),inf);
if(swaps%2)swap(inp[i].first,inp[i].second);
output+=inp[i].first;
}
printf("%lld\n",output);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:52:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%i%i",&n,&q);
~~~~~^~~~~~~~~~~~~~
fortune_telling2.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%i%i",&inp[i].first,&inp[i].second);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:57:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i=1;i<=q;i++)scanf("%i",&changes[i]);
~~~~~^~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |