zoukankan      html  css  js  c++  java
  • [USACO 2011 Nov Gold] Above the Median【逆序对】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91

    这一题我很快的想出了,把>= x的值改为1,< x的改为-1,这样,某一段连续区间的和若非负,则这段区间符合题意。我连这个都想到了却没想到要去求逆序对!!!天呐,我真是太迷了!!

    前缀和+逆序对。

    逆序对就不解释了,该归并的归并,Fenwick Tree的Fenwick Tree,但是对于此题有一个O(n)的算法,仅限于求此题的逆序对!鉴于这一题值域范围小,而且相邻的两个前缀和只会相差1,所以可以针对这个特点设计算法,详见代码(真的不好说...)

    #include <cstdio>
    #include <cstring>
    
    const int maxn = 100005, zero = 100000;
    
    int n, s, a, x;
    long long ans, f[maxn << 1], t;
    
    int main(void) {
    	freopen("median.in", "r", stdin);
    	freopen("median.out", "w", stdout);
    	scanf("%d%d", &n, &x);
    	ans = (long long)n * (long long)(n + 1) >> 1;
    	f[zero] = 1;
    	for (int i = 1; i <= n; ++i) {
    		scanf("%d", &a);
    		if (a >= x) {
    			++s;
    			t -= f[s + zero];
    		}
    		else {
    			t += f[s + zero];
    			--s;
    		}
    		++f[s + zero];
    		ans -= t;
    	}
    	printf("%I64d
    ", ans);
    	return 0;
    }
    

      代码中f[i]表示这之前,i这个值出现了几次。t表示的是以本次的i为结尾的逆序对数。

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/ciao-sora/p/5978556.html
Copyright © 2011-2022 走看看