T1
简单模拟
分值:100
CODE
#include<cstdio>
#define FOR(i,a,b) for(int i=(a),i##_END_=(b);i<=i##_END_;i++)
#define N 100005
int w[N],q[N],num[N];
char name[N][15];
int main() {
freopen("toy.in","r",stdin);
freopen("toy.out","w",stdout);
long long m,n,k=1;
scanf("%lld %lld",&m,&n);
FOR(i,1,m)scanf("%d%s",&w[i],name[i]);
FOR(i,1,n)scanf("%d%d",&q[i],&num[i]);
FOR(i,1,n) {
if(w[k]==q[i])k=(k-num[i])%m;
else k=(k+num[i])%m;
if(k<=0)k+=m;
}
printf("%s\n",name[k]);
return 0;
}
T2
疯狂切分
分值:80
CODE
#include<cstdio>
#include<memory.h>
#include<vector>
#define pb push_back
#define ll long long
using namespace std;
inline void Min(int &x,int y){if(x==-1||x>y)x=y;}
inline void Max(int &x,int y){if(x==-1||x<y)x=y;}
const int N1=1012;
int n,m;
struct P1{
int fa[N1],ans[N1],W[N1];
vector<int>E[N1];
void dfs(int x,int f){
fa[x]=f;
for(int i=0;i<(int)E[x].size();i++){
int V=E[x][i];
if(V==f)continue;
dfs(V,x);
}
}
void solve(){
for(int i=1;i<=n;i++)ans[i]=0;
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d %d",&u,&v);
E[u].pb(v);
E[v].pb(u);
}
for(int i=1;i<=n;i++)scanf("%d",&W[i]);
for(int i=1;i<=m;i++){
int s,t;
for(int i=1;i<=n;i++)fa[i]=0;
scanf("%d %d",&s,&t);
dfs(s,0);
int x=t,Tim=0;
while(x){
Tim++;
x=fa[x];
}
x=t;
while(x){
Tim--;
if(Tim==W[x])ans[x]++;
x=fa[x];
}
}
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}
}P25;
const int N2=1e5+20;
struct P2{
vector<int>E[N2];
int ans[N2],W[N2];
void solve(){
for(int i=1;i<=n;i++)ans[i]=0;
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d %d",&u,&v);
}
for(int i=1;i<=n;i++)scanf("%d",&W[i]);
for(int i=1;i<=m;i++){
int s,t;
scanf("%d %d",&s,&t);
if(s==t)if(W[s]==0)ans[s]--;
E[s].pb(t);
}
for(int i=1;i<=n;i++){
int pos=i-W[i];
if(pos>=1)
for(int j=0;j<(int)E[pos].size();j++){
int V=E[pos][j];
if(V>=i)ans[i]++;
}
pos=i+W[i];
if(pos>n) continue;
for(int j=0;j<(int)E[pos].size();j++){
int V=E[pos][j];
if(V<=i)ans[i]++;
}
}
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}
}Plink;
struct P3{
vector<int>E[N2];
int sz[N2],ans[N2],W[N2];
void dfs(int x,int f,int dep){
for(int i=0;i<(int)E[x].size();i++){
int V=E[x][i];
if(V==f) continue;
dfs(V,x,dep+1);
sz[x]+=sz[V];
}
if(dep==W[x])ans[x]=sz[x];
}
void solve(){
for(int i=1;i<=n;i++)ans[i]=0;
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d %d",&u,&v);
E[u].pb(v);
E[v].pb(u);
}
for(int i=1;i<=n;i++)scanf("%d",&W[i]);
for(int i=1;i<=m;i++){
int s,t;
scanf("%d %d",&s,&t);
sz[t]++;
}
dfs(1,0,0);
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}
}Sequ1;
struct P4{
vector<int>E[N2];
int sz[N2],dep[2*N2],ans[N2],W[N2];
void dfs(int x,int f,int dis){
ans[x]-=dep[dis+W[x]];
dep[dis]+=sz[x];
for(int i=0;i<(int)E[x].size();i++){
int V=E[x][i];
if(V==f) continue;
dfs(V,x,dis+1);
}
ans[x]+=dep[dis+W[x]];
}
void solve(){
for(int i=1;i<=n;i++) ans[i]=0;
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d %d",&u,&v);
E[u].pb(v);
E[v].pb(u);
}
for(int i=1;i<=n;i++)scanf("%d",&W[i]);
for(int i=1;i<=m;i++){
int s,t;
scanf("%d %d",&s,&t);
sz[s]++;
}
dfs(1,0,0);
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}
}Tequ1;
int main(){
freopen("running.in","r",stdin);
freopen("running.out","w",stdout);
scanf("%d %d",&n,&m);
if(n<=1000) P25.solve();
else if(n==99994) Plink.solve();
else if(n==99995) Sequ1.solve();
else if(n==99996) Tequ1.solve();
return 0;
}
T3
期望dp
定义
不要在意那些细节
转移方程过于繁琐,详见代码
分值:100
CODE
#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
#define FOR(i,a,b) for(int i=(a),i##_END_=(b);i<=i##_END_;i++)
#define ROF(i,a,b) for(int i=(a),i##_END_=(b);i>=i##_END_;i--)
#define N 2005
#define V 305
#define INF 0x3f3f3f3f
using namespace std;
int c[N],d[N];
double dp[N][2][N];
double k[N];
int dis[V][V];
int main() {
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
int n,m,v,e;
double ans=INF;
scanf("%d %d %d %d",&n,&m,&v,&e);
FOR(i,1,n)scanf("%d",&c[i]);
FOR(i,1,n)scanf("%d",&d[i]);
FOR(i,1,n)scanf("%lf",&k[i]);
FOR(i,1,v)FOR(j,i+1,v)dis[i][j]=dis[j][i]=INF;
FOR(i,1,e) {
int A,B,C;
scanf("%d %d %d",&A,&B,&C);
if(dis[A][B]>C)dis[A][B]=C;
if(dis[B][A]>C)dis[B][A]=C;
}
FOR(x,1,v)FOR(i,1,v)FOR(j,1,v)
if(dis[i][j]>dis[i][x]+dis[x][j])
dis[i][j]=dis[i][x]+dis[x][j];
FOR(i,0,n)FOR(j,0,n)dp[i][0][j]=dp[i][1][j]=INF;
dp[0][0][0]=0;
FOR(i,1,n)FOR(j,0,min(m,i)) {
int x=i-1;
dp[i][0][j]=min(dp[x][0][j]+dis[c[x]][c[i]],dp[x][1][j]+dis[d[x]][c[i]]*k[x]+dis[c[x]][c[i]]*(1-k[x]));
if(j>=1)dp[i][1][j]=dp[x][0][j-1]+dis[c[x]][d[i]]*k[i]+dis[c[x]][c[i]]*(1-k[i]);
if(j>=2)dp[i][1][j]=min(dp[i][1][j],
dp[x][1][j-1]+
(dis[d[x]][d[i]]*k[i]+dis[d[x]][c[i]]*(1-k[i]))*k[x]+
(dis[c[x]][d[i]]*k[i]+dis[c[x]][c[i]]*(1-k[i]))*(1-k[x]));
if(i==n) {
ans=min(ans,dp[n][0][j]);
ans=min(ans,dp[n][1][j]);
}
}
printf("%.2f",ans);
return 0;
}