8.3模擬賽
阿新 • • 發佈:2021-08-10
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5011,mod=1e9+7; 4 int n,m,dp[N][N],g[N][N]; 5 char s[N],t[N]; 6 int main() 7 { 8 scanf("%s",s+1); scanf("%s",t+1); 9 n=strlen(s+1),m=strlen(t+1); 10 g[0][0]=1; for(int i=1;i<=n;++i) g[0][i]=g[i][0]=1; 11 for(inti=1;i<=n;++i) for(int j=1;j<=m;++j) { 12 g[i][j]=0; 13 if(dp[i-1][j]<dp[i][j-1]) dp[i][j]=dp[i][j-1],g[i][j]=g[i][j-1]; 14 else if(dp[i-1][j]>dp[i][j-1]) dp[i][j]=dp[i-1][j],g[i][j]=g[i-1][j]; 15 else { 16 dp[i][j]=dp[i-1][j],g[i][j]=(g[i-1][j]+g[i][j-1])%mod; 17 if(dp[i-1][j-1]==dp[i][j-1]) (g[i][j]+=mod-g[i-1][j-1])%=mod; 18 } 19 20 // dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 21 // if(dp[i][j]==dp[i-1][j]) (g[i][j]+=g[i-1][j])%=mod; 22 // if(dp[i][j]==dp[i][j-1]) (g[i][j]+=g[i][j-1])%=mod; 23 // if(dp[i][j]==dp[i][j-1] && dp[i][j]==dp[i-1][j] && dp[i][j]==dp[i-`][j-1]) (g[i][j]+=mod-g[i-1][j-1])%=mod;24 25 if(s[i]==t[j]) { 26 if(dp[i][j]<dp[i-1][j-1]+1) dp[i][j]=dp[i-1][j-1]+1,g[i][j]=g[i-1][j-1]; 27 else if(dp[i][j]==dp[i-1][j-1]+1) (g[i][j]+=g[i-1][j-1])%=mod; 28 } 29 } 30 /* for(int i=1;i<=n;++i) { 31 for(int j=1;j<=m;++j) printf("%d ",dp[i][j]); 32 puts(""); 33 } 34 for(int i=1;i<=n;++i) { 35 for(int j=1;j<=m;++j) printf("%d ",g[i][j]); 36 puts(""); 37 } 38 */ 39 printf("%d\n",dp[n][m]); 40 printf("%d\n",g[n][m]); 41 return 0; 42 }
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=100011; 5 int n,q,tota,totb; 6 ll a[N],b[N]; 7 8 struct Node { 9 int pos,rank,num; 10 bool operator < (const Node &d) const { 11 return pos<d.pos; 12 } 13 }; 14 Node t[N]; 15 16 inline int dabs(int d) { return d>0?d:-d; } 17 18 int main() 19 { 20 int tm,op,dir,ans=0; 21 scanf("%d%d",&n,&q); 22 for(int i=1;i<=n;++i) { 23 scanf("%d%d",&t[i].pos,&dir); 24 t[i].num=i; 25 (dir) ? a[++tota]=t[i].pos : b[++totb]=t[i].pos; 26 } 27 sort(t+1,t+n+1); 28 for(int i=1;i<=n;++i) t[t[i].num].rank=i; 29 sort(a+1,a+tota+1); 30 sort(b+1,b+totb+1); 31 while(q--) { 32 scanf("%d%d",&tm,&op); 33 op=t[op].rank; 34 ll l=-2e9,r=2e9; 35 while(l<=r) { 36 ll mid=(l+r)>>1; 37 int res=upper_bound(a+1,a+tota+1,mid-tm)-a-1; 38 res+=upper_bound(b+1,b+totb+1,mid+tm)-b-1; 39 if(res>=op) ans=mid,r=mid-1; 40 else l=mid+1; 41 } 42 printf("%d\n",dabs(ans)); 43 } 44 return 0; 45 }
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const ll N=10011,M=5011,mod=1e9+7; 5 int n,to[N],nxt[N],edge,head[N]; 6 ll dp[M][M][2],tmp[N][2],sz[N],fac[N]; 7 8 inline int re_ad() { 9 char ch=getchar(); int x=0,f=1; 10 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 11 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 12 return x*f; 13 } 14 15 inline void addedge(int x,int y) { 16 ++edge,to[edge]=y,nxt[edge]=head[x],head[x]=edge; 17 } 18 19 void dfs(int d,int f,int x) { 20 for(int i=head[d];i;i=nxt[i]) { 21 int u=to[i]; 22 if(u==f) continue; 23 dfs(u,d,x^1); 24 if(!sz[d]) { 25 memcpy(dp[d],dp[u],sizeof(dp[d])); 26 sz[d]+=sz[u]; 27 continue; 28 } 29 memset(tmp,0,sizeof(tmp)); 30 for(int j=0;j<=sz[d];++j) for(int k=0;k<=sz[u];++k) { 31 (tmp[j+k][x^1]+=(dp[d][j][x^1]*dp[u][k][x^1])%mod)%=mod; 32 (tmp[j+k][x]+=(1ll*(dp[d][j][x^1]+dp[d][j][x])*(dp[u][k][x^1]+dp[u][k][x])%mod)-(1ll*dp[d][j][x^1]*dp[u][k][x^1]%mod))%=mod; 33 } 34 sz[d]+=sz[u]; 35 memcpy(dp[d],tmp,sizeof(dp[u])); 36 } 37 if(!sz[d]) ++sz[d],dp[d][0][0]=dp[d][1][1]=1; 38 } 39 40 int main() 41 { 42 int ex,ey; 43 n=re_ad(); 44 for(int i=1;i<=n-1;++i) ex=re_ad(),ey=re_ad(),addedge(ex,ey),addedge(ey,ex); 45 dfs(1,0,1); 46 int siz=sz[1]; 47 fac[0]=1; for(int i=1;i<=siz;++i) fac[i]=fac[i-1]*i%mod; 48 // for(int i=0;i<=siz;++i) printf("%lld ",fac[i]); puts(""); 49 ll ans=0; 50 for(int i=0;i<=siz;++i) (ans+=(1ll*fac[i]*fac[siz-i])%mod*dp[1][i][1]%mod)%=mod; 51 printf("%lld\n",ans); 52 return 0; 53 }