美文网首页
2017年沈阳网络赛

2017年沈阳网络赛

作者: _弓长_大人 | 来源:发表于2018-09-25 12:47 被阅读14次

    2017 沈阳网络赛 04 Array array array

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int N=1e5+5;
    const int INF=1e9;
    int a[N];
    int dp[N];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t—)
        {
            int n,k;
            scanf("%d%d",&n,&k);
            for(int i=0;i<n;i++)
                scanf("%d",a+i);
            fill(dp,dp+n,INF);
            for(int i=0;i<n;i++)
                *lower_bound(dp,dp+n,a[i])=a[i];
            int x=lower_bound(dp,dp+n,INF)-dp;
            fill(dp,dp+n,INF);
            reverse(a,a+n);
            for(int i=0;i<n;i++)
                *lower_bound(dp,dp+n,a[i])=a[i];
            int y=lower_bound(dp,dp+n,INF)-dp;
            if((n-x<=k&&n>k)||(n-y<=k&&n>k))
                puts("A is a magic array.");
            else
                puts("A is not a magic array.");
        }
        return 0;
    }
    
    

    2017 沈阳网络赛 08 transaction transaction transaction

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define MAX 200005
    typedef long long ll;
    int len[MAX];
    bool vis[MAX];
    int num[MAX];
    int n,m;
    struct Node
    {
    int v,u;
    int id;
    };
    Node node[MAX];
    int head[MAX];
    int cnt=0;
    int top=0;
    int a,b;
    int c;
    int ans=0;
    void init()
    {
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        memset(len,0,sizeof(len));
        cnt=0;
        top=0;
    }
    void add_e(int u,int v,int id)
    {
        node[cnt].v=v;
        node[cnt].u=head[u];
        node[cnt].id=id;
        head[u]=cnt++;
    }
    int dfs(int j)
    {
          for(int i=head[j];i!=-1;i=node[i].u)
        {
            if(!vis[i])
            {
              vis[i]=true;
              len[j]=max(len[j]-node[i].id+dfs(node[i].v),len[j]-node[i].id+num[node[i].v]);
            }
        }
        ans=max(len[j]-num[j],ans);
        return len[j];
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            init();
            ans=0;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&num[i]);
            }
            for(int i=0;i<n-1;i++)
            {
                // 无向图
               scanf("%d%d%d",&a,&b,&c);
                add_e(a,b,c);
                add_e(b,a,c);
            }
            for(int i=1;i<=n;i++)
            {
                dfs(i);
            }
       printf("%d\n",ans);
        }
        return 0;
    }
    

    2017 沈阳 网络赛 05 number number number

    #include <iostream>
    #include <cstddef>
    #include <cstring>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const int mod=998244353;
    typedef vector<ll> vec;
    typedef vector<vec> mat;
    mat mul(mat &a,mat &b)//表示不会这样用,,,,
    {
        mat c(a.size(),vec(b[0].size()));
        for(int i=0; i<2; i++)
        {
            for(int j=0; j<2; j++)
            {
                for(int k=0; k<2; k++)
                {
                    c[i][j]+=a[i][k]*b[k][j];
                    c[i][j]%=mod;
                }
            }
        }
        return c;
    }
    mat pow(mat a,ll n)
    {
        mat res(a.size(),vec(a.size()));
        for(int i=0; i<a.size(); i++)
            res[i][i]=1;//单位矩阵;
        while(n)
        {
            if(n&1) res=mul(res,a);
            a=mul(a,a);
            n/=2;
        }
        return res;
    }
    ll solve(ll n)
    {
        mat a(2,vec(2));
        a[0][0]=1;
        a[0][1]=1;
        a[1][0]=1;
        a[1][1]=0;
        a=pow(a,n);
        return a[0][1];//也可以是a[1][0];
    }
    int main()
    {
        ll n;
        int k;
        while(cin>>n&&n!=-1)
        {
            k=(5+(n-1)*2);
            cout<<(solve(k)-1+998244353)%998244353<<endl;
        }
        return 0;
    }
    

    2017 沈阳网络赛01 string string string

    #include<cstdio>
    #include<cstring>
    #include<deque>
    #include<algorithm>
    #include<string>
    #include<unordered_map>
    using namespace std;
    const int T=1e5+1000;
    char s[T];
    int t1[T],t2[T],cc[T],x[T],sa[T],Rank[T],height[T];
    int len,k;
    bool cmp(int *y,int a,int b,int k)
    {
        int a1=y[a];
        int b1=y[b];
        int a2=a+k>=len ? -1:y[a+k];
        int b2=b+k>=len ? -1:y[b+k];
        return a1==b1 && a2==b2;
    }
    int make_sa()
    {
        int *x=t1,*y=t2;
        int m=26;
        for(int i=0; i<m; i++) cc[i]=0;
        for(int i=0; i<len; i++) ++cc[x[i]=s[i]-'a'];
        for(int i=1; i<m; i++) cc[i]+=cc[i-1];
        for(int i=len-1; i>=0; i--) sa[--cc[x[i]]]=i;
        for(int k=1; k<=len; k<<=1)
        {
            int p=0;
            for(int i=len-k; i<len; i++) y[p++]=i;
            for(int i=0; i<len; i++)
               if( sa[i]>=k ) y[p++]=sa[i]-k;
            for(int i=0; i<m; i++) cc[i]=0;
            for(int i=0; i<len; i++) ++cc[x[y[i]]];
            for(int i=1; i<m; i++) cc[i]+=cc[i-1];
            for(int i=len-1; i>=0; i--) sa[--cc[x[y[i]]]]=y[i];
            swap(x,y);
            m=1; x[sa[0]]=0;
            for(int i=1; i<len; i++)
              x[sa[i]]=cmp(y,sa[i],sa[i-1],k) ? m-1:m++;
            if( m>=len ) break;
        }
    }
    void make_height()
    {
        for(int i=0; i<len; i++) Rank[sa[i]]=i;
        height[0]=0;
        int k=0;
        for(int i=0; i<len; i++)
        {
            if(!Rank[i]) continue;
            int j=sa[Rank[i]-1];
            if(k) k--;
            while(s[i+k]==s[j+k]) k++;
            height[Rank[i]]=k;
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&k);
            scanf("%s",s);
            len=strlen(s);
            make_sa();
            make_height();
            long long int ans=0ll;
            if(k==1)
            {
                for(int i=0;i<len;i++)
                {
                    if(i>0&&i<len-1)
                    {
                        int tmp=max(height[i],height[i+1]);
                        ans+=len-sa[i]-tmp;
                    }
                    else if(i==len-1)
                        ans+=len-sa[i]-height[i];
                    else
                        ans+=len-sa[i]-height[i+1];
                }
                printf("%lld\n",ans);
                continue;
            }
            deque<int> Q;
            for(int i=0;i<k-1;i++)
            {
                while(!Q.empty()&&height[i]<=height[Q.back()]) Q.pop_back();
                Q.push_back(i);
            }
            for(int i=0;i<len-k+2;i++)
            {
                while(!Q.empty()&&height[i+k-2]<=height[Q.back()]) Q.pop_back();
                Q.push_back(i+k-2);
                while(Q.front()<i) Q.pop_front();
                int Min=height[Q.front()];
                if(i==0)
                {
                    if(Min>height[i+k-1])
                        ans+=Min-height[i+k-1];
                }
                else if(i==len-k+1)
                {
                    if(Min>height[i-1])
                        ans+=Min-height[i-1];
                }
                else
                {
                    if(Min>height[i+k-1]&&Min>height[i-1])
                        ans+=Min-max(height[i-1],height[i+k-1]);
                }
            }
            printf("%lld\n",ans);
        }
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:2017年沈阳网络赛

          本文链接:https://www.haomeiwen.com/subject/sudtsxtx.html