主要问题是构造一组操作,在这两个操作中,对一个前缀进行加法不会改变前缀内数字的大小关系,所以假设我们将所有数字对数字k取模,那么剩下的数字必然小于k,在这个时候对数字的所有前缀都加上数字k,那么数组内任意一个数字与之后的数字差值必然大于0
#include <bits/stdc++.h>
#include <cstring>
using namespace std;
const int N=3010;
int n;
int a[N];
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    cout<<n<<endl;
    cout<<2<<' '<<n<<' '<<2<<endl;
    for(int i=0;i<n-1;i++)
        cout<<1<<' '<<i+1<<' '<<2<<endl;
    return 0;
}
n = int(input())
a = list(map(int, input().split()))
print(n)
print(f"2 {n} 2")
for i in range(n - 1):
    print(f"1 {i + 1} 2")
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        
        System.out.println(n);
        System.out.println("2 " + n + " 2");
        
        for (int i = 0; i < n - 1; i++) {
            System.out.println("1 " + (i + 1) + " 2");
        }
    }
}
        小红有一个长度为n的数组a1,a2....小红想把它变成严格递减的,具体的,他可以对a数组做如下操作:
选择一个前缀,再选择一个整数x(1≤x≤106),将选择的数字都加上x,即ai=ai+x。
请问他能否在n次操作以内将a变为严格递减的 如果可以的话请你帮他构造出一个合法方案把。
前缀是指从下标为1开始的一段连续区间。严格递减 是指数组每一项都严格小于上一项,不能等于。
第一行输入一个整数n(1≤n≤3000)代表数组中元素的数量。
第二行输入n个整数a1,a2,....,an(1≤ai≤105) 代表数组中的元素
在一行输出一个整数m(0≤m≤n)代表操作
此后m行,第i行输出三个整数opi,t1和
xi(1≤opi≤2;1≤ti≤n;1≤xi≤109)代表第i步操作的操作类型,前缀的位置和选择的数字。
如果您的构造的操作方案中有任何数字限制范围,将会被视为错误。如果有多种合法答案您可以输出任意一种
输入
5
7 9 11 10 2
输出
3
2 4 6
1 2 3 
1 1 3