CF 542E - 构造

版权声明:欢迎随便转载。 https://blog.csdn.net/a1214034447/article/details/88319754

题目链接:http://codeforces.com/contest/1130/problem/E

解题思路:

设一个分界点x,假设a[1~x]<0,a[x+1~n]>=0,那么题目给的程序的结果一定就是ans = (n-x) * ∑a[x+1~n]

但答案显然不是这样,设S  =  ∑a[x+1~n],l = (n-x),如果我要把a[x]加入进去可以使答案更大,那么就有ans = (S + a[x]) * (l +1)

那么就要S - (l+1)*a[x] >0,然后我们把a[x-1]设成最小,保证答案一定不会把a[x-1]加进去。

所以他们的答案差就是S - a[x] * (l+1) == k,S - k== a[x]*(l+1)

所以最后把a[x]设成-1,然后枚举x的值就可以了(因为要保证S<=1e6*l)。

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <cstring> 
#include <vector>
#define fi first
#define se second
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair <int,int> pa;
const int mx = 2000;
const int mod = 1e9 + 7;
const int N = 1;//|a[x]|
int n,k;
int main()
{
	scanf("%d",&k);
	printf("%d\n",mx);
	for(int i=1;i<mx;i++){
		ll ret = 1ll*(i+1)*N + k;
		if(ret<=1ll*1e6*i){
			for(int j=1;j<mx-i;j++) printf("-1000000 ");
			printf("%d ",-N);
			int c = i;
			while(c--){
				if(ret>=1e6) printf("1000000 "),ret -= 1e6;
				else{
					printf("%d ",ret);
					ret = 0;
				}
			}
			return 0*puts("");
		}
	}
    return 0*puts("");
}
扫描二维码关注公众号,回复: 6072707 查看本文章

猜你喜欢

转载自blog.csdn.net/a1214034447/article/details/88319754