【noip2012】d1解题报告

本来是想noip前把往年真题全做完的,总有这么几道不好做,这是出发前写的,如有不周请多包涵……

NOIP2017 rp++!

t1: Vigenère 密码

纯模拟

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[110],b[1010],c[1010];
int lena,lenb,jian[110];
int main()
{
    scanf("%s",a+1),scanf("%s",b+1);
    lena=strlen(a+1),lenb=strlen(b+1);
    for(int i=1;i<=lena;i++)
    {
        if(a[i]>='A'&&a[i]<='Z')
            jian[i]=a[i]-'A';
        else if(a[i]>='a'&&a[i]<='z')
            jian[i]=a[i]-'a';
    }
    int x=0;
    for(int i=1;i<=lenb;i++)
    {
        x=(i-1)%lena+1;
        c[i]=(b[i]-jian[x]);
        if(b[i]>='A'&&b[i]<='Z'&&(c[i]<'A'||c[i]>'Z'))
            c[i]+=26;
        if(b[i]>='a'&&b[i]<='z'&&(c[i]<'a'||c[i]>'z'))
            c[i]+=26;
        cout<<c[i];
    }
}

t2:国王游戏

贪心证明见:http://www.cnblogs.com/Loi-dfkdsmbd/p/7770543.html

这次是打的高精版2333333

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long lo;
struct in
{
    lo a,b,c;
}ter[1010];
lo n,l[20020],ans[20020],lin[20020];
bool cmp(in a,in b)
{
    return a.c<b.c;
}
inline void re(lo &a)
{
    a=0;
    char b=getchar();
    while(b<'0'||b>'9')
        b=getchar();
    while(b>='0'&&b<='9')
        a=a*10+b-'0',b=getchar();
}
inline void cheng(lo x)
{
    for(int i=1;i<=l[0];i++)
        l[i]*=x;
    for(int i=1;i<=l[0]+4;i++)
    {
        l[i+1]+=l[i]/10;
        l[i]%=10;
        if(l[i])
            l[0]=max(l[0],(lo)i);
    }
}
inline void chu(lo x)
{
    memset(lin,0,sizeof(lin));
    lo qwq=0;
    for(int i=l[0];i>=1;i--)
    {
        qwq=qwq*10+l[i];
        lin[i]=qwq/x;
        if(lin[i])
            lin[0]=max(lin[0],(lo)i);
        qwq%=x;
    }
}
bool check()
{
    if(ans[0]>lin[0])
        return 0;
    else if(ans[0]<lin[0])
        return 1;
    else
    {
        for(int i=lin[0];i>=1;i--)
        {
            if(lin[i]>ans[i])
                return 1;
            if(lin[i]<ans[i])
                return 0;
        }
    }
}
inline void fu()
{
    ans[0]=lin[0];
    for(int i=lin[0];i>=1;i--)
        ans[i]=lin[i];
}
int main()
{
    re(n);
    for(int i=0;i<=n;i++)
        re(ter[i].a),re(ter[i].b),ter[i].c=ter[i].a*ter[i].b;
    sort(ter+1,ter+1+n,cmp);
    l[0]=l[1]=1;
    for(int i=1;i<=n;i++)
    {
        cheng(ter[i-1].a);
        chu(ter[i].b);
        if(check())
            fu();
    for(int i=ans[0];i>=1;i--)
        cout<<ans[i];
}

 

t3:开车旅行

dalao一眼平衡树,我看过题解后打了个倍增

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long lo;
int n,m;
struct in
{
    lo g;
    int l,r,y;
    bool operator <(const in &a)const
    {
        return g<a.g;
    }
}ter[100010];
lo qwq,xa,ya;
double mi=1000000007;
int ax[100010],bx[100010],p[100010],x,l,r,ans;
lo f[100010][20],va[100010][20],vb[100010][20];
inline bool check()
{
    if(!l)
        return 0;
    if(!r)
        return 1;
    return ter[x].g-ter[l].g<=ter[r].g-ter[x].g;
}
inline int pd(int a,int b)
{
    if(!a)
        return ter[b].y;
    if(!b)
        return ter[a].y;
    if(ter[x].g-ter[a].g<=ter[b].g-ter[x].g)
        return ter[a].y;
    return ter[b].y;
}
inline void make_st()
{
    for(int i=1;i<=log2(n);i++)
        for(int j=1;j<=n;j++)
        {
            f[j][i]=f[f[j][i-1]][i-1];
            va[j][i]=va[j][i-1]+va[f[j][i-1]][i-1];
            vb[j][i]=vb[j][i-1]+vb[f[j][i-1]][i-1];
        }
}
inline void ask(lo yong,int a)
{
    xa=ya=0;
    for(int i=log2(n);i>=0;i--)
    {
        if(f[a][i]&&xa+ya+va[a][i]+vb[a][i]<=yong)
            xa+=va[a][i],ya+=vb[a][i],a=f[a][i];
    }
    if(ax[a]&&xa+ya+va[a][0]<=yong)
        xa+=va[a][0];
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&ter[i].g),ter[i].y=i;
    sort(ter+1,ter+1+n);
    for(int i=1;i<=n;i++)
        p[ter[i].y]=i;
    for(int i=1;i<=n;i++)
        ter[i].l=i-1,ter[i].r=i+1;
    ter[1].l=ter[n].r=0;
    for(int i=1;i<=n;i++)
    {
        x=p[i],l=ter[x].l,r=ter[x].r;
        if(check())
            bx[i]=ter[l].y,ax[i]=pd(ter[l].l,r);
        else
            bx[i]=ter[r].y,ax[i]=pd(l,ter[r].r);
        if(l)
            ter[l].r=r;
        if(r)
            ter[r].l=l;
    }
    for(int i=1;i<=n;i++)
    {
        f[i][0]=bx[ax[i]];
        va[i][0]=abs(ter[p[i]].g-ter[p[ax[i]]].g);
        vb[i][0]=abs(ter[p[ax[i]]].g-ter[p[f[i][0]]].g);
    }
    make_st();
    scanf("%lld",&qwq);
    for(int i=1;i<=n;i++)
    {
        ask(qwq,i);
        if(ya&&xa*1.0/ya<mi)
            mi=xa*1.0/ya,ans=i;
    }
    cout<<ans<<'\n';
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%lld",&l,&qwq);
        ask(qwq,l);
        cout<<xa<<' '<<ya<<'\n';
    }
}

 

posted @ 2017-11-10 07:00  那一抹落日的橙  阅读(242)  评论(0编辑  收藏  举报