【NOIP2017】Day1代码

T1 math

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

typedef long long LL;
LL a,b,x,y;
LL tmp,ans;

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

    scanf("%lld%lld",&a,&b);
    if(a>b)
        swap(a,b);
    tmp=(a-1)*a-1;
    ans=tmp+1ll*(b-(a+1))*(a-1);

    printf("%lld\n",ans);

    return 0;
}

T2 Complexity

#include<bits/stdc++.h>
using namespace std;

int Stack[200];
char Stack2[200],tmp[20];
int tail;
bool defined[30];

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

    int t;
    scanf("%d", &t);
    for(int i = 1; i <= t; i++)
    {
        memset(defined, 0, sizeof(defined));
        int l;
        char O[20];
        int w;
        scanf("%d O(%s", &l, &O);
        if(O[0] == '1')
            w = 0;
        else
        {
            w = 0;
            int len = strlen(O);
            for(int j = 2; j < len-1; j++)
            {
                w*=10;
                w+=O[j]-'0';
            }
        }
        tail=0;
        int cur =0,ans=0;
        for(int j = 1; j <= l; j++)
        {
            gets(tmp); //get'\n'
            char c;
            scanf("%c", &c);
            if(c == 'F')
            {
                char st[10],en[10],name;
                scanf(" %c %s %s", &name, &st, &en);
                if(defined[name - 'a'])
                {
                    tail = -1;
                    while(j <= l)
                    {
                        gets(tmp);
                        j++;
                    }
                    break;
                }
                defined[name-'a']=true;
                Stack2[tail]=name;
                Stack[tail++]=(st[0] == 'n' && en[0] == 'n') || (st[0] != 'n' && en[0] != 'n') ? 0 : 1;
                if(st[0] == 'n' && en[0] != 'n')
                    Stack[tail-1] = -20000;
                if(st[0] != 'n' && en[0] != 'n')
                {
                    int stnum = 0, ennum = 0;
                    int len = strlen(st);
                    for(int k = 0; k < len; k++)
                    {
                        stnum *= 10;
                        stnum += st[k] - '0';
                    }
                    len = strlen(en);
                    for(int k = 0; k < len; k++)
                    {
                        ennum *= 10;
                        ennum += en[k] - '0';
                    }
                    if(stnum > ennum)
                        Stack[tail-1] = -20000;
                }
                cur += Stack[tail-1];
                if(cur > ans)
                    ans = cur;
            }
            else
            {
                cur -= Stack[--tail];
                defined[Stack2[tail]-'a']=false;
                if(tail < 0)
                {
                    while(j <= l)
                    {
                        gets(tmp);
                        j++;
                    }
                    break;
                }
            }
        }
        if(tail!=0)
            printf("ERR\n");
        else
        {
            if(ans == w)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    return 0;
}

T3 Park

#include<bits/stdc++.h>
using namespace std;

const int MAXN=1e5+10;

int n,m,k,p,T,num;
int cnt,fcnt,lingcnt;
int que[MAXN],inq[MAXN],f[60][MAXN];
int head[MAXN],fhead[MAXN],linghead[MAXN];
int dis[MAXN],dis2[MAXN];
bool flag;

struct edge
{
    int v,nex,w;
}e[MAXN<<1],fe[MAXN<<1],ling[MAXN<<1];

inline void add(int u,int v,int w)
{
    e[++cnt]=(edge){v,head[u],w};
    head[u]=cnt;
}

inline void addf(int u,int v,int w)
{
    fe[++fcnt]=(edge){v,fhead[u],w};
    fhead[u]=fcnt;
}

inline void addling(int u,int v)
{
    ling[++lingcnt]=(edge){v,linghead[u],0};
    linghead[u]=lingcnt;
}

struct hnd
{
    int u,d;
    bool operator<(const hnd&A)const
    {
        return d>A.d;
    }
};
priority_queue<hnd>q;

inline void dij(int n)
{
    dis[n]=0;
    q.push((hnd){n,dis[n]});
    while(!q.empty())
    {
        hnd x=q.top();q.pop();
        int u=x.u;
        if(x.d!=dis[u])continue;
        for(int i=head[u];i;i=e[i].nex)
        {
            int v=e[i].v,w=e[i].w;
            if(dis[u]+w<dis[v])
            {
                dis[v]=dis[u]+w;
                q.push((hnd){v,dis[v]});
            }
        }
    }
}

inline void dij2(int n)//in fact we can merge it with dij
{
    dis2[n]=0;
    q.push((hnd){n,dis2[n]});
    while(!q.empty())
    {
        hnd x=q.top();q.pop();
        int u=x.u;
        if(x.d!=dis2[u])
            continue;
        for(int i=fhead[u];i;i=fe[i].nex)
        {
            int v=fe[i].v,w=fe[i].w;
            if(dis2[u]+w<dis2[v])
            {
                dis2[v]=dis2[u]+w;
                q.push((hnd){v,dis2[v]});
            }
        }
    }
}

inline void topsort()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j;j=e[j].nex)
        {
            int v=e[j].v,w=e[j].w;
            if(!w)
            {
                addling(i,v);
                inq[v]++;   
            }
        }
    }
    for(int i=1;i<=n;i++)
        if(!inq[i])
            que[++num]=i;

    for(int i=1;i<=num;i++)
    {
        int u=que[i];
        for(int j=linghead[u];j;j=ling[j].nex)
        {
            int v=ling[j].v;
            inq[v]--;
            if(!inq[v])
                que[++num]=v;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(inq[i]&&dis[i]+dis2[i]<=dis[n]+k)
        {
            printf("-1\n");
            flag=1;
            return;
        }
    }
}

inline int dp()
{
    memset(ling,0,sizeof(ling));
    memset(linghead,0,sizeof(linghead));
    memset(que,0,sizeof(que));
    lingcnt=0,num=0;

    for(int i=1;i<=n;i++)
        for(int j=head[i];j;j=e[j].nex)
        {
            int v=e[j].v,w=e[j].w;
            if(w+dis[i]==dis[v])
            {
                inq[v]++;
                addling(i,v);
            }
        }

    for(int i=1;i<=n;i++)
        if(!inq[i])
            que[++num]=i;
    for(int i=1;i<=num;i++)
    {
        int u=que[i];
        for(int j=linghead[u];j;j=ling[j].nex)
        {
            int v=ling[j].v;
            inq[v]--;
            if(!inq[v])
                que[++num]=v;
        }
    }

    f[0][1]=1;
    for(int i=0;i<=k;i++)
    {
        for(int x=1;x<=num;x++)
        {
            int u=que[x];
            for(int z=head[u];z;z=e[z].nex) 
            {
                int v=e[z].v,w=e[z].w;
                int tmp=i+dis[u]+w-dis[v];
                if(tmp<=k) 
                    f[tmp][v]=(f[tmp][v]+f[i][u])%p;
            }
        }
    }

    int ans=0;
    for(int i=0;i<=k;i++) 
        ans=(ans+f[i][n])%p;
    return ans;
}

inline void _reset()
{
    memset(e,0,sizeof(e));
    memset(fe,0,sizeof(fe));
    memset(dis,0x3f,sizeof(dis));
    memset(dis2,0x3f,sizeof(dis2));
    memset(f,0,sizeof(f));
    memset(head,0,sizeof(head));
    memset(fhead,0,sizeof(fhead));
    memset(ling,0,sizeof(ling));
    memset(linghead,0,sizeof(linghead));
    memset(que,0,sizeof(que));
    memset(inq,0,sizeof(inq));
    lingcnt=0,cnt=0,fcnt=0,num=0;
    flag=0;
}

inline void work()
{
    _reset();

    scanf("%d%d%d%d",&n,&m,&k,&p);
    for(int i=1;i<=m;i++)
    {
        int tem1,tem2,tem3;
        scanf("%d%d%d",&tem1,&tem2,&tem3);
        add(tem1,tem2,tem3);
        addf(tem2,tem1,tem3);
    }

    dij(1);
    dij2(n);
    topsort();
    if(!flag)
        printf("%d\n",dp());
}

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

    scanf("%d",&T);
    while(T--)
        work();

    return 0; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值