codeforces 1269 E K Integers

E. K Integers

Topic connection: https://codeforces.com/contest/1269/problem/E

The meaning of problems

Gave a permutation p, the operation may be exchanged every time you two adjacent elements, now ask you a minimum operation many times and form a shaped sub-segments such as 1,2,3,4..k

k is from 1 ~ n

answer:

In the final exam, solving this problem is too slow, I'm out of runoff

First, according to the meaning of the questions we can get, to get a sorted sub-segment

For When k = 1, the answer must be 0

Respect to the k = n, p must be arranged in arrayed 1,2,3 ,. . . The minimum number of operations n

Then when k between 1 ~ n, the minimum number of operations should be how much

For each sorted sub-segment, we take the midpoint of this sub-section as a reference point, the rest of the sub-section point must be possible to rely on this reference point, so that it can minimize the number of operations

So every time we need to find only half the midpoint position of the element i i sub-segment / 2

So for this position, the moving distance of the sub-segments of all the elements can be expressed by the following equation
\ [sum = \ sum | t_i -p_i | \\ = \ sum_ {ti> pi} ti- \ sum_ {ti> pi} pi + \ sum_ {ti <pi} pi-
\ sum_ {ti <pi} ti \] for this equation we can form a tree array / segment tree to maintain

For each element of movement, we can use his number in reverse order to maintain, that before this element is greater than its elements required after moving to the inverse number of elements from this element is

For students Qing sister recommended this formula does not understand the explanations video

https://www.bilibili.com/video/av80409992?p=4

Code

/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ Code is far away from bug with the animal protecting          
 *          ┃   ┃   神兽保佑,代码无bug
 *          ┃   ┃           
 *          ┃   ┃        
 *          ┃   ┃
 *          ┃   ┃           
 *          ┃   ┗━━━┓
 *          ┃       ┣┓
 *          ┃       ┏┛
 *          ┗┓┓┏━┳┓┏┛
 *           ┃┫┫ ┃┫┫
 *           ┗┻┛ ┗┻┛
 */
// warm heart, wagging tail,and a smile just for you!
//
//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\  =  /O
//                        ____/`---'\____
//                      .'  \|     |//  `.
//                     /  \|||  :  |||//  \
//                    /  _||||| -:- |||||-  \
//                    |   | \  -  /// |   |
//                    | \_|  ''\---/''  |   |
//                    \  .-\__  `-`  ___/-. /
//                  ___`. .'  /--.--\  `. . __
//               ."" '<  `.___\_<|>_/___.'  >'"".
//              | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//              \  \ `-.   \_ __\ /__ _/   .-` /  /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                     佛祖保佑      永无BUG
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double Pi = acos(-1);
LL gcd(LL a, LL b) {
    return b ? gcd(b, a % b) : a;
}
LL lcm(LL a, LL b) {
    return a / gcd(a, b) * b;
}
double dpow(double a, LL b) {
    double ans = 1.0;
    while(b) {
        if(b % 2)ans = ans * a;
        a = a * a;
        b /= 2;
    } return ans;
}
LL quick_pow(LL x, LL y) {
    LL ans = 1;
    while(y) {
        if(y & 1) {
            ans = ans * x % mod;
        } x = x * x % mod;
        y >>= 1;
    } return ans;
}
int n;
int a[maxn], c[maxn];
int lowbit(int x) {
    return x & (-x);
}
LL bit1[maxn], bit2[maxn];
void add(LL *bit, int pos, int val) {
    while(pos < maxn) {
        bit[pos] += val;
        pos += lowbit(pos);
    }
}
LL query(LL *bit, int pos) {
    LL ans = 0;
    while(pos) {
        ans += bit[pos];
        pos -= lowbit(pos);
    }
    return ans;
}
int bs(LL *bit, int val) {
    int i = 0;
    for(int j = 19; j >= 0; j--) {
        if((i | 1 << j) < maxn) {
            if(bit[i | 1 << j] <= val) {
                val -= bit[i |= 1 << j];
            }
        }
    }
    return i;
}
int main() {
#ifndef ONLINE_JUDGE
    FIN
#endif
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        c[a[i]] = i;
    }
    LL cnt = 0;
    for(int i = 1; i <= n; i++) {
        int p = c[i];
        add(bit1, p, 1);
        cnt += i - query(bit1, p);
        add(bit2, p, p);
        int pos = bs(bit1, i / 2) + 1;
        debug2(i, pos);
        LL sum = 0;
        LL aa = i / 2; //t之前
        LL bb = i - i / 2 - 1; //t之后
        sum += (LL)aa * pos - (LL)aa * (aa + 1) / 2 - query(bit2, pos - 1); //p
        sum += (query(bit2, maxn) - query(bit2, pos)) - (LL)bb * pos - (LL)bb * (bb + 1) / 2;//p
        printf("%lld\n", sum + cnt);
    }
    return 0;

}

Guess you like

Origin www.cnblogs.com/buerdepepeqi/p/12089404.html
Recommended