Submission #59499776


Source Code Expand

#include<bits/stdc++.h>
#include"atcoder/all"
using namespace std;
using namespace atcoder;
#define rep(i,n) for(int i=0;i<n;i++)
#define all(a) a.begin(),a.end()
typedef long long ll;
typedef vector<ll> vi;
constexpr ll mod = 998244353;
typedef modint998244353 mi;

ll x[100005],y[100005];
typedef pair<ll,ll> P;

P operator- (const P &lhs,const P &rhs) {
    return {rhs.first-lhs.first,rhs.second-lhs.second};
}

ll det(P x,P y){
    return x.first*y.second-x.second*y.first;   
}

vector<P> convex_hull(vector<P>&ps,int n){
    sort(ps.begin(),ps.end());
    int k=0;
    vector<P>qs(2*n);

	rep(i, n){
		while(k>1&&det(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<=0)k--;
		qs[k++]=ps[i];
	}
	for (int i=n-2,t=k;i>=0;i--){
		while(k>t&&det(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<=0)k--;
		qs[k++]=ps[i];
	}
	qs.resize(k - 1);
	return qs;
}

ll my_floor_sum(ll n,ll m,ll a,ll b){
    ll ans=0;
    ans+=n*(b/m);
    b%=m;

    ll ma=(a%m+m)%m;
    ll dv=(a-ma)/m;
    ans+=dv*(n-1)*n/2;
    ans+=floor_sum(n,m,ma,b);
    return ans;
}

int main(){
    int n;cin>>n;
    rep(i,n)cin>>x[i]>>y[i];

    vector<P>ps(n);
    rep(i,n)ps[i]={x[i],y[i]};

    vector<P>ch=convex_hull(ps,n);
    int ch_size=ch.size();
    ch.push_back(ch[0]);

    ll ans=0;
    rep(i,ch_size){
        if(ch[i]<ch[i+1]){
            ll m=ch[i+1].first-ch[i].first;
            if(m==0){
                continue;
            }
            else{
                ll a=ch[i+1].second-ch[i].second;
                ll b=m*ch[i].second-1;
                ans-=my_floor_sum(m,m,a,b);
            }
        }
        else{
            ll m=ch[i].first-ch[i+1].first;
            if(m==0){
                continue;
            }
            else{
                ll a=ch[i+1].second-ch[i].second;
                ll b=m*ch[i].second;
                ans+=my_floor_sum(m,m,a,b);
            }
        }
    }

    ll x_min=1e18,x_max=-1e18;
    ll y_min=-1,y_max=1e9;

    rep(i,n){
        x_min=min(x_min,x[i]);
        x_max=max(x_max,x[i]);
    }
    rep(i,n){
        if(x[i]==x_min)y_min=max(y_min,y[i]);
        if(x[i]==x_max)y_max=min(y_max,y[i]-1);
    }
    ans+=y_min-y_max;
    cout<<ans-n<<endl;
}

Submission Info

Submission Time
Task 041 - Piles in AtCoder Farm(★7)
User Rho17
Language C++ 20 (gcc 12.2)
Score 7
Code Size 2262 Byte
Status AC
Exec Time 65 ms
Memory 9688 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 2 / 2 2 / 2 3 / 3
Status
AC × 5
AC × 10
AC × 18
AC × 29
Set Name Test Cases
Sample 00_sample_0_123.txt, 00_sample_1_123.txt, 00_sample_2_123.txt, 00_sample_3__23.txt, 00_sample_4___3.txt
Subtask1 00_sample_0_123.txt, 00_sample_1_123.txt, 00_sample_2_123.txt, 01_corner_0_123.txt, 01_corner_1_123.txt, 01_corner_2_123.txt, 01_corner_3_123.txt, 02_random_0_123.txt, 02_random_1_123.txt, 02_random_2_123.txt
Subtask2 00_sample_0_123.txt, 00_sample_1_123.txt, 00_sample_2_123.txt, 00_sample_3__23.txt, 01_corner_0_123.txt, 01_corner_1_123.txt, 01_corner_2_123.txt, 01_corner_3_123.txt, 02_random_0_123.txt, 02_random_1_123.txt, 02_random_2_123.txt, 03_corner_0__23.txt, 03_corner_1__23.txt, 03_corner_2__23.txt, 03_corner_3__23.txt, 04_random_0__23.txt, 04_random_1__23.txt, 04_random_2__23.txt
Subtask3 00_sample_0_123.txt, 00_sample_1_123.txt, 00_sample_2_123.txt, 00_sample_3__23.txt, 00_sample_4___3.txt, 01_corner_0_123.txt, 01_corner_1_123.txt, 01_corner_2_123.txt, 01_corner_3_123.txt, 02_random_0_123.txt, 02_random_1_123.txt, 02_random_2_123.txt, 03_corner_0__23.txt, 03_corner_1__23.txt, 03_corner_2__23.txt, 03_corner_3__23.txt, 04_random_0__23.txt, 04_random_1__23.txt, 04_random_2__23.txt, 05_random_0___3.txt, 05_random_1___3.txt, 05_random_2___3.txt, 06_maxima_0___3.txt, 06_maxima_1___3.txt, 06_maxima_2___3.txt, 06_maxima_3___3.txt, 06_maxima_4___3.txt, 06_maxima_5___3.txt, 06_maxima_6___3.txt
Case Name Status Exec Time Memory
00_sample_0_123.txt AC 3 ms 3700 KiB
00_sample_1_123.txt AC 1 ms 3620 KiB
00_sample_2_123.txt AC 1 ms 3556 KiB
00_sample_3__23.txt AC 1 ms 3552 KiB
00_sample_4___3.txt AC 1 ms 3548 KiB
01_corner_0_123.txt AC 1 ms 3480 KiB
01_corner_1_123.txt AC 1 ms 3712 KiB
01_corner_2_123.txt AC 1 ms 3472 KiB
01_corner_3_123.txt AC 1 ms 3560 KiB
02_random_0_123.txt AC 1 ms 3516 KiB
02_random_1_123.txt AC 1 ms 3508 KiB
02_random_2_123.txt AC 1 ms 3656 KiB
03_corner_0__23.txt AC 33 ms 9688 KiB
03_corner_1__23.txt AC 29 ms 9444 KiB
03_corner_2__23.txt AC 3 ms 3908 KiB
03_corner_3__23.txt AC 32 ms 8892 KiB
04_random_0__23.txt AC 26 ms 7732 KiB
04_random_1__23.txt AC 28 ms 8364 KiB
04_random_2__23.txt AC 6 ms 3980 KiB
05_random_0___3.txt AC 14 ms 4432 KiB
05_random_1___3.txt AC 58 ms 9172 KiB
05_random_2___3.txt AC 21 ms 5288 KiB
06_maxima_0___3.txt AC 60 ms 9524 KiB
06_maxima_1___3.txt AC 60 ms 9432 KiB
06_maxima_2___3.txt AC 60 ms 9644 KiB
06_maxima_3___3.txt AC 60 ms 9584 KiB
06_maxima_4___3.txt AC 63 ms 9460 KiB
06_maxima_5___3.txt AC 65 ms 9432 KiB
06_maxima_6___3.txt AC 1 ms 3568 KiB