题目较为简单,不多解释
求和
#include<iostream>
using namespace std;
const int N=2*1e5+10;
long long ans=0,s=0;
int a[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];s+=a[i];
}
for(int i=1;i<=n;i++){
ans+=a[i]*(s-a[i]);
}
cout<<ans/2<<endl;
return 0;
}
数位排序
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m;
struct node{
int value;
int sum=0;
};
node a[N];
bool cmp(node a, node b){
if(a.sum<b.sum)
return 1;
else if(a.sum>b.sum)
return 0;
else
return a.value<b.value;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].value=i;
int p=i;
while(p){
a[i].sum+=p%10;
p/=10;
}
}
sort(a+1,a+1+n,cmp);
cout<<a[m].value<<endl;
return 0;
}
重新排序
朴素版
/*
可能超时的思路
1. 首先对于给出的数进行排序,肯定要多选大的数,排序好的数组记o[]
2. 然后考虑给出的区间,记录每个区间被计算到的次数,记t[]
3. 最后相当于一个填数字的过程,,将o[]和降序排序的t[]对应数字相乘就得到了最大排序的和
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],o[N],t[N];
long long sum=0,mmax=0;
int n,m;
bool cmp(int a,int b){
return a>b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
o[i]=a[i];
}
sort(o+1,o+1+n,cmp);
cin>>m;
while(m--){
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
sum+=a[i];
t[i]++;
}
}
sort(t+1,t+1+n,cmp);
for(int i=1;i<=n;i++){
mmax+=o[i]*t[i];
}
cout<<mmax-sum<<endl;
return 0;
}
这里需要用到差分,并且注意乘法时候强制类型转换
/*
使用差分数组
差分数组应用于对一段数据进行统一加和的操作,将时间复杂度由O(n)降为O(1)
实现思路:
给定a[],b[],其中a[]是b[]的前缀和数组,b[]则称为a[]的差分数组
由于
a[1]=b[1]
a[2]=b[1]+b[2]
a[3]=b[1]+b[2]+b[3]
故
b[1]=a[1]
b[2]=a[2]-a[1]
b[3]=a[3]-a[2]
如果我们对b[i]进行操作+c,那么相应的a[i],a[i+1],...都会加上c
因此每次进行加和操作时,仅需要对b进行操作,然后最后统一由b推出a即可
例如,我们想对a[l]到a[r]中间的所有数加上c
那么我们首先对b[l]+=c,这样a[l]之后的数都加上c,
然后我们对b[r+1]-=c,这样a[r]之后的数字都减去c。
这样实现了 a[l]到a[r]中间的所有数加上c
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],q[N];
long long sum1=0,sum2=0;
int n,m;
bool cmp(int a,int b){
return a>b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
while(m--){
int l,r;
cin>>l>>r;
q[l]++;
q[r+1]--;
}
//构造前缀和数组,即被加次数数组
for(int i=1;i<=n;i++)
q[i]+=q[i-1];
for(int i=1;i<=n;i++)
sum1+=(long long)q[i]*a[i];
sort(a+1,a+1+n,cmp);
sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i++){
sum2+=(long long)q[i]*a[i];
}
cout<<sum2-sum1<<endl;
return 0;
}