Codeforces Round #666 (Div. 2) C. Multiples of Length (构造,贪心)
-
题意:有一个长度为\(n\)的序列,可以操作\(3\)次,每次选取一段区间,然后区间的元素加减区间长度的倍数,\(3\)次操作后使得序列所有元素为\(0\),问具体操作情况.
-
题解:假如我们能选择一整段区间\([1,n]\),使其所有元素都是\(n\)的倍数就好了,但是有的元素不是\(n\)的倍数,所以不能这样搞,但是我们可以选择\([2,n]\),这样区间长度就变成了\(n-1\),于是不管元素是不是\(n\)的倍数,\(n-1\)的倍数总能将其抵消使其成为\(n\)的倍数,接下来模拟搞一搞就好了,注意特判\(n=1\)的情况.
-
代码:
int n; ll a[N]; int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); n=read(); for(int i=1;i<=n;++i){ a[i]=read(); } if(n==1){ printf("1 1\n"); printf("1\n"); printf("1 1\n"); printf("1\n"); printf("1 1\n"); printf("%lld\n",-a[1]-2); return 0; } printf("1 1\n"); printf("%lld\n",-a[1]); a[1]=0; printf("2 %d\n",n); for(int i=2;i<=n;++i){ printf("%lld ",a[i]*(n-1)); a[i]*=n; } puts(""); printf("1 %d\n",n); for(int i=1;i<=n;++i){ printf("%lld ",-a[i]); } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮