- 题意:
- n个数,最多n+1操作,要么前i个数加x,要么前i个数对x取余,最后使得严格递增
- 思路
- 直接进行n+1次,最终目标为 1 - n-1 的递增序列。开始所有数都取余n;后面n次。
- 从后面开始到对 看看 这个位置的数 与 其对应的 最终应该成为的 i-1 差距是多少 ,并且需要把后面的对他造成的影响,
- 算在其中,不断传递 过程中 相邻两个 之间才会有影响 ,因为 传递一次 影响就被抵消掉了 ,最终 会 取余 n,所以过程中,
- 如果出现负数,可以用 n来凑,就能保证抵消掉后面对前面的影响并且构造出 1 - n-1 的序列 。
-
#include<bits/stdc++.h> using namespace std; #define maxn 10000 int n,a[maxn],pre; int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); a[i]%=n; } pre=0; stack<int>stk; for(int i=n; i>=1; i--) { pre%=n; stk.push((i-1)-a[i]+2*n-pre); pre=i-1-a[i]; if(pre<0)pre+=n; } int id=1; printf("%d\n",n+1); while(!stk.empty()) { printf("1 %d %d\n",id++,stk.top()); stk.pop(); } printf("2 %d %d\n",n,n); return 0; }
C. Ehab and a 2-operation task-构造
最新推荐文章于 2020-03-20 17:04:41 发布