This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> P;
priority_queue<P> pq;
int arr[500001];
int n;
int tree[500005];
const long long INF=1e13;
int sum(int i) {
int ret=0;
while (i>0) {
ret+=tree[i];
i-=(i&-i);
}
return ret;
}
void upd(int i,int val) {
while (i<=n) {
tree[i]+=val;
i+=(i&-i);
}
}
P solve(vector<int> vec0,vector<int> vec1,int sz) {
bool stone=true;
bool enone=(sz%2==0);
long long value0=INF;
long long value1=INF;
long long val=0;
int k=vec0.size();
//printf("%d %d %d\n",now,vec0.size(),vec1.size());
if (vec1.size()>vec0.size()+2) {
return P(INF,INF);
}
else if (vec1.size()==vec0.size()+2) {
if (!enone) {
return P(INF,INF);
}
for(int i=0;i<k;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
val+=sum(vec1[k]-1);
upd(vec1[k],-1);
val+=sum(n)-sum(vec1[k+1]);
upd(vec1[k+1],-1);
value1=min(value1,val);
for(int i=k-1;i>=0;i--) {
if (vec0[i]<vec1[i+1]) {
val++;
}
else {
val--;
}
val-=2*sum(vec0[i])-sum(n);
val-=2*sum(vec1[i+1])-sum(n);
value1=min(value1,val);
}
}
else if (vec1.size()==vec0.size()+1) {
if (enone) {
for(int i=0;i<k;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
val+=sum(vec1[k]-1);
upd(vec1[k],-1);
value1=min(value1,val);
for(int i=k-1;i>=0;i--) {
val-=2*sum(vec1[i+1])-sum(n);
value0=min(value0,val);
val-=2*sum(vec0[i])-sum(n);
value1=min(value1,val);
}
val-=2*sum(vec1[0])-sum(n);
value0=min(value0,val);
}
else {
for(int i=0;i<k;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
val+=sum(vec1[k]-1);
upd(vec1[k],-1);
value1=min(value1,val);
for(int i=k-1;i>=0;i--) {
if (vec0[i]<vec1[i+1]) {
val++;
}
else {
val--;
}
val-=2*sum(vec0[i])-sum(n);
val-=2*sum(vec1[i+1])-sum(n);
value1=min(value1,val);
}
}
}
else if (vec1.size()==vec0.size()) {
if (enone) {
for(int i=0;i<k;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
value0=min(value0,val);
for(int i=k-1;i>=0;i--) {
if (vec0[i]>vec1[i]) {
val++;
}
else {
val--;
}
val-=2*sum(vec0[i])-sum(n);
val-=2*sum(vec1[i])-sum(n);
value0=min(value0,val);
}
}
else {
for(int i=0;i<k;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
value0=min(value0,val);
for(int i=k-1;i>=0;i--) {
val-=2*sum(vec0[i])-sum(n);
value1=min(value1,val);
val-=2*sum(vec1[i])-sum(n);
value0=min(value0,val);
}
}
}
else if (vec1.size()+1==vec0.size()) {
if (enone) {
return P(INF,INF);
}
for(int i=0;i<k-1;i++) {
val+=sum(vec1[i]-1);
upd(vec1[i],-1);
val+=sum(vec0[i]-1);
upd(vec0[i],-1);
}
val+=sum(n)-sum(vec0[k-1]);
upd(vec0[k-1],-1);
value0=min(value0,val);
for(int i=k-2;i>=0;i--) {
if (vec0[i]>vec1[i]) {
val++;
}
else {
val--;
}
val-=2*sum(vec0[i])-sum(n);
val-=2*sum(vec1[i])-sum(n);
value0=min(value0,val);
}
}
else {
return P(INF,INF);
}
return P(value0,value1);
}
int main(void) {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&arr[i]);
upd(i,1);
pq.push(P(abs(arr[i]),i));
}
int sz=n;
long long ret0=0;
long long ret1=INF;
while (!pq.empty()) {
int now=pq.top().first;
if (now==0) {
break;
}
vector<int> vec;
while (!pq.empty()&&pq.top().first==now) {
vec.push_back(pq.top().second);
pq.pop();
}
long long value=INF;
sort(vec.begin(),vec.end());
vector<int> vec0; //1에서 양수
vector<int> vec1; //1에서 음수
for(int i=0;i<vec.size();i++) {
if ((vec[i]%2==1)^(arr[vec[i]]<0)) {
vec0.push_back(vec[i]);
//printf(".0 %d\n",vec[i]);
}
else {
vec1.push_back(vec[i]);
//printf(".1 %d\n",vec[i]);
}
}
P even=solve(vec0,vec1,sz);
for(int i=0;i<vec.size();i++) {
if (sum(vec[i])-sum(vec[i]-1)==0) {
upd(vec[i],1);
}
}
P odd=solve(vec1,vec0,sz);
for(int i=0;i<vec.size();i++) {
if (sum(vec[i])-sum(vec[i]-1)==1) {
upd(vec[i],-1);
}
}
//printf("%lld %lld %lld %lld\n",even.first,even.second,odd.first,odd.second);
long long save0=ret0;
long long save1=ret1;
ret0=min(save1+odd.second,save0+even.first);
ret1=min(save1+odd.first,save0+even.second);
//printf("..%lld %lld\n",ret0,ret1);
if (ret0>=INF&&ret1>=INF) {
printf("-1");
return 0;
}
sz-=vec.size();
}
if (ret0>=INF&&ret1>=INF) {
printf("-1");
return 0;
}
printf("%lld",min(ret0,ret1));
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'P solve(std::vector<int>, std::vector<int>, int)':
Main.cpp:27:14: warning: unused variable 'stone' [-Wunused-variable]
27 | bool stone=true;
| ^~~~~
Main.cpp: In function 'int main()':
Main.cpp:199:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
199 | for(int i=0;i<vec.size();i++) {
| ~^~~~~~~~~~~
Main.cpp:210:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
210 | for(int i=0;i<vec.size();i++) {
| ~^~~~~~~~~~~
Main.cpp:216:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
216 | for(int i=0;i<vec.size();i++) {
| ~^~~~~~~~~~~
Main.cpp:195:19: warning: unused variable 'value' [-Wunused-variable]
195 | long long value=INF;
| ^~~~~
Main.cpp:176:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
176 | scanf("%d",&n);
| ~~~~~^~~~~~~~~
Main.cpp:178:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
178 | scanf("%d",&arr[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... |
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |