码迷,mamicode.com
首页 > 其他好文 > 详细

51NOD 1712 - 区间求和

时间:2018-04-26 13:21:22      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:求和   unsigned   mes   --   遍历   uml   统计   i++   sig   

按题解思路,统计单点贡献

对于每个位置 x,把2x-l-r拆分成前后两部分,前部分NUM和后部分SUM可以在遍历时O(1)更新

#include <stdio.h>
using namespace std;
const int N = 1000005;
typedef unsigned int ui;
ui n, a[N];
ui suml[N], numl[N], numr[N], sumr[N], sum2[N], num2[N];
int main() {
    scanf("%u", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%u", &a[i]);
        sumr[a[i]] += i;
        numr[a[i]]++;
    }
    ui SUM = 0, NUM = 0, ans = 0;
    for (int i = 1; i <= n; i++) {
        numl[a[i]]++, suml[a[i]] += i;
        NUM -= num2[a[i]];
        num2[a[i]] = numl[a[i]] * numr[a[i]];
        NUM += num2[a[i]];
        SUM -= sum2[a[i]];
        sum2[a[i]] = suml[a[i]] * numr[a[i]] + sumr[a[i]] * numl[a[i]];
        SUM += sum2[a[i]];
        ans += (NUM*i*2 - SUM) * a[i];
        numr[a[i]]--, sumr[a[i]] -= i;
        NUM -= num2[a[i]];
        num2[a[i]] = numl[a[i]] * numr[a[i]];
        NUM += num2[a[i]];
        SUM -= sum2[a[i]];
        sum2[a[i]] = suml[a[i]] * numr[a[i]] + sumr[a[i]] * numl[a[i]];
        SUM += sum2[a[i]];
    }
    printf("%u\n", ans);
}

  

51NOD 1712 - 区间求和

标签:求和   unsigned   mes   --   遍历   uml   统计   i++   sig   

原文地址:https://www.cnblogs.com/nicetomeetu/p/8951725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!