Divide by Zero 2021 and Codeforces Round #714 (Div. 2) Editorial
Difference between en12 and en13, changed 0 character(s)
We hope that you have enjoyed this round! Here is the sketch of solutions for the problems.  ↵
### [A. Array and Peaks](https://codeforces.net/contest/1513/problem/A)↵

- Problem Setter: [user:ajit,2021-04-11]↵
- Editorialist: [user:ajit,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513A]↵
</spoiler>↵

<spoiler summary="Implementation in C++">↵


~~~~~↵
#include<bits/stdc++.h>↵
using namespace std;↵
int main()↵
{↵
     int tests;↵
     cin>>tests;↵
     while(tests--)↵
     {↵
         int n,k;↵
         cin>>n>>k;↵
         vector<int> ans(n+1);↵
         int num=n;↵
         for(int i=2;i<n;i+=2)↵
         {↵
              if(k==0)break;↵
              ans[i]=num--;↵
              k--;↵
         }↵
         if(k)↵
         {↵
             cout<<-1<<endl;↵
             continue;↵
         }↵
         int cur=1;↵
         for(int i=1;i<=n;i++)↵
         {↵
             if(!ans[i])↵
             ans[i]=cur++;↵
         }↵

         for(int i=1;i<=n;i++)↵
         cout<<ans[i]<<" ";↵
         cout<<endl;↵
     }↵
}↵
~~~~~↵



</spoiler>↵


### [B. AND Sequences](https://codeforces.net/contest/1513/problem/B)↵

- Problem Setter: [user:ajit,2021-04-11]↵
- Editorialist: [user:ajit,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513B]↵
</spoiler>↵

<spoiler summary="Implementation in C++">↵

~~~~~↵

#include<bits/stdc++.h>↵
using namespace std;↵

void solveTestCase()↵
{↵
    int MOD=1e9+7;↵
    int n;↵
    cin>>n;↵
    vector<int> a(n);↵
    for(int i=0;i<n;i++)cin>>a[i];↵
    ↵
    int min1=*min_element(a.begin(),a.end());↵
    int cnt=0;↵
    ↵
    for(int x:a)↵
    {↵
        if(min1==x)cnt++;↵
        if((min1&x)!=min1)↵
        {↵
            printf("0\n");↵
            return;↵
        }↵
    }↵
    ↵
    int fact=1;↵
    for(int i=1;i<=n-2;i++)fact=(1LL*fact*i)%MOD;↵
    int ans=(1LL * cnt * (cnt-1))%MOD;↵
    ans = (1LL * ans * fact) % MOD;↵
    printf("%d\n",ans);↵
}↵

int main()↵
{↵
    int tests;↵
    cin>>tests;↵
    while(tests--)↵
    solveTestCase();↵
    return 0;↵
}↵

~~~~~↵


</spoiler>↵



### [C. Add One](https://codeforces.net/contest/1513/problem/C)↵

- Problem Setter: [user:kalpitk,2021-04-11]↵
- Editorialist: [user:dvshah,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513C]↵
</spoiler>↵

<spoiler summary="Implementation in C++">↵

~~~~~↵

#include <bits/stdc++.h>↵
using namespace std;↵

#define int long long↵

const int max_n = 200005, mod = 1000000007;↵
int dp[max_n];↵

signed main(){↵

    for(int i=0; i<9; i++)dp[i] = 2;↵
    dp[9] = 3;↵
    for(int i=10; i<max_n; i++){↵
        dp[i] = (dp[i-9] + dp[i-10])%mod;↵
    }↵

    ios_base::sync_with_stdio(false);↵
    cin.tie(NULL);↵

    int t;↵
    cin>>t;↵
    while(t--){↵
        int n, m;↵
        cin>>n>>m;↵
        int ans = 0;↵
        while(n > 0){↵
            int x = n%10;↵
            ans += ((m + x < 10) ? 1 : dp[m + x - 10]);↵
            ans %= mod;↵
            n/=10;↵
        }↵
        cout<<ans<<"\n";↵
    }↵
    return 0;↵
}↵

~~~~~↵


</spoiler>↵



### [D. GCD and MST](https://codeforces.net/contest/1513/problem/D)↵

- Problem Setter: [user:ajit,2021-04-11]↵
- Editorialist: [user:ajit,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513D]↵
</spoiler>↵

<spoiler summary="Implementation in C++">↵

~~~~~↵
#include<bits/stdc++.h>↵
using namespace std;↵

void solveTestCase()↵
{↵
     int n,x;↵
     cin>>n>>x;↵
     vector<int> a(n);↵
     for(int i=0;i<n;i++)cin>>a[i];↵
     ↵
     //tells whether vertices i and i+1 are connected for 0<=i<n-1↵
     vector<bool> isConnected(n);↵
     vector<pair<int,int>> vals;↵
     ↵
     for(int i=0;i<n;i++)↵
     vals.push_back(make_pair(a[i],i));↵

     sort(vals.begin(),vals.end());↵
     long long int ans=0;↵
     for(auto p:vals)↵
     {↵
         int cur_val=p.first;↵
         int i=p.second;↵

         if(cur_val>=x)break;↵
         ↵
         while(i>0)↵
         {↵
              if(isConnected[i-1])break;↵
              if(a[i-1]%cur_val==0)↵
              {↵
                   isConnected[i-1]=true;↵
                   ans+=cur_val;↵
                   i--;↵
              }↵
              else↵
              break;↵
         }↵
         ↵
         i=p.second;↵
         while(i<n-1)↵
         {↵
             if(isConnected[i])break;↵
             if(a[i+1]%cur_val==0)↵
             {↵
                 isConnected[i]=true;↵
                 ans+=cur_val;↵
                 i++;↵
             }↵
             else↵
             break;↵
         }↵
         ↵
     }↵

     for(int i=0;i<n-1;i++)↵
     {↵
         if(!isConnected[i])↵
         ans+=x;↵
     }↵

     cout<<ans<<endl;↵
}↵

int main()↵
{↵
    int T;↵
    cin>>T;↵
    while(T--)↵
    {↵
         solveTestCase();↵
    }  ↵
    return 0;↵
}↵
~~~~~↵


</spoiler>↵



### [E. Cost Equilibrium](https://codeforces.net/contest/1513/problem/E)↵

- Problem Setter: [user:7dan,2021-04-11]↵
- Editorialist: [user:kalpitk,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513E]↵
</spoiler>↵

<spoiler summary="Implementation in C++">↵

~~~~~↵
#include "bits/stdc++.h"↵
#define ll long long↵
#define MOD 1000000007↵
ll power(ll x,ll y, ll md=MOD){ll res = 1;x%=md;while(y){if(y&1)res = (res*x)%md;x *= x; if(x>=md) x %= md; y >>= 1;}return res;}↵
 ↵
using namespace std;↵

#define int long long↵

#define MAX 100005↵

vector<int> f(MAX);↵
vector<int> inv(MAX);↵

void init() {↵
f[0] = 1;↵
for(int i=1;i<MAX;i++) f[i] = (f[i-1]*i)%MOD;↵
inv[MAX-1] = power(f[MAX-1], MOD-2, MOD);↵
for(int i=MAX-2;i>=0;i--) inv[i] = (inv[i+1]*(i+1)) % MOD;↵

for(int i=0;i<MAX;i++) assert(inv[i]==power(f[i],MOD-2,MOD));↵
}↵

int ncr(int n, int r) {↵
if(r > n || r < 0) return 0;↵

int ans = f[n];↵
ans *= (inv[r] * inv[n - r]) % MOD;↵
ans %= MOD;↵

return ans;↵
}↵

int solve(const vector<int> &v) {↵

int n = v.size();↵
int s = 0;↵
for(auto x: v) s += x;↵

if(!(s % n == 0)) return 0;↵

int src = 0;↵
int snk = 0;↵

map<int,int> freqSrc, freqSnk;↵
for(auto x: v) {↵
if(s / n < x) {↵
freqSrc[x]++;↵
src ++;↵
}↵
if(s / n > x) {↵
freqSnk[x]++;↵
snk ++;↵
}↵
}↵

if(src == 0 && snk == 0) return 1;↵

    if(src == 1 || snk == 1) {↵
int ans = f[n];↵
for(auto x: freqSnk) {↵
ans = (ans * inv[x.second]) % MOD;↵
}↵
for(auto x: freqSrc) {↵
ans = (ans * inv[x.second]) % MOD;↵
}↵
ans *= inv[n - src - snk];↵
ans %= MOD;↵
return ans;↵
}↵

int ans = (2 * f[src] * f[snk]) % MOD;↵

// Divide by freq of repeating elements↵
for(auto x: freqSnk) {↵
ans = (ans * inv[x.second]) % MOD;↵
}↵
for(auto x: freqSrc) {↵
ans = (ans * inv[x.second]) % MOD;↵
}↵

int tot = src + snk;↵
int left = n - tot;↵

// Number of Solution: x_0 + x_1 + x_2 + ... + x_tot = left↵
ans = (ans * ncr(left + tot, tot)) % MOD;↵
return ans;↵
}↵

signed main() {↵
    ↵
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);↵

init();↵

int n;↵
cin>>n;↵

vector<int> v(n);↵
for(auto &x: v) cin>>x;↵

cout<<solve(v);↵

}↵
~~~~~↵


</spoiler>↵

### [F. Swapping Problem](https://codeforces.net/contest/1513/problem/F)↵

- Problem Setter: [user:7dan,2021-04-11]↵
- Editorialist: [user:mtnshh,2021-04-11]↵

<spoiler summary="Tutorial">↵
[tutorial: 1513F]↵
</spoiler>↵

<spoiler summary="Implementation1 in C++">↵

~~~~~↵
#include "bits/stdc++.h"↵
#define ll long long↵
#define MOD 1000000007↵
#define inf 1000000000000000000LL↵
 ↵
using namespace std;↵

#define int long long↵


signed main() {↵
    ↵
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);↵

int n;↵
cin>>n;↵

vector<int> a(n), b(n);↵
for(auto &x: a) cin>>x;↵
for(auto &x: b) cin>>x;↵

map<int,int> segX, segY;↵

for(int i=0;i<n;i++) {↵
if(a[i]<=b[i]) {↵
if(!segX.count(a[i])) segX[a[i]] = b[i];↵
else segX[a[i]] = max(segX[a[i]], b[i]);↵
}↵
else {↵
if(!segY.count(b[i])) segY[b[i]] = a[i];↵
else segY[b[i]] = max(segY[b[i]], a[i]);↵
}↵
}↵

// Construct prefix maxima↵
int mx = -inf;↵
for(auto &x: segX) {↵
mx = max(mx, x.second);↵
x.second = mx;↵
}↵

mx = -inf;↵
for(auto &x: segY) {↵
mx = max(mx, x.second);↵
x.second = mx;↵
}↵


// Find best swap↵
int mxGain = 0;↵
for(int i=0;i<n;i++) {↵
if(a[i]<=b[i]) {↵
auto it = segY.upper_bound(a[i]);↵
if(it==segY.begin()) continue;↵

it--;↵
int overlap = min(it->second, b[i]) - a[i];↵
mxGain = max(mxGain, 2*overlap);↵
}↵
else {↵
auto it = segX.upper_bound(b[i]);↵
if(it==segX.begin()) continue;↵

it--;↵
int overlap = min(it->second, a[i]) - b[i];↵
mxGain = max(mxGain, 2*overlap);↵
}↵
}↵

// Find ans = initial val - mxGain↵
int ans = 0;↵
for(int i=0;i<n;i++) {↵
ans += abs(a[i]-b[i]);↵
}↵

ans -= mxGain;↵
cout<<ans;↵

}↵
~~~~~↵


</spoiler>↵

<spoiler summary="Implementation2 in C++">↵
~~~~~↵
// created by mtnshh↵
 ↵
#include<bits/stdc++.h>↵
#include<algorithm>↵
using namespace std;↵

#define ll long long↵
#define ld long double↵
 ↵
#define rep(i,a,b) for(ll i=a;i<b;i++)↵
#define repb(i,a,b) for(ll i=a;i>=b;i--)↵
 ↵
#define pb push_back↵
#define all(A)  A.begin(),A.end()↵
#define allr(A)    A.rbegin(),A.rend()↵
#define ft first↵
#define sd second↵
 ↵
#define pll pair<ll,ll>↵
#define V vector<ll>↵
#define S set<ll>↵
#define VV vector<V>↵
#define Vpll vector<pll>↵
 ↵
#define endl "\n"↵
 ↵
const ll logN = 20;↵
const ll M = 1000000007;↵
const ll INF = 1e18;↵
#define PI 3.14159265↵
 ↵
const ll N = 100005;↵

int main(){↵
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);↵
    ll n;↵
    cin >> n;↵
    ↵
    ll A[n], B[n];↵
    ↵
    rep(i,0,n)  cin >> A[i];↵
    rep(i,0,n)  cin >> B[i];↵

    Vpll x1, x2, y1, y2;↵

    ll ans = 0;↵

    rep(i,0,n){↵

        ans += abs(A[i]-B[i]);↵

        if(A[i]<B[i]){↵
            x1.pb({A[i], B[i]});↵
            x2.pb({B[i], A[i]});↵
        }↵
        else{↵
            y1.pb({A[i], B[i]});↵
            y2.pb({B[i], A[i]});↵
        }↵
    }↵

    ll fin = ans;↵

    // ↵

    set<ll> s1;↵

    sort(all(x1));↵
    sort(all(y2));↵

    ll cur1 = 0;↵

    for(auto i: x1){↵

        while(cur1 < y2.size() and y2[cur1].ft <= i.ft){↵
            s1.insert(y2[cur1].sd);↵
            cur1++;↵
        }↵

        if(s1.size() > 0){↵
            ll last = *s1.rbegin();↵
            fin = min(fin, ans - 2 * (min(i.sd, last) - i.ft));↵
        }↵

    }↵

    set<ll> s2;↵

    sort(all(x1));↵
    sort(all(y2));↵

    ll cur2 = 0;↵

    for(auto i: y2){↵

        while(cur2 < x1.size() and x1[cur2].ft <= i.ft){↵
            s2.insert(x1[cur2].sd);↵
            cur2++;↵
        }↵

        if(s2.size() > 0){↵
            ll last = *s2.rbegin();↵
            fin = min(fin, ans - 2 * (min(last, i.sd) - i.ft));↵
        }↵
        ↵
    }↵

    cout << fin << endl;↵

    return 0;↵
}↵
~~~~~↵
</spoiler>↵

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en13 English ajit 2021-04-11 23:05:53 0 (published)
en12 English ajit 2021-04-11 23:03:50 83
en11 English ajit 2021-04-11 23:02:43 42
en10 English mtnshh 2021-04-11 22:58:50 1
en9 English mtnshh 2021-04-11 22:32:08 3 Tiny change: 'spoiler>\n\n`\n' -> 'spoiler>\n'
en8 English mtnshh 2021-04-11 22:30:40 2133 Tiny change: '1-04-11]\nEditoria' -> '1-04-11]\n\nEditoria'
en7 English mtnshh 2021-04-11 22:18:13 2 Tiny change: '1-04-11]\n\n **Edito' -> '1-04-11]\n **Edito'
en6 English ajit 2021-04-11 21:48:42 6300
en5 English ajit 2021-04-11 21:09:48 2132 Tiny change: '04-11]\n\n<spoil' -> '04-11]\n\n\n<spoil'
en4 English ajit 2021-04-11 20:02:55 579 Tiny change: 'user:ajit]\n\n \textbf' -> 'user:ajit] $ \\ $\n \textbf'
en3 English ajit 2021-04-11 19:46:33 40 Tiny change: 'Hope you g' -> '#### HI Hope you g'
en2 English ajit 2021-04-11 19:43:12 530 Tiny change: 'lem/A)\n\n~~~~~\nYour code here...\n~~~~~\n\n' -> 'lem/A)\n\n`asa`\n'
en1 English ajit 2021-04-11 09:23:01 93 Initial revision (saved to drafts)