cf1088C Ehab and a 2-operation task (构造)

题意:给一个数列,你可以进行至多n+1次操作,每次给一个前缀对某数取模或者加某数,使得最后数列严格单增

考虑到因为是前缀和而且还不能加负数,光靠加是不能让前面的小于后面的

所以要让他先在模某数意义下单增,最后再模一下

先钦定好mod,然后从后往前做,这时候a[i]已经定下来,只要给前i个加上某数使得(a[i-1]-a[i])%mod=-1即可

一共加了N次,最后还要模一次

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 #define MP make_pair
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=1e5+10;
 8 
 9 inline char gc(){
10     return getchar();
11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
13 }
14 inline int rd(){
15     int x=0;char c=gc();bool neg=0;
16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
18     return neg?(~x+1):x;
19 }
20 
21 int N;
22 ll a[maxn];
23 
24 int main(){
25     //freopen("","r",stdin);
26     int i,j,k;
27     N=rd();
28     for(i=1;i<=N;i++) a[i]=rd();
29     int mod=2001;
30     ll inc=0;
31     printf("%d\n",N+1);
32     a[N+1]=2000;
33     for(i=N;i;i--){
34         a[i]+=inc;
35         int d=((a[i+1]-1-a[i])%mod+mod)%mod;
36         inc+=d;a[i]+=d;
37         printf("1 %d %d\n",i,d);
38     }
39     printf("2 %d %d\n",N,mod);
40     return 0;
41 }

 

posted @ 2018-12-08 20:41  Ressed  阅读(290)  评论(0编辑  收藏  举报