牛客网暑期ACM多校训练营(第十场) 体验记

原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10.html

榜?

  tmd我们队就我一个人签到了,还要什么榜?

故事?

  tmd我们队就我一个人签到了,还要什么故事?

  tmd H 题拖了类欧板子,想了个sb三分,后来看不仅之前的代码漏洞百出,而且三分+类欧+__int128会TLE。

 

我觉得本次的题目非常有趣,但是写不写题解看心情。

UPDATING

 

部分代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005,mod=998244353;
int T,n,m;
LL a[N];
LL Pow(LL x,LL y){
    LL ans=1;
    for (;y;y>>=1,x=x*x%mod)
        if (y&1)
            ans=ans*x%mod;
    return ans;
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&m);
        int pw=Pow(2,1LL*n*m);
        a[0]=0;
        for (int i=1;i<=n;i++)
            scanf("%lld",&a[i]),a[i]+=a[i-1];
        for (int i=1;i<=m;i++){
            int t,L,R;
            scanf("%d%d%d",&t,&L,&R);
            if (t==1)
                continue;
            int x=(a[R]-a[L-1])%mod;
            x=1LL*x*pw%mod;
            printf("%d\n",x);
        }
    }
    return 0;
}
A
#include <bits/stdc++.h>
using namespace std;
const int N=200005,mod=998244353;
int read(){
    int x=0;
    char ch=getchar();
    while (!isdigit(ch))
        ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
int Pow(int x,int y){
    int ans=1;
    for (;y;y>>=1,x=1LL*x*x%mod)
        if (y&1)
            ans=1LL*ans*x%mod;
    return ans;
}
int T,n,m;
struct Point{
    int x,k,v;
    Point(){}
    Point(int _x,int _y,int _v){
        x=_x,k=_y,v=_v;
    }
}o[N];
int ocnt,k;
int Fac[N],Inv[N];
int C(int n,int m){
    if (m<0||m>n)
        return 0;
    return 1LL*Fac[n]*Inv[m]%mod*Inv[n-m]%mod;
}
void add(int &x,int y){
    x+=y;
    if (x>=mod)
        x-=mod;
}
int solve(int x){
    k+=2;
    int res=0;
    for (int i=1;i<=ocnt;i++)
        if (o[i].x<x)
            res=(1LL*o[i].v*C(k-o[i].k+x-o[i].x-1,k-o[i].k-1)+res)%mod;
        else if (o[i].x==x)
            add(res,o[i].v);
    k-=2;
    return res;
}
int main(){
    Fac[0]=Inv[0]=1;
    for (int i=1;i<N;i++){
        Fac[i]=1LL*Fac[i-1]*i%mod;
        Inv[i]=Pow(Fac[i],mod-2);
    }
    scanf("%d",&T);
    while (T--){
        n=read(),m=read();
        ocnt=0,k=-1;
        for (int i=1;i<=m;i++){
            int opt=read(),L,R,v;
            if (opt==2){
                k++;
                continue;
            }
            L=read(),R=read();
            if (opt==1){
                v=read();
                o[++ocnt]=Point(L,k,v);
                o[++ocnt]=Point(R+1,k,(mod-v)%mod);
            }
            if (opt==3)
                printf("%d\n",(solve(R)-solve(L-1)+mod)%mod);
        }
    }
    return 0;
}
D
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=505,mod=998244353;
int read(){
    int x=0;
    char ch=getchar();
    while (!isdigit(ch))
        ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x;
}
int T,n,f[N],d[N][N],dis[N];
LL g[N][N],yg[N][N];
int cmpv_id;
bool cmp(int a,int b){
    return g[cmpv_id][a]<g[cmpv_id][b];
}
void Getdis(int x,int y){
    int k=0;
    memset(f,0,sizeof f);
    int v1=1,v2=1;
    while (1){
        while (v1<=n&&f[d[x][v1]])
            v1++;
        while (v2<=n&&f[d[y][v2]])
            v2++;
        if (v1>n&&v2>n)
            break;
        if (v1>n){
            f[d[y][v2]]=1;
            dis[++k]=g[y][d[y][v2++]];
        }
        else if (v2>n){
            f[d[x][v1]]=1;
            dis[++k]=g[x][d[x][v1++]];
        }
        else if (g[x][d[x][v1]]<=g[y][d[y][v2]]){
            f[d[x][v1]]=1;
            dis[++k]=g[x][d[x][v1++]];
        }
        else {
            f[d[y][v2]]=1;
            dis[++k]=g[y][d[y][v2++]];
        }
    }
}
void solve(){
    n=read();
    int tot=0;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            yg[i][j]=g[i][j]=read(),tot=(tot+g[i][j])%mod;
    tot=1LL*tot*((mod+1)/2)%mod;
    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++)
            d[i][j]=j;
        cmpv_id=i;
        sort(d[i]+1,d[i]+n+1,cmp);
    }
    int ans=0,e=n*(n-1)/2;
    for (int x=1;x<=n;x++)
        for (int y=x+1;y<=n;y++){
            Getdis(x,y);
//            printf("(%d,%d)\n",x,y);
//            for (int i=1;i<=n;i++)printf("%d ",dis[i]);puts("");
            ans=(1LL*(e-1)*yg[x][y]+ans)%mod;
            ans=((ans+tot-yg[x][y])%mod+mod)%mod;
            for (int i=1;i<=n;i++)
                ans=(2LL*dis[i]*(n-i)+ans)%mod;
        }
    ans=1LL*ans*((mod+1)/2)%mod;
    printf("%d\n",ans);
}
int main(){
    T=read();
    while (T--)
        solve();
    return 0;
}
F
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
typedef long long LL;
typedef __int128 LLL;
LL f(LL a,LL b,LL c,LL n){
    if (a==0)
        return (b/c)%mod*((n+1)%mod)%mod;
    if (a>=c||b>=c)
        return ((LL)((LLL)a/c%mod*(n*(n+1)/2%mod))%mod
                    +(b/c)*(n+1)%mod+f(a%c,b%c,c,n))%mod;
    LL tmp=((LLL)a*n+b)/c;
    return (tmp%mod*n%mod-f(c,c-b-1,a,tmp-1)+mod)%mod;
}
LL T,a,b,c,d;
void write(LLL x){
    if (x<0){
        putchar('-');
        x=-x;
    } 
    if (x>9)
        write(x/10);
    putchar('0'+x%10);
}
LL calc(LL x){
    return (f(c,c,d,x)-f(a,0,b,x)+x+1+mod)%mod;
}
int main(){
    scanf("%lld",&T);
    while (T--){
        scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
        if (a*d==b*c){
            puts("-1");
            continue;
        }
        if (a*d<b*c)
            swap(a,c),swap(b,d);
        printf("%lld\n",calc((c+d)*b/(d*a-c*b)));
    }
    return 0;
}
H
#include <bits/stdc++.h>
using namespace std;
const int N=1000005;
int T,n;
int ans[N],last[26],Next[N][26];
char s[N];
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        memset(last,0,sizeof last);
        memset(Next,0,sizeof Next);
        int tot=0;
        while (n--){
            scanf("%s",s+1);
            int len=strlen(s+1);
            int i,x=0;
            for (i=1;i<=len;i++){
                if (!Next[x][s[i]-'a'])
                    break;
                x=Next[x][s[i]-'a'];
            }
            for (int j=i;j<=len;j++){
                int p=last[s[j]-'a'];
                ans[++tot]=s[j]-'a';
                for (int k=p;k<tot;k++)
                    Next[k][s[j]-'a']=tot;
                last[s[j]-'a']=tot;
            }
        }
        for (int i=1;i<=tot;i++)
            printf("%c",'a'+ans[i]);
        puts("");
    }
    return 0;
}
J
扫描二维码关注公众号,回复: 2859014 查看本文章

部分题解

猜你喜欢

转载自www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10.html