NOIP模拟10.31

来源:互联网 发布:上海1943和老街知乎 编辑:程序博客网 时间:2024/06/12 20:21

2016提高D1
A.玩具谜题。(我写过的第一道正式的oi题hh)AC
B.天天爱跑步。这我哪会啊。。水了45。正解待更新
C.换教室。一觉醒来已经快结束了hh,水了24(4)分就。。太弱了

A

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,a[N],ans=0;char s[N][20];int main(){//  freopen("a1.in","r",stdin);    n=read();m=read();    for(int i=0;i<n;++i){a[i]=read();scanf("%s",s[i]+1);}    while(m--){        int op=read(),x=read();        if(a[ans]^op) ans=(ans+x)%n;        else ans=(ans-x+n)%n;    }printf("%s",s[ans]+1);    return 0;}

B

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 300010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int ans[N],n,m,a[N],dep[N],fa[N][20],h[N],num=0,Log[N];struct edge{    int to,next;}data[N<<1];void dfs(int x){    for(int i=1;i<=n;++i){        if(!fa[x][i-1]) break;        fa[x][i]=fa[fa[x][i-1]][i-1];    }    for(int i=h[x];i;i=data[i].next){        int y=data[i].to;if(y==fa[x][0]) continue;        fa[y][0]=x;dep[y]=dep[x]+1;dfs(y);    }}void dfs1(int x){    for(int i=h[x];i;i=data[i].next){        int y=data[i].to;if(y==fa[x][0]) continue;        fa[y][0]=x;dep[y]=dep[x]+1;dfs1(y);ans[x]+=ans[y];    }}void solve0(){    while(m--){        int x=read(),y=read();ans[y]++;    }dfs1(1);    for(int i=1;i<=n;++i) if(a[i]!=dep[i]) printf("%d ",0);else printf("%d ",ans[i]);}inline int lca(int x,int y){    if(dep[x]<dep[y]) swap(x,y);    int t=dep[x]-dep[y];    for(int i=Log[t];i>=0;--i)        if(t&(1<<i)) x=fa[x][i];    if(x==y) return x;    for(int i=Log[n];i>=0;--i)        if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];    return fa[x][0];}int main(){//  freopen("b1.in","r",stdin);    n=read();m=read();Log[0]=-1;    for(int i=1;i<=n;++i) Log[i]=Log[i>>1]+1;    for(int i=1;i<n;++i){        int x=read(),y=read();        data[++num].to=y;data[num].next=h[x];h[x]=num;        data[++num].to=x;data[num].next=h[y];h[y]=num;    }for(int i=1;i<=n;++i) a[i]=read();    if(n%10==5){solve0();return 0;}dfs(1);    while(m--){        int x=read(),y=read(),now=0,t=lca(x,y);        while(x!=t){if(a[x]==now) ans[x]++;now++;x=fa[x][0];}        if(a[t]==now) ans[t]++;now+=dep[y]-dep[t];        while(y!=t){if(a[y]==now) ans[y]++;now--;y=fa[y][0];}    }for(int i=1;i<=n;++i) printf("%d ",ans[i]);    return 0;}

C

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 2010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,v,e,mp[310][310],c[N],d[N];double p[N],ans=0;int main(){//  freopen("a.in","r",stdin);    n=read();m=read();v=read();e=read();    for(int i=1;i<=n;++i) c[i]=read();    for(int i=1;i<=n;++i) d[i]=read();    for(int i=1;i<=n;++i) scanf("%lf",&p[i]);memset(mp,inf,sizeof(mp));    while(e--){        int x=read(),y=read();mp[x][y]=mp[y][x]=min(mp[x][y],read());    }for(int i=1;i<=n;++i) mp[i][i]=0;    for(int k=1;k<=v;++k)        for(int i=1;i<=v;++i)            for(int j=1;j<=v;++j)                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);    if(m==0) for(int i=2;i<=n;++i) ans+=mp[c[i-1]][c[i]];    printf("%.2f\n",ans);    return 0;}