9.28 正睿普及3

目录


2018.9.28 正睿普及3

时间:(实际)
期望得分:100+100+100+...100?
实际得分:100+96+100+0

比赛链接

D这种模拟还是趁早放弃好
放代码自己体会

C题是搞笑的吧

过几天能交了再改

A

题目链接


#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e6+5;

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);

    LL a=read(),b=read(),c=read();
    if(a==1||b==1||c==1) return putchar('0'),0;
    LL ans=2ll*a*b;
    ans+=2ll*(b*c-b*2);
    ans+=2ll*(a*c-c*2-std::max(0ll,a-2)*2);
    printf("%lld\n",a*b*c-ans);

    return 0;
}

B

题目链接

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;

int opt[7];
LL a,b,c,d,Ans;

inline int read()
{
    int now=0,f=1;register char c=gc();
    for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now*f;
}
void DFS(int x)//懒得换double怎么办 
{// 1+ 2- 3* 4/
    if(x>3)
    {
        LL res=0,tmp;
        if(opt[1]==1||opt[1]==2)
        {
            if(opt[2]==1||opt[2]==2)
            {
                if(opt[3]==1||opt[3]==2)
                    res=a+(opt[1]==1?b:-b)+(opt[2]==1?c:-c)+(opt[3]==1?d:-d);
                else
                {
                    if(opt[3]==4 && c%d) return;
                    tmp=opt[3]==3?c*d:c/d;
                    res=a+(opt[1]==1?b:-b)+(opt[2]==1?tmp:-tmp);
                }
            }
            else
            {
                if(opt[2]==4 && b%c)
                {
                    if(opt[3]==3 && !(b*d%c)) Ans=std::min(Ans,std::abs(a+(opt[1]==1?1ll:-1ll)*b*d/c));
                    return;
                }
                tmp=opt[2]==3?b*c:b/c;
                if(opt[3]==1||opt[3]==2)
                    tmp+=(opt[3]==1?d:-d);
                else
                {
                    if(opt[3]==4 && tmp%d) return;
                    tmp=(opt[3]==3?tmp*d:tmp/d);
                }
                res=opt[1]==1?a+tmp:a-tmp;
            }
        }
        else//*/
        {
            if(opt[1]==4 && a%b)
            {
                if(opt[2]==3)
                {//mmp
                    if(opt[3]==3)
                        if(!(a*c*d%b)) Ans=std::min(Ans,std::abs(a*c*d/b));
                        else return;
                    else if(opt[3]==4)
                        if(!(a*c%(b*d))) Ans=std::min(Ans,std::abs(a*c/b/d));
                        else return;
                    else if(!(a*c%b)) Ans=std::min(Ans,std::abs(a*c/b+(opt[3]==1?d:-d)));
                    else return;
                }
                else if(opt[2]==4)
                {
                    if(opt[3]==3)
                        if(!(a*d%(b*c))) Ans=std::min(Ans,std::abs(a*d/b/c));
                        else return;
                    else return;
                }
                return;
            }
            tmp=opt[1]==3?a*b:a/b;
            if(opt[2]==1||opt[2]==2)
            {
                if(opt[3]==1||opt[3]==2)
                    res=tmp+(opt[2]==1?c:-c)+(opt[3]==1?d:-d);
                else
                {
                    if(opt[3]==4 && c%d) return;
                    res=tmp+(opt[2]==1?(opt[3]==3?c*d:c/d):-(opt[3]==3?c*d:c/d));
                }
            }
            else
            {
                if(opt[2]==4 && tmp%c)
                {
                    if(opt[3]==3 && !(tmp*d%c)) Ans=std::min(Ans,std::abs(tmp*d/c));
                    else return;
                    return;
                }
                tmp=opt[2]==3?tmp*c:tmp/c;
                if(opt[3]==1||opt[3]==2)
                    res=opt[3]==1?tmp+d:tmp-d;
                else
                {
                    if(opt[3]==4 && tmp%d) return;
                    res=opt[3]==3?tmp*d:tmp/d;
                }
            }
        }
//      printf("%d %d %d %I64d\n",opt[1],opt[2],opt[3],res);
        Ans=std::min(Ans,std::abs(res));
        return;
    }
    for(int i=1; i<=4; ++i)
        opt[x]=i, DFS(x+1);
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);

    a=read(),b=read(),c=read(),d=read();
    Ans=std::abs(a+b+c+d), DFS(1), printf("%lld\n",Ans);

    return 0;
}

C

题目链接

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;

int n,tot,dep[N],fa[N];
LL Ans;
std::vector<int> e[N];

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline void AE(int u,int v)
{
    e[u].push_back(v), e[v].push_back(u);
}
bool cmp(int x,int y)
{
    return dep[x]<dep[y];
}
void DFS1(int x)
{
    for(int i=0,l=e[x].size(),v; i<l; ++i)
        if((v=e[x][i])!=fa[x])
            fa[v]=x, dep[v]=dep[x]+1, DFS1(v);
}
void DFS2(int x)
{
    static int Time=0;

    Ans+=tot-Time, ++Time;
//  std::sort(e[x].begin(),e[x].end(),cmp);
    for(int i=0,l=e[x].size(),v; i<l; ++i)
        if((v=e[x][i])!=fa[x]) DFS2(v), ++Time;
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);

    n=read(), tot=2*n-2;
    for(int i=1; i<n; ++i) AE(read(),read());
    DFS1(1), DFS2(1);
    printf("%lld\n",Ans);

    return 0;
}

D

题目链接

考试代码

D

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e5+7;

int n;
char s[N];

int Nxt_Oct(int now,int &p)
{
    if(now>n) {p=now; return 0;}
    int nxt,res=0;
    while(s[now]=='O')
    {
        nxt=now+1,res=0;
        while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
        now=nxt;
    }
    p=now;
    return res;
}
void Nxt_Vol(int now,int &p,int &vol,int &ans)
{
    int nxt=now+1,res=0,tmp=now;
    while(s[now]=='V')
    {
        nxt=now+1,res=0;
        while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
        tmp=now, now=nxt;
    }
    p=now;
    for(int i=now; i<=n; ++i)
        if(isalpha(s[i]) && s[i]!='V' && s[i]!='O') {ans+=now-tmp; break;}
        else if(i==n) p=n+1;
    if(res!=vol) vol=res;
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);

    while(scanf("%s",s+1),s[1]!='*')
    {
        n=strlen(s+1), s[n+1]='$';

        int oct=4,real=4,vol=100;//volume
        int ans=0,now=1;
        for(; now<=n; )
        {
//          printf("n:%d now:%d oct:%d real:%d vol:%d ans:%d\n",n,now,oct,real,vol,ans);
            if(s[now]=='V')
            {
                int nxt=now+1,res=0,tmp=now;
                while(s[now]=='V')
                {
                    nxt=now+1,res=0;
                    while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
                    tmp=now, now=nxt;
                }
                if(nxt>n) break;
                if(res!=vol) vol=res, ans+=nxt-tmp;
            }
            else if(s[now]=='O')
            {
                int nxt,res=oct;
                while(s[now]=='O')
                {
                    nxt=now+1,res=0;
                    while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
                    now=nxt;
                }
                if(nxt>n) break;
                if(std::abs(oct-res)>1)
                {
                    if(res>oct) ans+=res-oct-1, oct=res-1;
                    else ans+=oct-res-1, oct=res+1;
                }
                real=res;
            }
            else if(real==oct)
            {
                if(now+1<=n && s[now]=='B' && s[now+1]=='+')
                {
                    int nxt=now+2,tm=1;
                    while(nxt+1<=n && s[nxt]=='B' && s[nxt+1]=='+') nxt+=2, ++tm;
                    now=nxt;
                    if(tm==1)
                    {
                        if(s[now]!='O'&&s[now]!='V') ;//还有bug mmp 
                        else if(s[now]!='O')
                        {
                            Nxt_Vol(now,now,vol,ans);
                            if(now>n) now=n+1;
                        }

                        if(s[now]=='O')
                        {
                            int tmp,nxtoct=Nxt_Oct(now,tmp);
                            now=tmp;
                            while(now<=n && s[now]=='V')
                            {
                                Nxt_Vol(now,now,vol,ans);
                                if(now>n) now=n+1;
                                if(s[now]=='O')
                                    nxtoct=Nxt_Oct(now,tmp), now=tmp;
                            }
                            if(tmp>n) ans+=2;
                            else if(nxtoct>oct)
                            {
                                ans+=2, ++oct;
                                real=nxtoct;
                                if(std::abs(oct-real)>1)
                                {
                                    if(real>oct) ans+=real-oct-1, oct=real-1;
                                    else ans+=oct-real-1, oct=real+1;
                                }
                            }
                            else ans+=2;
                        }
                        else ans+=2;
                    }
                    else ans+=tm+1, ++oct;
                }
                else if(now+1<=n && s[now]=='C' && s[now+1]=='-')
                {
                    int nxt=now+2,tm=1;
                    while(nxt+1<=n && s[nxt]=='C' && s[nxt+1]=='-') nxt+=2, ++tm;
                    now=nxt;
                    if(tm==1)
                    {
                        if(s[now]!='O'&&s[now]!='V') ;
                        else if(s[now]!='O')
                        {
                            Nxt_Vol(now,now,vol,ans);
                            if(now>n) now=n+1;
                        }

                        if(s[now]=='O')
                        {
                            int tmp,nxtoct=Nxt_Oct(now,tmp);
                            now=tmp;
                            while(now<=n && s[now]=='V')
                            {
                                Nxt_Vol(now,now,vol,ans);
                                if(now>n) now=n+1;
                                if(s[now]=='O')
                                    nxtoct=Nxt_Oct(now,tmp), now=tmp;
                            }
                            if(tmp>n) ans+=2;
                            else if(nxtoct<oct)
                            {
                                ans+=2, --oct;
                                real=nxtoct;
                                if(std::abs(oct-real)>1)
                                {
                                    if(real>oct) ans+=real-oct-1, oct=real-1;
                                    else ans+=oct-real-1, oct=real+1;
                                }
                            }
                            else ans+=2;
                            now=tmp;
                        }
                        else ans+=2;
                    }
                    else ans+=tm+1, --oct;
                }
                else
                {
                    while(now<=n && ((s[now]=='+'||s[now]=='-')||((s[now]!='V' && s[now]!='O' && (now==n||s[now]!='C'||s[now+1]!='-') && (now==n||s[now]!='B'||s[now+1]!='+')))))
//                      printf("Loop:%d %d %d\n",ans,now,n),
                        ++ans, ++now;
                }
            }
            else if(real>oct)
            {
                int tm=0;
                while(now+1<=n && s[now]=='C' && s[now+1]=='-')
                    ++tm, now+=2;
                ans+=tm;

                if(s[now]!='O'&&s[now]!='V') ;
                else if(s[now]!='O')
                {
                    Nxt_Vol(now,now,vol,ans);
                    if(now>n) now=n+1;
                }

                if(s[now]=='O')
                {
                    int tmp,nxtoct=Nxt_Oct(now,tmp);
                    if(tmp>n) ;
                    else// if(nxtoct<oct)
                    {
                        real=nxtoct;
                        if(std::abs(oct-real)>1)
                        {
                            if(real>oct) ans+=real-oct-1, oct=real-1;
                            else ans+=oct-real-1, oct=real+1;
                        }
                    }
                    now=tmp;
                }
                else if(now<=n) ++ans, ++oct;
            }
            else if(real<oct)
            {
                int tm=0;
                while(now+1<=n && s[now]=='B' && s[now+1]=='+')
                    ++tm, now+=2;
                ans+=tm;

                if(s[now]!='O'&&s[now]!='V') ;
                else if(s[now]!='O')
                {
                    Nxt_Vol(now,now,vol,ans);
                    if(now>n) now=n+1;
                }

                if(s[now]=='O')
                {
                    int tmp,nxtoct=Nxt_Oct(now,tmp);
                    if(tmp>n) ;
                    else// if(nxtoct<oct)
                    {
                        real=nxtoct;
                        if(std::abs(oct-real)>1)
                        {
                            if(real>oct) ans+=real-oct-1, oct=real-1;
                            else ans+=oct-real-1, oct=real+1;
                        }
                    }
                    now=tmp;
                }
                else if(now<=n) ++ans, --oct;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SovietPower/p/9721740.html
今日推荐