제출 #1277746

#제출 시각아이디문제언어결과실행 시간메모리
1277746PieArmyCoin Collecting (JOI19_ho_t4)C++20
0 / 100
1 ms572 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second #define endl '\n' using namespace std; #define int ll int n; int arr[100023][2]; ll ans=0; const bool boceksizlestir=false; void f(int left,int right){ if(left==right){ if(arr[left][0]+arr[left][1]<2)return; if(!arr[left][0]){ ans++; arr[left][0]++; arr[left][1]--; } if(!arr[left][1]){ ans++; arr[left][1]++; arr[left][0]--; } if(boceksizlestir){ cout<<left<<":"<<right<<endl; for(int j=0;j<2;j++){ for(int i=1;i<=n;i++){ cout<<arr[i][j]<<" "; } cout<<endl; } cout<<endl; } return; } int mid=(left+right)/2; int a=0,b=0,ust=0,alt=0,need=0; function<void(int,int,int,int)>ekle=[&](int from,int tar,int k,int x)->void{ if(x==0)return; ans+=abs(from-tar)*x; if(from<=mid)a-=x; else b-=x; if(tar<=mid)a+=x; else b+=x; if(k)alt+=x; else ust+=x; arr[from][k]-=x; arr[tar][k]+=x; need-=x; }; for(int i=left;i<=right;i++){ if(i<=mid)a+=arr[i][0]+arr[i][1]; else b+=arr[i][0]+arr[i][1]; } f(left,mid); f(mid+1,right); if(a>=2*(mid-left+1)&&b>=2*(right-mid)){ return; } else if(a>=2*(mid-left+1)){ need=2*(right-mid)-b; for(int i=mid+1;i<=right;i++){ ust+=arr[i][0]; alt+=arr[i][1]; } for(int i=mid;i>=left;i--){ if(arr[i][0]-1+arr[i][1]-1>need){ if(alt>ust){ int x=min(min(arr[i][0]-1,alt-ust),need); ekle(i,mid+1,0,x); } else{ int x=min(min(arr[i][1]-1,ust-alt),need); ekle(i,mid+1,1,x); } int x=min(min(arr[i][0]-1,arr[i][1]-1),need/2); ekle(i,mid+1,0,x); ekle(i,mid+1,1,x); if(need){ if(arr[i][0]-1){ ekle(i,mid+1,0,need); } else ekle(i,mid+1,1,need); } } else{ int x=arr[i][0]-1; ekle(i,mid+1,0,x); x=arr[i][1]-1; ekle(i,mid+1,1,x); } } for(int i=mid+1;i<=right;i++){ if(arr[i][0]>1&&arr[i][1]==0){ ans++; arr[i][0]--; arr[i][1]++; } else if(arr[i][1]>1&&arr[i][0]==0){ ans++; arr[i][1]--; arr[i][0]++; } int x=max(0ll,arr[i][0]-1); arr[i][0]-=x; arr[i+1][0]+=x; x=max(0ll,arr[i][1]-1); arr[i][1]-=x; arr[i+1][1]+=x; } } else if(b>=2*(right-mid)){ need=2*(mid-left+1)-a; for(int i=left;i<=mid;i++){ ust+=arr[i][0]; alt+=arr[i][1]; } for(int i=mid+1;i<=right;i++){ if(arr[i][0]-1+arr[i][1]-1>need){ if(alt>ust){ int x=min(min(arr[i][0]-1,alt-ust),need); ekle(i,mid,0,x); } else{ int x=min(min(arr[i][1]-1,ust-alt),need); ekle(i,mid,1,x); } int x=min(min(arr[i][0]-1,arr[i][1]-1),need/2); ekle(i,mid,0,x); ekle(i,mid,1,x); if(need){ if(arr[i][0]-1){ ekle(i,mid,0,need); } else ekle(i,mid,1,need); } } else{ int x=arr[i][0]-1; ekle(i,mid,0,x); x=arr[i][1]-1; ekle(i,mid,1,x); } } for(int i=mid;i>=left;i--){ if(arr[i][0]>1&&arr[i][1]==0){ ans++; arr[i][0]--; arr[i][1]++; } else if(arr[i][1]>1&&arr[i][0]==0){ ans++; arr[i][1]--; arr[i][0]++; } int x=max(0ll,arr[i][0]-1); ans+=x; arr[i][0]-=x; arr[i-1][0]+=x; x=max(0ll,arr[i][1]-1); ans+=x; arr[i][1]-=x; arr[i-1][1]+=x; } } if(boceksizlestir){ cout<<left<<":"<<right<<endl; for(int j=0;j<2;j++){ for(int i=1;i<=n;i++){ cout<<arr[i][j]<<" "; } cout<<endl; } cout<<endl; } } int32_t main(){ ios_base::sync_with_stdio(23^23);cin.tie(NULL); cin>>n; for(int i=1;i<=2*n;i++){ pair<int,int>p;cin>>p.fr>>p.sc; if(p.fr<1){ ans+=1-p.fr; p.fr=1; } if(p.fr>n){ ans+=p.fr-n; p.fr=n; } if(p.sc<1){ ans+=1-p.sc; p.sc=1; } if(p.sc>2){ ans+=p.sc-2; p.sc=2; } arr[p.fr][p.sc-1]++; } f(1,n); cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...