제출 #1213354

#제출 시각아이디문제언어결과실행 시간메모리
1213354Rawlat_vanakRotating Lines (APIO25_rotate)C++20
16 / 100
66 ms11120 KiB
#include "rotate.h" #include <bits/stdc++.h> using namespace std; //#define int long long #define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); //#define mod 1000000007 #define f first #define s second #define pii pair<long long,long long> #define pb push_back const long long M=50000; vector<long long> final,bit; long long total_cost, last_energy; bool flag=false; long long get(long long n, long long i){ i++; long long ans=0; while(i>0){ ans+=bit[i]; i-=i&(-i); } return ans; } void update(long long n, long long i, long long x){ i++; while(i<=n){ bit[i]+=x; i+=i&(-i); } } /*void rotate(vector<long long> t, long long x){ cout<<"rotate "; for(long long i:t){ cout<<i<<' '; final[i]=(final[i]+x)%M; } cout<<"by "<<x<<'\n'; }*/ void energy(int n, vector<int> v){ vector<pii> w(n); for(long long i=0;i<n;i++){ w[i]={v[i],i}; } sort(w.begin(),w.end()); set<pair<pii,long long>> a; for(long long i=0;i<n;i++){ a.insert({{w[i].f,i},w[i].s}); } //will work with w, w[i].s is the og index. // a.f.f is value, a.f.s is the sorted index and a.s is the og index. long long idx=0; vector<long long> marked(n,0); bit.resize(n+1,0); for(long long i=1;i<=n;i++){ bit[i]=i&(-i); } while(idx<n){ //cout<<a.size()<<'\n'; if(marked[idx]){ idx++; continue; } marked[idx]=1; update(n,idx,-1); if(w[idx].f<M/2){ auto it=a.upper_bound({{w[idx].f+M/2,1e9},1e9}); it--; // j st w[j]<=w[i]+M/2<w[j+1] auto element=*it; if(get(n,element.f.s)-get(n,idx)>=a.size()/2){ rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f); a.erase({{w[idx].f,idx},w[idx].s}); w[idx].f=(w[element.f.s].f+M/2)%M; //a.insert({{w[idx].f,idx},w[idx].s}); update(n,element.f.s,marked[element.f.s]-1); marked[element.f.s]=1; a.erase({{w[element.f.s].f,element.f.s},w[element.f.s].s}); }else{ rotate({w[idx].s},w[(element.f.s+1)%n].f+M/2-w[idx].f); a.erase({{w[idx].f,idx},w[idx].s}); w[idx].f=(w[(element.f.s+1)%n].f+M/2)%M; //a.insert({{w[idx].f,idx},w[idx].s}); update(n,(element.f.s+1)%n,marked[(element.f.s+1)%n]-1); marked[(element.f.s+1)%n]=1; a.erase({{w[(element.f.s+1)%n].f,(element.f.s+1)%n},w[(element.f.s+1)%n].s}); } }else{ auto it=a.lower_bound({{w[idx].f-M/2,0},0}); //it--; // j st w[j-1]<w[i]+M/2<=w[j] auto element=*it; if(get(n,idx)-get(n,element.f.s)>=a.size()/2){ rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f); a.erase({{w[idx].f,idx},w[idx].s}); w[idx].f=(w[element.f.s].f+M/2)%M; //a.insert({{w[idx].f,idx},w[idx].s}); update(n,element.f.s,marked[element.f.s]-1); marked[element.f.s]=1; a.erase({{w[element.f.s].f,element.f.s},w[element.f.s].s}); //cout<<idx<<" pairs with "<<element.f.s<<'\n'; }else{ long long lmao=(element.f.s-1)%n; if(lmao<0) lmao+=n; rotate({w[idx].s},w[lmao].f+M/2-w[idx].f); a.erase({{w[idx].f,idx},w[idx].s}); //cout<<lmao<<" lmao\n"; w[idx].f=(w[lmao].f+M/2)%M; //a.insert({{w[idx].f,idx},w[idx].s}); update(n,lmao,marked[lmao]-1); marked[lmao]=1; a.erase({{w[lmao].f,lmao},w[lmao].s}); //cout<<idx<<" pairs with "<<lmao<<'\n'; } } idx++; } }

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

rotate.cpp: In function 'void energy(int, std::vector<int>)':
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:80:48: note: in expansion of macro 's'
   80 |                                 rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:80:48: note: in expansion of macro 's'
   80 |                                 rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:90:48: note: in expansion of macro 's'
   90 |                                 rotate({w[idx].s},w[(element.f.s+1)%n].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:90:48: note: in expansion of macro 's'
   90 |                                 rotate({w[idx].s},w[(element.f.s+1)%n].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:104:48: note: in expansion of macro 's'
  104 |                                 rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:104:48: note: in expansion of macro 's'
  104 |                                 rotate({w[idx].s},w[element.f.s].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:116:48: note: in expansion of macro 's'
  116 |                                 rotate({w[idx].s},w[lmao].f+M/2-w[idx].f);
      |                                                ^
rotate.cpp:8:11: warning: narrowing conversion of 'w.std::vector<std::pair<long long int, long long int> >::operator[](((std::vector<std::pair<long long int, long long int> >::size_type)idx)).std::pair<long long int, long long int>::second' from 'long long int' to 'int' [-Wnarrowing]
    8 | #define s second
rotate.cpp:116:48: note: in expansion of macro 's'
  116 |                                 rotate({w[idx].s},w[lmao].f+M/2-w[idx].f);
      |                                                ^
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...