码迷,mamicode.com
首页 > 编程语言 > 详细

“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 F-排列计算(树状数组)

时间:2020-05-11 00:50:32      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:clu   构造   lan   赋值   main   get   names   设计   线段   

地址:https://ac.nowcoder.com/acm/contest/5477/F

技术图片

 技术图片

 

     解析:其实并不需要关心它具体是怎么构造的,那样的是很麻烦的。。。明确一点,某个位置出现的次数越多,就需要给它赋越大的值,既当前sum=出现次数*x。出现次数,可以通过差分数组或线段树维护一下,然后排个序,按顺序赋值就可以了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int c[maxn];
int main()
{
    int n  , m ; 
    cin>>n>>m;
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        c[l]++;
        c[r+1]--;    
    }    
    for(int i = 1;i<=n;i++)
        c[i]+=c[i-1];
    sort(c+1,c+n+1);
    ll sum=0;
    for(int i=n;i>=1;i--)
        sum+=i*c[i];
    cout<<sum<<endl;
} 

 

“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 F-排列计算(树状数组)

标签:clu   构造   lan   赋值   main   get   names   设计   线段   

原文地址:https://www.cnblogs.com/liyexin/p/12866003.html

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