Codeforces Round #525 (Div. 2)C - Ehab and a 2-operation task

题目

题意:

  给你长度为n的数组a[i],最多操作n+1次,每次都可以将前 i 个数  (操作1)都加上x,或者(操作2)都%x ,(x为1e6以内的任意数,且每次操作可以不同), 使得数组a严格单调递增(一定后一项大于前一项)。  要你输出一个总的操作次数,再以 1 i x 或者 2 i x 的形式输出每次操作,其中 1和2是哪种操作,i 是前i个 。 如果不需要操作,输出0即可。

思路:

  每个a[i]都加上一个巨大的数num,a[ i ] += num ; 然后每一个a[i] 都 a[i] = a[i] % (a[i] - i ),(i从1到n),这样就可以肯定地得到a[1]=1, a[2]=2, ....a[n]=n, 且总的操作次数正好 =n+1 。

  n=1时,不用特判。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9 #include<set>
10 #include<vector>
11 #include<stack>
12 #include<queue>
13 #include<map>
14 using namespace std;
15 #define ll long long
16 #define mem(a,x) memset(a,x,sizeof(a))
17 #define se second
18 #define fi first
19 const ll mod=1e9+7;
20 const int INF= 0x3f3f3f3f;
21 const int N=3e5;
22 
23 int n;
24 int a[2005];
25 
26 int main()
27 {
28     cin>>n;
29     for(int i=1;i<=n;i++)
30     {
31         scanf("%d",&a[i]);
32         a[i]+=N;
33     }
34     cout<<n+1<<endl;
35     printf("1 %d %d\n",n,N);
36     for(int i=1;i<=n;i++)
37     {
38         printf("2 %d %d\n",i,a[i]-i);
39     }
40 }
View Code

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/10116122.html