• [bzoj2141][排队] (分块大法好)


    Description

    排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足ihj的(i,j)数量。幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度。为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度。

    Input

    第一行为一个正整数n,表示小朋友的数量;第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高;第三行为一个正整数m,表示交换操作的次数;以下m行每行包含两个正整数ai和bi¬,表示交换位置ai与位置bi的小朋友。

    Output

    输出文件共m行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度。

    Sample Input

    【样例输入】
    3
    130 150 140
    2
    2 3
    1 3

    Sample Output

    1
    0
    3

    【样例说明】
    未进行任何操作时,(2,3)满足条件;
    操作1结束后,序列为130 140 150,不存在满足ihj的(i,j)对;
    操作2结束后,序列为150 140 130,(1,2),(1,3),(2,3)共3对满足条件的(i,j)。
    【数据规模和约定】
    对于100%的数据,1≤m≤2*103,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。

    Solution

    分块啊,用块套树状数组,分块处理逆序对

    考虑交换,不完整块就暴力枚举更新完整的就用树状数组直接更新

    //Kaiba_Seto 20170116
    //otz cjkmao
    #include <math.h>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #define MaxN 20010
    #define MaxBuf 1<<22
    #define RG register
    #define inline __inline__ __attribute__((always_inline))
    #define Blue() (((S == T)&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S == T)) ? 0 : *S++)
    
    char B[MaxBuf],*S=B,*T=B;
    
    inline void Rin(RG int &x) {
        x=0;RG int c=Blue(),f=1;
        for(; c<48||c>57; c=Blue())
            if(c==45)f=-1;
        for(; c>47&&c<58; c=Blue())
            x=(x<<1)+(x<<3)+c-48;
        x*=f; }
    
    struct Pr{
        int fir,sec;
        bool operator < (const Pr &other) const {
            return fir < other.fir; } }b[MaxN];
    
    int n,m,a[MaxN],block_size,c1[MaxN],c2[200][MaxN],ans;
    
    inline void exc(RG int &x,RG int &y) {
        x^=y;
        y^=x;
        x^=y; }
    
    inline void modify(RG int *C,RG int x,RG int d) {
        for(; x<=n; x+=x&(-x))
            C[x]+=d; }
    
    inline int sum(RG int *C,RG int x) {
        RG int res=0;
        for(; x; x-=x&(-x))
            res+=C[x];
        return res; }
    
    int main() {
        Rin(n);
        block_size=static_cast<int>(sqrt(n)+1e-6);
        for(RG int i=1; i<=n; i++)
            Rin(b[i].fir),b[i].sec=i;
        std::sort(b+1,b+1+n);
        for(RG int i=1; i<=n; i++) {
            static int top=0;
            if(b[i].fir != b[i-1].fir)
                ++top;
            a[b[i].sec]=top; }
        for(RG int i=n; i; i--)
            ans+=sum(c1,a[i]-1),modify(c1,a[i],1);
        for(RG int i=1; i<=n; i++)
            modify(c2[(i-1)/block_size],a[i],1);
        printf("%d
    ",ans);
        Rin(m);
        while(m--) {
            RG int x,y,l,r,i;
            Rin(x),Rin(y);
            if(x > y)exc(x,y);
            l=(x-1)/block_size+1;
            r=(y-1)/block_size-1;
            if(l <= r) {
                for(i=l; i<=r; i++)
                    ans=ans-sum(c2[i],a[x]-1)+sum(c2[i],n)-sum(c2[i],a[x])+sum(c2[i],a[y]-1)-sum(c2[i],n)+sum(c2[i],a[y]);
                for(i=x+1; i<=l*block_size; i++) {
                    if(a[i] < a[x])ans--;
                    if(a[i] > a[x])ans++;
                    if(a[i] > a[y])ans--;
                    if(a[i] < a[y])ans++; }
                for(i=(r+1)*block_size+1; i<y; i++) {
                    if(a[i] < a[x])ans--;
                    if(a[i] > a[x])ans++;
                    if(a[i] > a[y])ans--;
                    if(a[i] < a[y])ans++; }
            }
            else {
                for(i=x+1; i<y; i++) {
                    if(a[i] < a[x])ans--;
                    if(a[i] > a[x])ans++;
                    if(a[i] > a[y])ans--;
                    if(a[i] < a[y])ans++; } }
            if(a[x] < a[y])ans++;
            else if(a[x] > a[y])ans--;
            printf("%d
    ",ans);
            modify(c2[(x-1)/block_size],a[x],-1);
            modify(c2[(x-1)/block_size],a[y],1);
            modify(c2[(y-1)/block_size],a[x],1);
            modify(c2[(y-1)/block_size],a[y],-1);
            exc(a[x],a[y]); }
        fclose(stdin);
        return 0; }

    orz cjkmao/Mr.cjk.cat

  • 相关阅读:
    读取web.xml中设置的参数
    在服务端中,读取properties资源文件中的数据
    window下,nodejs安装http-server,并开启HTTP服务器
    跨域请求资源的方式
    IView 给Submenu增加click事件失效解决方案
    Vue -- mounted方法中调用methods的方法(并取出mounted方法中回调函数的值)
    IView 使用Table组件时实现给某一列添加click事件
    物联网协议CoAP协议学习
    电脑操作
    物联网协议
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6291302.html
Copyright © 2020-2023  润新知