码迷,mamicode.com
首页 > 其他好文 > 详细

Gym100187I

时间:2018-08-11 17:14:37      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:越界   oss   for   中间   bit   [1]   cpp   using   scan   

Gym100187I


做法:倒着构造,根据下一个数确定正负,本身这个位置确定升降,正就从1开始,负就从-1开始。最终序列从±1e9开始,特殊处理一下,中间判是否越界即可。

水吧。。。然后就爆炸了,毕竟 IMPOSSIBLE 和 NO 的区别我 zz 的肉眼。。。3个小时都看不到。。。幸好是场训练赛,开了个没人写的题,结果凉透啊。。。需要输出单词的题,一定要注意单词拼的对不对!!!

//***mdzz IMPOSSIBLE 写成 NO, WA到终场!!!!!***
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define PII pair<int,int>
typedef long long ll;
const int N = 2000+ 55;
const int inf = 0x3f3f3f3f;
using namespace std;
int n,ctt,cvt;
ll tmp[N],v[N], a[N], cc=1;
int main() {
    srand(time(0));
    scanf("%d",&n);
    rep(i,1,n) scanf("%I64d",&a[i]);
    cc = 1;
    per(i,n,2) {
        ctt = 0;
        ll f = 0;
        cc = 1;
        for(int j=0;j<cvt;++j) cc += abs(v[j]);
        if(a[i-1]==1&&a[i]==0) {
            f=cc;
            tmp[ctt++] = (cc);
            for(int j=0;j<cvt;++j) {
                f=f+v[j];
                if(f>1e9||f<-1e9) return puts("IMPOSSIBLE"),0;
                tmp[ctt++]=(f);
            }
        }
        else if(a[i-1]==0&&a[i]==1) {
            f=-cc;
            tmp[ctt++]=(-cc);
            for(int j=0;j<cvt;++j) {
                f=f+v[j];
                if(f>1e9||f<-1e9) return puts("IMPOSSIBLE"),0;
                tmp[ctt++]=(f);
            }
        }
        else if(a[i-1]==0&&a[i]==0) {
            f=-1;
            tmp[ctt++]=(-1);
            for(int j=0;j<cvt;++j) {
                f=f+v[j];
                if(f>1e9||f<-1e9) return puts("IMPOSSIBLE"),0;
                tmp[ctt++]=(f);
            }
        }
        else if(a[i-1]==1&&a[i]==1) {
            f=1;
            tmp[ctt++]=(1);
            for(int j=0;j<cvt;++j) {
                f=f+v[j];
                if(f>1e9||f<-1e9) return puts("IMPOSSIBLE"),0;
                tmp[ctt++]=(f);
            }
        }
        cvt = 0;
        for(int i=0;i<ctt;++i) v[cvt++]=tmp[i];
        int ff = 0;
        for(int j=0;j<cvt;++j) if(v[j]==0) ff=1;

        if(a[i-1]==1&&ff) {
            for(int j=0;j<cvt;++j) ++v[j];
        }
        else if(ff&&a[i-1]==0) {
            for(int j=0;j<cvt;++j) --v[j];
        }
        for(int i=0;i<cvt;++i) if(v[i]>1e9||v[i]<-1e9) return puts("IMPOSSIBLE"),0;
    }
    ll f=1;
    if(a[1]==1) f=-1e9;
    else f=1e9;
    ctt = 0;
    tmp[ctt++]=(f);
    for(int i=0;i<cvt;++i) {
        f=f+v[i];
        if(abs(f)>1e9) return puts("IMPOSSIBLE"),0;
        tmp[ctt++]=(f);
    }
    for(int i=0;i<ctt;++i) if(tmp[i]>1e9||tmp[i]<-1e9) return puts("IMPOSSIBLE"),0;
    for(int i=0;i<ctt;++i) printf("%I64d ",tmp[i]);puts("");
    return 0;
}

Gym100187I

标签:越界   oss   for   中间   bit   [1]   cpp   using   scan   

原文地址:https://www.cnblogs.com/RRRR-wys/p/9460261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!