原文链接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; }
#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; }
#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; }
#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; }
#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; }
扫描二维码关注公众号,回复:
2859014 查看本文章