洛谷 P1732 [TJOI2011]序列
题目描述
一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中:
求\sum\limits^n_{i=1} b_ii=1∑nbi
输入输出格式
输入格式:
第一行是一个正整数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; } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。