Menu

2019CCPC秦皇岛赛区(重现赛)- 感谢东秦&复旦

Angle Beats

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2047;
struct Coord
{
	int X, Y;
	friend bool operator<(const Coord &p1, const Coord &p2)
	{
		if (p1.X < 0 || p1.X == 0 && p1.Y < 0)
			return Coord{-p1.X, -p1.Y} < p2;
		if (p2.X < 0 || p2.X == 0 && p2.Y < 0)
			return p1 < Coord{-p2.X, -p2.Y};
		return ll(p1.X) * p2.Y < ll(p1.Y) * p2.X;
	}
} p[N], q[N], mp[N];
int main()
{
	for (int n, qq; ~scanf("%d%d", &n, &qq);)
	{
		vector<int> ans(n);
		for (int i = 0; i < n; ++i)
			scanf("%d%d", &p[i].X, &p[i].Y);
		for (int i = 0; i < qq; ++i)
		{
			scanf("%d%d", &q[i].X, &q[i].Y);
			for (int j = 0; j < n; ++j)
				mp[j] = {p[j].X - q[i].X, p[j].Y - q[i].Y};
			sort(mp, mp + n);
			for (int j = 0; j < n; ++j)
			{
				auto r = equal_range(mp, mp + n, Coord{q[i].Y - p[j].Y, p[j].X - q[i].X});
				ans[i] += r.second - r.first;
			}
			ans[i] >>= 1;
		}
		for (int j = 0; j < n; ++j)
		{
			for (int i = 0; i < n; ++i)
				mp[i] = {p[j].X - p[i].X, p[j].Y - p[i].Y};
			swap(mp[j], mp[n - 1]);
			sort(mp, mp + n - 1);
			for (int i = 0; i < qq; ++i)
			{
				auto r = equal_range(mp, mp + n - 1, Coord{q[i].Y - p[j].Y, p[j].X - q[i].X});
				ans[i] += r.second - r.first;
			}
		}
		for (int i = 0; i < qq; ++i)
			printf("%d\n", ans[i]);
	}
}

Decimal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
int t, n;
int main(void)
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		while (n % 2 == 0)
			n /= 2;
		while (n % 5 == 0)
			n /= 5;
		if (n == 1)
			cout << "No" << endl;
		else
			cout << "Yes" << endl;
	}
}

Forest Program

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int maxn = 3e5 + 10, maxm = 5e5 + 10;
const LL mod = 998244353ll;
int n, m, cur, tot, num, col;
int head[maxn], dfn[maxn], top[maxn], tak[maxm], vis[maxn], fa[maxn][25];
vector<int> res, v[maxn];
struct adj
{
	int obj, val, next;
} e[2 * maxm];

void addedge(int x, int y, int val)
{
	cur++;
	e[cur].obj = y;
	e[cur].val = val;
	e[cur].next = head[x];
	head[x] = cur;
}

void dfs(int k, int dad, int col)
{
	fa[k][0] = dad;
	vis[k] = 1;
	dfn[k] = ++num;
	v[col].push_back(k);
	for (int i = head[k]; i != -1; i = e[i].next)
	{
		int to = e[i].obj, val = e[i].val;
		if (!vis[to])
		{
			tak[val] = 1;
			dfs(to, k, col);
		}
	}
}

void ready(int k)
{
	for (int i = 1; i <= 20; i++)
		for (int j = 0; j < v[k].size(); j++)
			fa[j][i] = fa[fa[j][i - 1]][i - 1];
}

int lca(int x, int y)
{
	int ans = 0;
	if (dfn[x] > dfn[y])
		swap(x, y);
	for (int i = 20; i >= 0; i--)
		if (dfn[fa[y][i]] > dfn[x])
		{
			ans += (1 << i);
			y = fa[y][i];
		}
	ans++;
	y = fa[y][0];
	if (x == y)
		return ans;

	for (int i = 20; i >= 0; i--)
		if (dfn[fa[x][i]] > dfn[y])
		{
			ans += (1 << i);
			x = fa[x][i];
		}
	ans++;
	return ans;
}

void dfs2(int k, int dad)
{
	vis[k] = 1;
	for (int i = head[k]; i != -1; i = e[i].next)
	{
		int to = e[i].obj, val = e[i].val;
		if (!tak[val])
		{
			int x = lca(k, to);
			res.push_back(x + 1);
			tak[val] = 1;
		}
		if (!vis[to])
			dfs2(to, k);
	}
}

LL mul(LL a, int k)
{
	if (k == 0)
		return 1ll;
	LL now = mul(a, k / 2);
	now = now * now % mod;
	if (k % 2 == 1)
		now = now * a % mod;
	return now;
}

int main()
{
	while (scanf("%d%d", &n, &m) != EOF)
	{
		cur = 0;
		col = 0;
		num = 0;
		res.clear();
		for (int i = 1; i <= n; i++)
			head[i] = -1, vis[i] = 0, dfn[i] = 0, v[i].clear();
		for (int i = 1; i <= m; i++)
			tak[i] = 0;

		for (int i = 1; i <= m; i++)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			addedge(x, y, i);
			addedge(y, x, i);
		}

		for (int i = 1; i <= n; i++)
			if (!vis[i])
			{
				top[++col] = i;
				dfs(i, i, col);
			}
		for (int i = 1; i <= col; i++)
			ready(top[i]);
		for (int i = 1; i <= n; i++)
			vis[i] = 0;
		for (int i = 1; i <= col; i++)
			dfs2(top[i], top[i]);

		LL ans = 1ll;
		int tot = 0;
		for (int i = 0; i < res.size(); i++)
		{
			ans = ans * (mul(2ll, res[i]) - 1 + mod) % mod;
			tot += res[i];
		}
		ans = ans * mul(2ll, m - tot) % mod;
		printf("%lld\n", ans);
	}

	return 0;
}

Invoker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
int main()
{
	for (char s[N]; ~scanf("%s", s);)
	{
		int ans, f[2][3][3][3];
		for (int j = 0; j < 3; ++j)
			for (int k = 0; k < 3; ++k)
				for (int l = 0; l < 3; ++l)
					f[1][j][k][l] = 3;
		for (int i = 0, cur = 0, val, a[3] = {0, 1, 10}; s[i]; ++i, cur ^= 1)
		{
			if (s[i] == 'Y')
				val = 3; //QQQ
			else if (s[i] == 'V')
				val = 12; //QQW
			else if (s[i] == 'G')
				val = 2; //QQE
			else if (s[i] == 'C')
				val = 30; //WWW
			else if (s[i] == 'X')
				val = 21; //QWW
			else if (s[i] == 'Z')
				val = 20; //WWE
			else if (s[i] == 'T')
				val = 0; //EEE
			else if (s[i] == 'F')
				val = 1; //QEE
			else if (s[i] == 'D')
				val = 10; //WEE
			else if (s[i] == 'B')
				val = 11; //QWE
			ans = (i + 1) * 3;
			for (int j = 0, t; j < 3; ++j)
				for (int k = 0; k < 3; ++k)
					for (int l = 0; l < 3; ++l)
					{
						f[cur][j][k][l] = 1e9;
						if (val == a[j] + a[k] + a[l])
							for (int j1 = 0; j1 < 3; ++j1)
								for (int k1 = 0; k1 < 3; ++k1)
									for (int l1 = 0; l1 < 3; ++l1)
									{
										if (j == j1 && k == k1 && l == l1)
											t = 0;
										else if (j == k1 && k == l1)
											t = 1;
										else if (j == l1)
											t = 2;
										else
											t = 3;
										f[cur][j][k][l] = min(f[cur][j][k][l], f[cur ^ 1][j1][k1][l1] + t);
									}
						ans = min(ans, f[cur][j][k][l]);
					}
			ans += i + 1;
		}
		printf("%d\n", ans);
	}
}

MUV LUV EXTRA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
#define maxn 10000004
#define ll long long
using namespace std;
char s[maxn], s2[maxn];
int p[maxn];
ll a, b, ans;
int main(void)
{
	while (~scanf("%lld%lld%s", &a, &b, s + 1))
	{
		int l = strlen(s + 1), len2;
		for (int i = l; s[i] != '.'; i--)
		{
			s2[l - i + 1] = s[i];
			len2 = l - i + 1;
		}
		int j = 0;
		ans = a - b;
		for (int i = 1; i <= len2; i++)
			p[i] = 0;
		for (int i = 1; i < len2; i++)
		{
			while (j && s2[i + 1] != s2[j + 1])
				j = p[j];
			if (s2[i + 1] == s2[j + 1])
				j++;
			p[i + 1] = j;
			ans = max(a * i - b * (i - p[i]), ans);
		}
		ans = max(a * len2 - b * (len2 - p[len2]), ans);
		cout << ans << endl;
	}
}