博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #260 (Div. 2)
阅读量:5317 次
发布时间:2019-06-14

本文共 4635 字,大约阅读时间需要 15 分钟。

Codeforces Round #260 (Div. 2)

A:水题,事实上仅仅要推断有没有一个ai != bi就可以,由于都保证是1 - n的不相等数字

B:找到2 3 4的循环节,发现仅仅有4和2,于是把大数%4,%2,在依据循环节去计算就可以

C:dp,dp[i][0]表示不拿i数字。dp[i][1]表示拿i数字。状态转移为

dp(i,0)=max(dp(i1,0),dp(i1,1)),
dp(i,1)=dp(i1,0)+val[i]

D:Trie+博弈。依据字符串建Trie,然后两遍dfs找出能控制自己必胜,和能控制自己必败的状态,假设能控制必胜又能控制必败就赢了,假设仅仅能控制必胜,那么假设k为奇数也是赢,剩下都是输

E:并查集+贪心,对于每一个集合,两遍DFS能找出最长链,然后每次合并操作的时候,肯定是拿两遍的最长链中点去合并是最优的,这样带个权值len表示集合最长长度就可以

代码:

A:

#include 
#include
#include
using namespace std;const int N = 100005;int n, a[N], b[N];bool judge() { for (int i = 0; i < n; i++) if (a[i] != b[i]) return true; return false;}int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]); if (judge()) printf("Happy Alex\n"); else printf("Poor Alex\n"); return 0;}
B:

#include 
#include
const int N = 100005;char str[N];int num[5][10];int main() { num[2][0] = 1; num[2][1] = 2; num[2][2] = 4; num[2][3] = 3; num[3][0] = 1; num[3][1] = 3; num[3][2] = 4; num[3][3] = 2; num[4][0] = 1; num[4][1] = 4; scanf("%s", str); if (strcmp(str, "0") == 0) { printf("4\n"); return 0; } int yu = 0; for (int i = 0; i < strlen(str); i++) { yu = (yu * 10 + str[i] - '0') % 4; } int sb = yu % 2; int ans = (1 + num[2][yu] + num[3][yu] + num[4][sb]) % 5; printf("%d\n", ans); return 0;}
C:

#include 
#include
#include
using namespace std;const int N = 100005;int n;long long vis[N], dp[N][2];int main() { int a; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a); vis[a]++; } for (long long i = 1; i <= 100000; i++) { dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] = max(dp[i][1], dp[i - 1][0] + vis[i] * i); } printf("%lld\n", max(dp[100000][0], dp[100000][1])); return 0;}
D:

#include 
#include
const int MAXNODE = 100005;const int SIGMA_SIZE = 26;struct Trie { int ch[MAXNODE][SIGMA_SIZE]; int win[MAXNODE], lose[MAXNODE]; int sz; void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } int idx(char c) {return c - 'a';} void insert(char *str) { int n = strlen(str); int u = 0; for (int i = 0; i < n; i++) { int c = idx(str[i]); if (!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); ch[u][c] = sz++; } u = ch[u][c]; } } int dfs1(int u) { win[u] = 0; for (int i = 0; i < SIGMA_SIZE; i++) { int v = ch[u][i]; if (!v) continue; int tmp = dfs1(v); if (!tmp) win[u] = 1; } return win[u]; } int dfs2(int u) { lose[u] = 0; int bo = 1; for (int i = 0; i < SIGMA_SIZE; i++) { int v = ch[u][i]; if (!v) continue; bo = 0; int tmp = dfs2(v); if (!tmp) lose[u] = 1; } if (bo) return lose[u] = 1; return lose[u]; } void getsg() { dfs1(0); dfs2(0); }};const int N = 100005;int n, k;char str[N];Trie gao;bool judge() { gao.init(); scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { scanf("%s", str); gao.insert(str); } gao.getsg(); if (gao.win[0] && gao.lose[0]) return true; if (gao.win[0]) { if (k&1) return true; return false; } return false;}int main() { if (judge()) printf("First\n"); else printf("Second\n"); return 0;}
E:

#include 
#include
#include
using namespace std;const int N = 300005;int n, m, q, parent[N], len[N], vis[N], Maxu, Maxl;vector
g[N];void dfs(int u, int h, int p) { vis[u] = 1; int flag = 1; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (v == p) continue; flag = 0; dfs(v, h + 1, u); } if (flag) { if (h > Maxl) { Maxl = h; Maxu = u; } }}int find(int x) { return x == parent[x] ? x : parent[x] = find(parent[x]);}int main() { scanf("%d%d%d", &n, &m, &q); for (int i = 1; i <= n; i++) parent[i] = i; int u, v; while (m--) { scanf("%d%d", &u, &v); int pu = find(u); int pv = find(v); parent[pu] = pv; g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= n; i++) { if (vis[i]) continue; Maxl = -1; dfs(i, 0, 0); Maxl = -1; dfs(Maxu, 0, 0); len[find(i)] = Maxl; } int c, a, b; while (q--) { scanf("%d", &c); if (c == 1) { scanf("%d", &a); printf("%d\n", len[find(a)]); } else { scanf("%d%d", &a, &b); int pa = find(a); int pb = find(b); if (pa != pb) { parent[pa] = pb; len[pb] = max(len[pa], max(len[pb], (len[pb] + 1) / 2 + (len[pa] + 1) / 2 + 1)); } } } return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4906193.html

你可能感兴趣的文章
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
(五)归一化
查看>>
使用信号量
查看>>
《数据分析实战》--第三章 python实现
查看>>
实验八 接口与实现接口的类
查看>>
PostgreSQL 保留关键字添加方法之一,不带参数的函数
查看>>