Codeforces Round #666 (Div. 2)C - Multiples of Length(错位相减)
【摘要】
problem
给出N个数,可以进行三次操作, 每次选中一个区间,区间里任意一个元素可以加上一个区间长度的倍数(并且加的数可以互相不同) 让所有数变成0 求方案
solution
好久没打CF了,...
problem
给出N个数,可以进行三次操作,
每次选中一个区间,区间里任意一个元素可以加上一个区间长度的倍数(并且加的数可以互相不同)
让所有数变成0 求方案
solution
好久没打CF了,签到题一点都不友好。。。
这题好像错位相减,上一题等比数列,,这。。。
- 题目规定了只有3次操作,加上是T3签到题,所以想到很可能是乱搞(强行操作)
- 用掉两次操作减掉序列上每个位置的值,即 -a[i]*n,+a[i]*(n-1)这样作差。(本来n可以为任意值,此时考虑到为当前区间的长度,所以直接两次操作分别长为n和n-1)
- 因为第二次加了n-1没加完,最后再加一次。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[100010];
int main(){
int n; cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
if(n==1){
cout<<1<<" "<<1<<endl;
cout<<0<<endl;
cout<<1<<" "<<1<<endl;
cout<<0<<endl;
cout<<1<<" "<<1<<endl;
cout<<-a[1]<<endl;
}else{
cout<<1<<" "<<n<<endl;
for(int i = 1; i <= n; i++)cout<<(-1)*a[i]*n<<" ";cout<<endl;
cout<<1<<" "<<n-1<<endl;
for(int i = 1; i < n; i++)cout<<a[i]*(n-1)<<" ";cout<<endl;
cout<<n<<" "<<n<<endl;
cout<<a[n]*(n-1)<<endl;
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。
原文链接:gwj1314.blog.csdn.net/article/details/108345603
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)