USACO23OPEN-Silver A
题目来源
洛谷:USACO23OPEN-Silver Milk Sum(A)
SPOJ:USACO23OPEN-Silver Milk Sum(A)
题解: USACO23OPEN-Silver Milk Sum(A)
题面简述
题目描述
输入格式
第一行输入一个整数
第二行输入
第三行输入一个整数
接下来有
输出格式
输出共有
题解
言简意赅,该题有几个性质:
- 将
数组按从小到大顺序排列, ; - 对于每次操作,可以用
求得修改值在数组 中的位置; - 考虑每次修改对
的影响 ,分 种情况讨论,设 表示修改的位置对应的 在 数组的位置,设 表示修改的值 在 数组中的位置,分 , , 三种情况枚举即可。
代码
#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Rof(i,l,r) for(int i=l;i>=r;i--)
using namespace std;
#define int long long
inline int input(){int x;return cin>>x,x;}
const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 151234;
int sum[N],ans;
int n,q,a[N],b[N];
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
cin>>n;For(i,1,n) a[i]=b[i]=input();
sort(b+1,b+n+1);
For(i,1,n) sum[i]=sum[i-1]+b[i],ans+=i*b[i];
cin>>q;
while(q--){
int k=input(),w=input(),res=0;
int x=lower_bound(b+1,b+n+1,a[k])-b;
int y=lower_bound(b+1,b+n+1,w)-b;
if(x==y) res=ans-b[x]*x+w*y;else
if(x>y) res=ans+sum[x-1]-sum[y-1]-b[x]*x+w*y;
else res=ans-(sum[y-1]-sum[x])-b[x]*x+w*(y-1);
cout<<res<<'\n';
}
return 0;
}