洛谷 P1732 [TJOI2011]序列

题目描述

一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中:

\sum\limits^n_{i=1} b_ii=1nbi

输入输出格式

输入格式:

 

第一行是一个正整数t,表示测试数据的组数。接下来有t行,每行表示一组测试数据。每行以一个正整数n开始,表示数列A中元素的个数;然后是n个非负整数,依次表示a1, a2, …, an的值。

0<t<=10

0<n<=100 000

0<= ai<=65 536

 

输出格式:

 

对于每组测试数据,输出数列B的所有的元素之和。

 

输入输出样例

输入样例#1: 复制
2
5 1 2 3 4 5
7 2 9 7 4 6 2 6
输出样例#1: 复制
5
14

 思路:模拟。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n;
long long ans;
struct nond{
    int num,pos;
}v[100010];
int cmp(nond a,nond b){
    if(a.num==b.num)    return a.pos<b.pos;
    return a.num<b.num;
}
int main(){
    scanf("%d",&t);
    while(t--){
        ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i].num),v[i].pos=i;
        sort(v+1,v+1+n,cmp);
        for(int i=1;i<=n;i++){
            if(v[i].pos==1){ ans+=v[i].num;continue; }
            int l=i-1,r=i+1,bns=0x7f7f7f7f;
            while(v[l].pos>v[i].pos)    l--;
            while(v[r].pos>v[i].pos)    r++;
            if(l!=0)    bns=min(bns,v[i].num-v[l].num);
            if(r!=n+1)    bns=min(bns,v[r].num-v[i].num);
            ans+=bns;
        }
        cout<<ans<<endl;
    }
}

 

posted @ 2017-12-07 20:10  一蓑烟雨任生平  阅读(225)  评论(0编辑  收藏  举报