描述:
给定一个序列a[1..n],q次操作。
每次操作会给定xx,你需要把a[1..n]每个数都加上x,然后找到一个i(1≤i≤n),使得a1+a2+⋯+ai
输入:
第一行两个正整数n,q(1≤n,q≤100000)。
接下来qq行,每行一个非负整数x(0≤x≤100000)。
输出:
输出q行,每行一个整数,即你找到的ii对应的a1+a2+⋯+ai
思路:根据 i * x + s[i],可以构造出n条直线,然后根据图形可以看出不同的x在不同的直线上有最大值。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int arr[100005];
long long s[100005]; //前缀和
struct node{
int k;
int b;
}a[100005]; //结构体表示直线,存斜率和截距
node p[100005];
// i * x + s【i】 i是斜率, s【i】是截距
int main(){
ios::sync_with_stdio(false);
int n, q;
while(cin >> n >> q){
s[0] = 0;
for(int i = 1; i <= n; i++){
cin >> arr[i];
s[i] = s[i - 1] + arr[i];
}
a[1].k = 1;
a[1].b = s[1];
for(int i = 2; i <= n;