제출 #225820

#제출 시각아이디문제언어결과실행 시간메모리
225820MKopchev운세 보기 2 (JOI14_fortune_telling2)C++14
100 / 100
1197 ms52492 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...