这题……暴力分也好足啊。

P1600 [NOIP2016 提高组] 天天爱跑步

**80分210+行代码占沙发** ```cpp #include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; struct Node { int to , next; }; Node e[200005]; int n , m; vector<int>map[100005]; int val2[100005] , opt2[100005]; int head[100005] , tot , deep[100005] , val4[100005] , num[200005]; void sol1() { int val[1005] , opt[1005]; for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); } memset(opt , 0 , sizeof(opt)); for(int i=1; i<=n; i++) scanf("%d",&val[i]); for(int i=1; i<=m; i++) { int x , y; scanf("%d%d",&x,&y); if(!val[x]) opt[x]++; } for(int i=1; i<=n; i++) printf("%d ",opt[i]); } void sol2() { int ans = 0 , opt[1005]; memset(opt , 0 , sizeof(opt)); for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); } for(int i=1; i<=n; i++) { int x; scanf("%d",&x); } for(int i=1; i<=m; i++) { int s , t; scanf("%d%d",&s,&t); opt[s]++; } for(int i=1; i<=n; i++) printf("%d ",opt[i]); } void sol3() { for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); } for(int i=1; i<=n; i++) scanf("%d",&val2[i]); for(int i=1; i<=n; i++) { int s , t; scanf("%d%d",&s,&t); map[s].push_back(t); } for(int i=1; i<=n; i++) { int ans = 0 , l = i - val2[i] , r = i + val2[i] , sz1 , sz2; if(l>0) { sz1 = map[l].size(); for(int j=0; j<sz1; j++) if(map[l][j]>=i) ans++; } if(r<=n) { sz2 = map[r].size(); for(int j=0; j<sz2; j++) if(map[r][j]<=i) ans++; } opt2[i] = ans; } for(int i=1; i<=n; i++) printf("%d ",opt2[i]); } void add(int x , int y) { tot++; e[tot].next = head[x]; e[tot].to = y; head[x] = tot; } void dfs(int u , int f) { for(int i=head[u]; i; i=e[i].next) { int v = e[i].to; if(v==f) continue; deep[v] = deep[u] + 1; dfs(v , u); num[u] += num[v]; } } void sol4() { for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); add(x , y); add(y , x); } for(int i=1; i<=n; i++) scanf("%d",&val4[i]); for(int i=1; i<=m; i++) { int s , t; scanf("%d%d",&s,&t); num[t]++; } deep[1] = 0; dfs(1 , 0); for(int i=1; i<=n; i++) { if(deep[i]==val4[i]) printf("%d ",num[i]); else printf("0 "); } } int dfs1(int u , int f , int aim , int dfn) { if(u==aim) { if(dfn==val2[u]) opt2[u]++; return 1; } for(int i=head[u]; i; i=e[i].next) { int v = e[i].to; if(v==f) continue; if(dfs1(v , u , aim , dfn+1)) { if(dfn==val2[u]) { opt2[u]++; } return 1; } } } void sol5() { for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); add(x , y); add(y , x); } for(int i=1; i<=n; i++) scanf("%d",&val2[i]); for(int i=1; i<=m; i++) { int s , t; scanf("%d%d",&s,&t); dfs1(s , 0 , t , 0); } for(int i=1; i<=n; i++) printf("%d ",opt2[i]); } void dfs2(int u , int f , int dep) { int temp = num[dep+val2[u]]; if(val4[u]) num[dep] += val4[u]; for(int i=head[u]; i; i=e[i].next) { int v = e[i].to; if(v == f) continue; dfs2(v , u , dep+1); } opt2[u] = num[dep+val2[u]] - temp; } void sol6() { for(int i=1; i<n; i++) { int x , y; scanf("%d%d",&x,&y); add(x , y); add(y , x); } for(int i=1; i<=n; i++) scanf("%d",&val2[i]); for(int i=1; i<=m; i++) { int s , t; scanf("%d%d",&s,&t); val4[s]++; } dfs2(1 , 0 , 0); for(int i=1; i<=n; i++) printf("%d ",opt2[i]); } int main() { scanf("%d%d",&n,&m); if(n%10==1) sol1(); if(n%10==2) sol2(); if(n%10==4) sol3(); if(n%10==5) sol4(); if(n%10==3) sol5(); if(n%10==6) sol6(); return 0; } ```
by 曹老师 @ 2018-10-19 20:19:44


tql
by wwz20050323 @ 2018-10-19 20:20:16


好腻害的样子qaq
by 皎月半洒花 @ 2018-10-19 20:20:44


dldl
by hfee @ 2018-10-19 20:21:10


@[皎月半洒花](/space/show?uid=28313) 花姐永远最强
by 曹老师 @ 2018-10-19 20:21:57


@[曹老师](/space/show?uid=37427) 别乱奶啊qaq
by 皎月半洒花 @ 2018-10-19 21:18:14


好厉害,——_——|||
by 逍遥_向尾喵 @ 2018-10-19 21:33:45


@[曹老师](/space/show?uid=37427) 码量好大啊
by qsmoonzh @ 2018-11-04 22:47:19


WA,居然还有这种东西 提示: 数据范围的个位上的数字可以帮助判断是哪一种数据类型。
by qsmoonzh @ 2018-11-04 22:48:08


(针对数据)就算啥也不会也能骗到80分,太给力了qwq ## ~~面向数据编程~~
by Thaumaturge @ 2019-07-05 20:38:19


|