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,肯定无法构造。剩下的就二分底边。按等腰三角形去构造就可以

代码:

A:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int n;

void print(int n) {
    if (n == 3) {
	printf("3 1 2");
	return;
    }
    if (n % 2) {
	int len = (n - 3) / 2;
	printf("%d %d", n, n - len);
	for (int i = n - 1; i > n - len; i--)
	    printf(" %d %d", i, i - len);
	printf(" 3 1 2");
    }
    else {
	int len = n / 2;
	printf("%d %d", n, n - len);
	for (int i = n - 1; i > n - len; i--)
	    printf(" %d %d", i, i - len);
    }
}

void print2(int n) {
    print(n - 2);
    printf(" %d %d", n - 1, n);
}

void solve() {
    if (n == 1) {
	printf("1 1\n1\n1\n");
	return;
    }
    if (n == 2) {
	printf("1 1\n1 2\n2 1\n");
	return;
    }
    if (n == 3) {
	printf("0 2\n3 1 2\n1 2 3\n");
	return;
    }
    if (n % 2 == 0) {
	if (n / 2 % 2) {
	    printf("1 %d\n", n - 1);
	    print2(n); printf("\n");
	    print2(n - 1);
	    printf(" %d\n", n);
	}
	else {
	    printf("0 %d\n", n);
	    print(n); printf("\n");
	    print(n - 1); printf(" %d\n", n);
	}
    }
    else {
	if ((n + 1) / 2 % 2) {
	    printf("1 %d\n", n);
	    print(n - 2); printf(" %d %d\n", n - 1, n);
	    print(n - 1); printf(" %d\n", n);
	}
	else {
	    printf("0 %d\n", n - 1);
	    print(n); printf("\n");
	    print2(n - 1); printf(" %d\n", n);
	}
    }
}

int main() {
    while (~scanf("%d", &n)) {
	solve();
    }
    return 0;
}

E:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;

const int INF = 0x3f3f3f3f;
int t, n;

map<int, int> dp[2];
map<int, int>::iterator it;

int lowbit(int x) {
    return (x&(-x));
}

int solve() {
    dp[0].clear();
    int pre = 1, now = 0;
    int num;
    dp[0][0] = 0;
    for (int i = 0; i < n; i++) {
	scanf("%d", &num);
	num /= 2;
	swap(pre, now);
	dp[now].clear();
	for (it = dp[pre].begin(); it != dp[pre].end(); it++) {
	    int s = it->first;
	    if (dp[now].count(s) == 0) dp[now][s] = dp[pre][s];
	    else dp[now][s] = max(dp[now][s], dp[pre][s]);
	    int next;
	    if (s % num) {
		next = num;
		if (dp[now].count(next) == 0) dp[now][next] = dp[pre][s] + num * 2;
		else dp[now][next] = max(dp[now][next], dp[pre][s] + num * 2);
	    }
	    else {
		next = s + num;
		int add = (s % lowbit(next) * 2 + num) * 2;
		if (dp[now].count(next) == 0) dp[now][next] = dp[pre][s] + add;
		else dp[now][next] = max(dp[now][next], dp[pre][s] + add);
	    }
	}
    }
    int ans = 0;
    for (it = dp[now].begin(); it != dp[now].end(); it++)
	ans = max(ans, it->second);
    return ans;
}

int main() {
    scanf("%d", &t);
    while (t--) {
	scanf("%d", &n);
	printf("%d\n", solve());
    }
    return 0;
}

G:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 55;
const int d[8][2] = {{1, 0}, {1, 1}, {1, -1}, {0, 1}, {0, -1}, {-1, 0}, {-1, 1}, {-1, -1}};

typedef pair<int, int> pii;

int t;
int n, m, f, k;
int g[N][N];
int gg[N][N];
char str[55];
vector<pii> go[1005];

void solve() {
    for (int ti = 1; ti <= f; ti++) {
	memset(gg, 0, sizeof(gg));
	for (int i = 1; i <= n; i++) {
	    for (int j = 1; j <= m; j++) {
		if (g[i][j] == 1) {
		    for (int k = 0; k < 8; k++) {
			int xx = i + d[k][0];
			int yy = j + d[k][1];
			if (xx <= 0 || xx > n || yy <= 0 || yy > m) continue;
			gg[xx][yy]++;
		    }
		}
	    }
	}

	for (int i = 1; i <= n; i++)
	    for (int j = 1; j <= m; j++) {
		if (g[i][j] == 2) continue;
		else if (g[i][j] == 0) {
		    if (gg[i][j] == 3) g[i][j] = 1;
		}
		else {
		    if (gg[i][j] < 2 || gg[i][j] > 3) g[i][j] = 0;
		}
	    }
	for (int i = 0; i < go[ti].size(); i++) {
	    g[go[ti][i].first][go[ti][i].second] = 2;
	}
    }
    for (int i = 1; i <= n; i++) {
	for (int j = 1; j <= m; j++) {
	    if (g[i][j] == 2) printf("X");
	    else printf("%d", g[i][j]);
	}
	printf("\n");
    }
}

int main() {
    scanf("%d", &t);
    while (t--) {
	scanf("%d%d%d%d", &n, &m, &f, &k);
	for (int i = 1; i <= f; i++)
	    go[i].clear();
	for (int i = 1; i <= n; i++) {
	    scanf("%s", str + 1);
	    for (int j = 1; j <= m; j++) {
		g[i][j] = str[j] - ‘0‘;
	    }
	}
	int ti, x, y;
	while (k--) {
	    scanf("%d%d%d", &ti, &x, &y);
	    go[ti].push_back(make_pair(x, y));
	}
	solve();
    }
    return 0;
}

H:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 10005;

int n;
vector<int> g[N];

int dfs(int u) {
    int sz = g[u].size();
    vector<int> save;
    for (int i = 0; i < sz; i++)
	save.push_back(dfs(g[u][i]));
    sort(save.begin(), save.end());
    sz = save.size();
    int cnt = 0;
    int ans = 1;
    for (int i = sz - 1; i >= 0; i--) {
	if (i != sz - 1 && save[i] != save[i + 1]) break;
	ans = save[i] + cnt;
	cnt++;
    }
    return ans;
}

int main() {
    while (~scanf("%d", &n)) {
	for (int i = 1; i <= n; i++)
	    g[i].clear();
	int v;
	for (int i = 2; i <= n; i++) {
	    scanf("%d", &v);
	    g[v].push_back(i);
	}
	printf("%d\n", dfs(1));
    }
    return 0;
}

I:

#include <cstdio>
#include <cstring>
#include <cmath>

double r, R;

double h, x;

double cal(double a) {
    double d = a / 2;
    h = sqrt(R * R - d * d) + R;
    x = sqrt(h * h + d * d);
    return a * x * x / (2 * R * (a + x + x));
}

void solve() {
    double lx = 0, rx = sqrt(3.0) * R;
    double mid;
    for (int i = 0; i < 1000; i++) {
	mid = (lx + rx) / 2;
	double tmp = cal(mid);
	if (tmp > r) rx = mid;
	else lx = mid;
    }
    cal((lx + rx) / 2);
    printf("%.10lf %.10lf %.10lf\n", mid, x, x);
}

int main() {
    while (~scanf("%lf%lf", &r, &R)) {
	if (r * 2 > R) printf("NO Solution!\n");
	else solve();
    }
    return 0;
}
时间: 2024-10-13 11:58:01

135 - ZOJ Monthly, August 2014的相关文章

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

浙大月赛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位的字