ZOJ Monthly, August 2014

H Machine http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337

树的深搜。邻接表快一些

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 #define mt(a,b) memset(a,b,sizeof(a))
 6 using namespace std;
 7 const int M=10010;
 8 struct G{
 9     struct E{
10         int v,next;
11     }e[M<<1];
12     int le,head[M];
13     void init(){
14         le=0;
15         mt(head,-1);
16     }
17     void add(int u,int v){
18         e[le].v=v;
19         e[le].next=head[u];
20         head[u]=le++;
21     }
22 }g;
23 vector<int> son[M];
24 int dfs(int u,int fa){
25     son[u].clear();
26     for(int i=g.head[u];~i;i=g.e[i].next){
27         int v=g.e[i].v;
28         if(v!=fa){
29             son[u].push_back(dfs(v,u));
30         }
31     }
32     sort(son[u].begin(),son[u].end());
33     int res=1,ls=son[u].size();
34     for(int i=0;i<ls;i++){
35         res=max(res,son[u][i]+ls-i-1);
36     }
37     return res;
38 }
39 int main(){
40     int n;
41     while(~scanf("%d",&n)){
42         g.init();
43         for(int v=2,u;v<=n;v++){
44             scanf("%d",&u);
45             g.add(u,v);
46             g.add(v,u);
47         }
48         printf("%d\n",dfs(1,-1));
49     }
50     return 0;
51 }

vector慢一些

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=10010;
 6 vector<int> g[M],son[M];
 7 int dfs(int u,int fa){
 8     son[u].clear();
 9     int lu=g[u].size();
10     for(int i=0;i<lu;i++){
11         int v=g[u][i];
12         if(v!=fa){
13             son[u].push_back(dfs(v,u));
14         }
15     }
16     sort(son[u].begin(),son[u].end());
17     int res=1,ls=son[u].size();
18     for(int i=0;i<ls;i++){
19         res=max(res,son[u][i]+ls-i-1);
20     }
21     return res;
22 }
23 int main(){
24     int n;
25     while(~scanf("%d",&n)){
26         for(int i=1;i<=n;i++){
27             g[i].clear();
28         }
29         for(int v=2,u;v<=n;v++){
30             scanf("%d",&u);
31             g[u].push_back(v);
32             g[v].push_back(u);
33         }
34         printf("%d\n",dfs(1,-1));
35     }
36     return 0;
37 }

G YY‘s Minions http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5336

模拟题,怎么说怎么做。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int M=64;
 5 char op[M];
 6 int mat[2][M][M],n,m,f,k,t;
 7 struct G{
 8     int t,x,y;
 9     friend bool operator <(G a,G b){
10         return a.t<b.t;
11     }
12 }g[M*M];
13 int dx[]={-1,-1,-1,0,0,1,1,1};
14 int dy[]={-1,0,1,-1,1,-1,0,1};
15 int sum(int x,int y,int pre){
16     int res=0;
17     for(int i=0,tx,ty;i<8;i++){
18         tx=x+dx[i];
19         ty=y+dy[i];
20         if(tx>=1&&tx<=n&&ty>=1&&ty<=m){
21             if(mat[pre][tx][ty]&1){
22                 res++;
23             }
24         }
25     }
26     return res;
27 }
28 int change(int pre,int num){
29     if(pre==0){
30         if(num==3) return 1;
31         return 0;
32     }
33     if(num==2||num==3) return 1;
34     return 0;
35 }
36 char tochar(int x){
37     if(x==2) return ‘X‘;
38     return x+‘0‘;
39 }
40 int main(){
41     while(~scanf("%d",&t)){
42         while(t--){
43             scanf("%d%d%d%d",&n,&m,&f,&k);
44             int pre=0,now=1;
45             for(int i=1;i<=n;i++){
46                 scanf("%s",op);
47                 for(int j=0;j<m;j++){
48                     mat[pre][i][j+1]=op[j]-‘0‘;
49                 }
50             }
51             for(int i=0;i<k;i++){
52                 scanf("%d%d%d",&g[i].t,&g[i].x,&g[i].y);
53             }
54             sort(g,g+k);
55             for(int u=1,head=0;u<=f;u++,pre^=1,now^=1){
56                 for(int i=1;i<=n;i++){
57                     for(int j=1;j<=m;j++){
58                         if(mat[pre][i][j]==2){
59                             mat[now][i][j]=2;
60                             continue;
61                         }
62                         int num=sum(i,j,pre);
63                         mat[now][i][j]=change(mat[pre][i][j],num);
64                     }
65                 }
66                 while(head<k&&g[head].t==u){
67                     mat[now][g[head].x][g[head].y]=2;
68                     head++;
69                 }
70             }
71             for(int i=1;i<=n;i++){
72                 for(int j=1;j<=m;j++){
73                     putchar(tochar(mat[pre][i][j]));
74                 }
75                 putchar(‘\n‘);
76             }
77         }
78     }
79     return 0;
80 }

end

时间: 2024-12-16 16:41:02

ZOJ Monthly, August 2014的相关文章

135 - ZOJ Monthly, August 2014

135 - ZOJ Monthly, August 2014 A:构造问题,推断序列奇偶性.非常easy发现最小值不是1就是0.最大值不是n就是n - 1,注意细节去构造就可以 E:dp.dp[i][j]表示长度i,末尾状态为j的最大值,然后每一个位置数字取与不取,不断状态转移就可以 G:就一个模拟题没什么好说的 H:dfs,每次dfs下去,把子树宽度保存下来,然后找最大值,假设有多个.就是最大值+cnt宽度 I:构造,假设r * 2 > R,肯定无法构造.剩下的就二分底边.按等腰三角形去构造就

浙大月赛ZOJ Monthly, August 2014

Abs Problem Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Alice and Bob is playing a game, and this time the game is all about the absolute value! Alice has N different positive integers, and each number is not greater than N. Bob has a

ZOJ Monthly, June 2014——Grouping

题目连接 题意: n个点,m条边 每条边两个整数a.b,表示a到b的有向边 求,至少需要几个集合,使得:每个集合中的元素互相不能到达 N(1≤ N≤ 100000), M(1≤ M≤ 300000) 分析: 相连的两个点不能在同一个集合中,那么,对于一个长度为n的链,至少需要n个集合:如果链中有环,相当于把环展开,这个就需要缩点处理 就是缩点之后求点权最长路 注意:模板中scc_cnt是从1开始的,如果使用缩点后的图,初始化时需要初始化总点数加一 因为总点数有限,用拓扑排序每次删除所有入度为零的

记次浙大月赛 134 - ZOJ Monthly, June 2014

链接 虽做出的很少,也记录下来,留着以后来补..浙大题目质量还是很高的 B 并查集的一些操作,同类和不同类我是根据到根节点距离的奇偶判断的,删点是直接新加一个点,记得福大月赛也做过类似的,并差集的这类关系题目还是比较常见的,有空深究一下. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6

ZOJ Monthly, June 2014 解题报告

A.Another Recurrence Sequence B.Gears 题目大意:有n个齿轮,一开始各自为一组,之后进行m次操作,包括以下4种类型: 1.合并两组齿轮,合并的两个应该反向旋转 2.把某个齿轮从所在组删除,自为一组,但不影响同组其它齿轮的状态与关系 3.询问两个齿轮是同向.反向或无关系(即不在同一组) 4.询问某个齿轮所在组的齿轮总数 分析:典型的并查集操作,但是注意两点: 1.由于操作3要询问两个齿轮的相对状态,因此对并查集中每个元素应当保存它的状态信息.状态是相对的,只需要

ZOJ Monthly, November 2014

做了一次月赛,没想到这么难,加上后来补上的题目也只有3个题.第一名也只有4个题啊啊啊啊~.其中两道还是水题.留坑慢慢补上来. 3832 Tilt Cylinder 给定如图所示有盖圆柱体,R,H,水面高度h,倾角a,求水得体积. 分析:明显的数值积分题,这样考虑.圆下底面即A点与地面高度lim1, 圆上底面一点B与地面高度lim2,h所处的范围进行讨论从而确定积分几何体的两边的高度.我们积分的几何体应该是一个圆柱体被削掉一部分了. h>lim1时,几何体左半部分可以减掉一个圆柱,对剩下部分积分,

ZOJ Monthly, June 2014 月赛BCDEFGH题题解

比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不能加油的站就会wa..太弱.. 唔···太懒第二天才发题解.. B:Gears 并查集 题解:点击打开链接 C:Consecutive Blocks 离散化一下然后模拟 题解:点击打开链接 D:An Easy Game 设dp[i][j]为前i个位置已经匹配了j个位置的方法数. #include <

ZOJ Monthly, August 2012 题解

A: 题目链接:点击打开链接 Alice's present #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <map> #include <queue> #include <set> #include <algorithm> using namespace std; int n, m; in

ZOJ Monthly, September 2003【部分题解】

今天比赛做了一下这套题目.出了四道.两道水题,两道DP 比赛链接:http://vjudge.net/contest/view.action?cid=51404#problem/B 上来搞了一道水题之后就搞B题 题意很好理解,上来看了一下就懂了.以为是规律有循环节,没看wa那么多毅然决然提交,wa了一发. A = "^__^" and B = "T.T",C = BA = "T.T^__^".然后A=B,B=C,一直重复这个操作,问最后第n位的字