D Non-decreasing
题意:给N个数,有操作f(a,b) 把第a个数的值加到第b个数上。求一个小于2N的操作序列,使给出的序列变成非递减序列。
题解:当序列为非负序列时,通过a[i+1]+=a[i]构造;
当为非正序列时a[i]+=a[i+1];
所以先用N个操作(加绝对值最大的数)变成非正/非负序列,然后按照上面的构造方法构造即可。
注意边界。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define per(i,a,b) for(int i=b-1;i>=(a);i--)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define lb(x) (x&-(x))
const int N = 101010;
int a[200];
int main(){
int maxx=INT_MIN;
int maxxi,minni;
int minn=INT_MAX;
int n;
cin>>n;
rep(i,0,n)
{
scanf("%d",&a[i]);
if(a[i]>maxx)
{
maxx=a[i];
maxxi=i;
}
if(a[i]<minn)
{
minn=min(minn,a[i]);
minni=i;
}
}
printf("%d\n",n+n-1);
if(maxx+minn>=0)
{
rep(i,0,n)
{
printf("%d %d\n",maxxi+1,i+1);
a[i]+=maxx;
}
// rep(i,0,n) cout<<a[i]<<" ";cout<<endl;
rep(i,0,n-1)
{
printf("%d %d\n",i+1,i+2);
a[i+1]+=a[i];
}
}
else
{
rep(i,0,n)
{
printf("%d %d\n",minni+1,i+1);
a[i]+=minn;
}
// rep(i,0,n) cout<<a[i]<<" ";cout<<endl;
per(i,0,n-1)
{
printf("%d %d\n",i+2,i+1);
a[i]+=a[i+1];
}
}
return 0;
}