zoukankan      html  css  js  c++  java
  • CodeForces911D 逆序对

    http://codeforces.com/problemset/problem/911/D

    题意 给你一个长度为N的序列,有M次操作。每次翻转[l,r]的区间,每次操作后询问序列逆序对个数的奇偶性

    很显然问题每次操作之后的变化数量只与区间内自身的逆序数对有关,比较麻烦的操作是翻转的操作。

    但是本题的问题是逆序数对的奇偶性,事实上经过仔细的比较发现,整个序列翻转后的逆序数对与被翻转的区间内数字无关,只和区间长度有关。

    区间(l,r)内所有数字的对数是(r - l + 1) * (r - l) / 2;

    如果所有数字的对数是偶数, 不论区间内逆序数对数是偶数还是奇数,都不变(奇数变奇数,偶数变偶数)。

    相反,数字对数是偶数,则不论如何都会改变。

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    const double eps = 1e-9;
    const int maxn = 1510;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,tmp,K;
    int tree[maxn];
    void add(int p){
        for(;p <= N; p += p & -p) tree[p]++;
    }
    int getsum(int p){
        int s = 0;
        for(;p > 0; p -= p & -p) s += tree[p];
        return s;
    }
    int main()
    {
        Sca(N);
        Mem(tree,0);
        int cnt = 0;
        For(i,1,N){
            Sca(tmp);
            add(tmp);
            cnt += getsum(N) - getsum(tmp);
            cnt &= 1;
        }
        //cout << cnt << endl;
        Sca(M);
        For(i,1,M){
            int l,r; scanf("%d%d",&l,&r);
            int x = r - l + 1;
            cnt ^= (x * (x - 1) / 2 % 2);
            if(cnt & 1)puts("odd");
            else puts("even");
        }
        #ifdef VSCode
        system("pause");
        #endif
        return 0;
    }
  • 相关阅读:
    寒假 学习进度七
    寒假学习进度
    寒假学习进度五
    寒假学习进度四
    寒假学习进度三
    寒假学习进度二
    Spark实验五
    半篇论文笔记
    REPL
    Scala基本语法及操作、程序控制结构
  • 原文地址:https://www.cnblogs.com/Hugh-Locke/p/9571337.html
Copyright © 2011-2022 走看看