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为结尾的逆序对数。

  • 相关阅读:
    性能测试之-响应时间
    性能测试之-分类
    CSS 的基础语法
    linux之-mysql数据库约束3
    linux之-mysql数据库2
    linux安装mysql
    反向树状数组
    曼哈顿最小生成树
    最小生成树的性质
    CSA Round 84 Growing Trees
  • 原文地址:https://www.cnblogs.com/ciao-sora/p/5978556.html
Copyright © 2011-2022 走看看