Codeforces Round #666 (Div. 2) C. Multiples of Length (構造,貪心)
阿新 • • 發佈:2020-09-12
-
題意:有一個長度為\(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; }