1. 程式人生 > 其它 >8.3模擬賽

8.3模擬賽

 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(int
i=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 }