Codeforces Round #266 (Div. 2)

来源:互联网 发布:小智零食淘宝店 编辑:程序博客网 时间:2024/06/10 01:49

Codeforces Round #266 (Div. 2)

题目链接

A:就简单的判断一下那种更大即可

B:枚举x到sqrt(n),然后可以直接算出y,然后判断一下即可

C:先判断和是否是3的倍数,然后预处理出前缀和出现位置和后缀和对应sum / 3个数,然后从头往后扫一遍把当前一个和后面进行组合即可

D:先预处理出差分,使得数组表示线段的添加方式,然后每次有一个-1,就能和前面多少个1进行匹配,方案数就乘上多少,如果是0,就能和前面+1个匹配

E:利用并查集,把每次询问拆分成2个部分,起点到x,x到根,然后每次从根往下dfs一遍,对应询问符合的就把对应询问++,dfs完如果一个询问符合两次,就是符合的输出YES,否则就是NO

代码:

#include <cstdio>#include <cstring>int n, m, a, b;int solve() {if (b >= m * a) return a * n;int yu = n % m;int ans = n / m * b;if (yu * a < b) return ans + yu * a;return ans + b;}int main() {scanf("%d%d%d%d", &n, &m, &a, &b);printf("%d\n", solve());return 0;}

B:

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;typedef long long ll;ll n, a, b;int main() {scanf("%lld%lld%lld", &n, &a, &b);n = n * 6;ll ans = 1e18, x, y;if (a * b >= n) {x = a;y = b;ans = a * b;}else {int flag = 0;if (a > b) {flag = 1;swap(a, b);}for (int i = 1; i < 1000000 && i < n; i++) {ll r = n / i + (n % i != 0);ll l = i;if (l > r) swap(l, r);if (l < a || r < b) continue;if (i * r < ans) {ans = i * r;x = i;y = r;}}if (flag) swap(x, y);}printf("%lld\n%lld %lld\n", ans, x, y);return 0;}

C:

#include <cstdio>#include <cstring>const int N = 500005;typedef long long ll;int n;ll a[N], pres[N], prec[N], sufs[N], sufc[N];int main() {scanf("%d", &n);ll sum = 0;for (int i = 1; i <= n; i++) {scanf("%lld", &a[i]);sum += a[i];}if (sum % 3) printf("0\n");else {sum /= 3;for (int i = 1; i <= n; i++) {pres[i] = pres[i - 1] + a[i];if (pres[i] == sum)prec[i] = 1;}for (int i = n; i >= 1; i--) {sufs[i] = sufs[i + 1] + a[i];sufc[i] = sufc[i + 1];if (sufs[i] == sum) sufc[i]++;}ll ans = 0;for (int i = 1; i <= n; i++)ans += prec[i] * sufc[i + 2];printf("%lld\n", ans);}return 0;}

D:

#include <cstdio>#include <cstring>typedef long long ll;const int MOD = 1000000007;const int N = 2005;int n, h, a[N], b[N];int main() {scanf("%d%d", &n, &h);for (int i = 1; i <= n; i++) scanf("%d", &a[i]), a[i] = h - a[i];for (int i = 1; i <= n + 1; i++) b[i] = a[i] - a[i -1];int ans = 1, cnt = 0;for (int i = 1; i <= n + 1; i++) {if (b[i] == 0) ans = (ll)ans * (cnt + 1) % MOD;else if (b[i] == 1) cnt++;else if (b[i] == -1) ans = (ll)ans * cnt % MOD, cnt--;else ans = 0;}printf("%d\n", ans);return 0;}

E:

#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define MP(a,b) make_pair(a,b)typedef pair<int, int> pii;const int N = 100005;int n, m, parent[N];int find(int x) {return x == parent[x] ? x : parent[x]  = find(parent[x]);}vector<pii> p, q[N];vector<int> g[N];int tot, vis[N], cnt[N];void dfs(int u) {vis[u] = 1;for (int i = 0; i < g[u].size(); i++)dfs(g[u][i]);for (int i = 0; i < q[u].size(); i++) {if (vis[q[u][i].first])cnt[q[u][i].second]++;}vis[u] = 0;}int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++)parent[i] = i;int c, x, y;while (m--) {scanf("%d%d", &c, &x);if (c == 2)p.push_back(MP(find(x), x));else {scanf("%d", &y);if (c == 1) {g[y].push_back(x);int px = find(x);int py = find(y);if (px != py)parent[px] = py;} else {q[x].push_back(MP(p[y - 1].first, tot));q[p[y - 1].second].push_back(MP(x, tot));tot++;}}}for (int i = 1; i <= n; i++)if (parent[i] == i) dfs(i);for (int i = 0; i < tot; i++)if (cnt[i] == 2) printf("YES\n");else printf("NO\n");return 0;}


1 0
原创粉丝点击