AtCoder Beginner Contest 081 D

来源:互联网 发布:可视化网页编辑软件 编辑:程序博客网 时间:2024/06/12 23:36

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;    }
原创粉丝点击