逃离单身节
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> using std::vector; using std::sort; int cmp(const void * x, const void * y) { //x < y return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1; } #define pk putchar(' ') #define p_ putchar('_') #define pl putchar(' '); int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n; scanf("%d", &n); for (int i = 0; i < n; i++) pk; for (int i = 0; i < n; i++) p_; for (int i = 0; i < 3 * n; i++) pk; for (int i = 0; i < n; i++) p_; pl; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) pk; putchar('/'); for (int j = 0; j < n + i + i; j++) pk; putchar('\'); for (int j = 0; j < n + n - 1 - i + n - 1 - i; j++) pk; putchar('/'); for (int j = 0; j < n + i + i; j++) pk; putchar('\'); pl; } putchar('/'); for (int j = 0; j < 3 * n - 2; j++) pk; putchar('\'); for (int j = 0; j < n; j++) p_; putchar('/'); for (int j = 0; j < 3 * n - 2; j++) pk; putchar('\'); pl; for (int i = 0; i < n; i++) { putchar('|'); for (int j = 0; j < 7 * n - 2; j++) pk; putchar('|'); pl; } for (int i = 0; i < 3 * n; i++) { for (int j = 0; j < i; j++) pk; putchar('\'); if (i == 3 * n - 1) for (int j = 0; j < n; j++) p_; else for (int j = 0; j < 7 * n - 2 - 2 * i; j++) pk; putchar('/'); pl; } return 0; }
小Hi的天平
在并查集和二分图之间纠结了好久,直到看了别人的代码才想明白。一开始想的并查集是如果两件物品重量相等就合并两个集合,但这样一来面对一条不等关系的信息就毫无作为了。其实相等和不等表达的信息是等价的,都可以由第一个的种类推出第二个。这样一来,在同一个集合中的物品就之间的关系就不是“属于同一种物品”,而是“他们之间有逻辑关系”,只要确定一个集合中的任意一个是属于A还是B就能确定集合中所有的物品的种类。所以,读入一条xuv后,如果uv属于同一个集合,只需核实其关系是否正确即可;若不属于同一个集合,就合并两个集合。这题的关键代码是写在并查集的路径压缩上,一开始隐隐约约有感觉,但是太菜了,没想到。
c[x]表示x节点与其所在集合根节点是否相同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> using std::vector; using std::sort; int cmp(const void * x, const void * y) { //x < y return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1; } class Union_Find_Set { #define MAX_UNION_FIND_SET_SIZE 100000 public: int setSize; int father[MAX_UNION_FIND_SET_SIZE]; int c[MAX_UNION_FIND_SET_SIZE]; Union_Find_Set() { setSize = 0; } Union_Find_Set(int x) { setSize = x; clear(); } void clear() { for (int i = 0; i < setSize; i++) { father[i] = i; } memset(c, 0, sizeof(c)); } int getFather(int x) { if (x == father[x]) return x; int y = father[x]; father[x] = getFather(father[x]); c[x] = c[x] ^ c[y]; return father[x]; } bool merge(int x, int a, int b) { int fa = getFather(a), fb = getFather(b); if (fa != fb) { father[fa] = fb; c[fa] = x ^ c[a] ^ c[b]; return true; } else { return false; } } int countRoot() { int ret = 0; for (int i = 0; i < setSize; i++) { if (father[i] = i) { ret++; } } return ret; } }; Union_Find_Set ufs(10005); int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n, m, t; bool flag; scanf("%d", &t); while (t--) { flag = true; scanf("%d%d", &n, &m); ufs.clear(); for (int i = 1; i <= m; i++) { int x, u, v; scanf("%d%d%d", &x, &u, &v); if (!flag) continue; int fu = ufs.getFather(u), fv = ufs.getFather(v); if (fu == fv) { if ((ufs.c[u] ^ ufs.c[v]) != (x)) { printf("sad %d ", i); flag = false; } } else { ufs.merge(x, u, v); } } if (flag) printf("great "); } return 0; }
图书馆
剩下30%的数据实在无能为力,绝望。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> using namespace std; int cmp(const void * x, const void * y) { //x < y return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1; } long long a[1005]; bool f[22005]; int p[10000], cnt, c[10000]; vector<int> q[10005], qq[10005]; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif memset(f, true, sizeof(f)); f[0] = f[1] = false; for (int i = 2; i < 10000; i++) for (int j = i + i; j < 10000; j += i) f[j] = false; cnt = 0; for (int i = 0; i < 10000; i++) if (f[i]) p[cnt++] = i; for (int i = 0; i <= 10000; i++) { q[i].clear(); qq[i].clear(); } for (int i = 2; i <= 10000; i++) { int x = i; for (int j = 0; j < cnt; j++) { if (x == 1) break; int num = 0; while (x % p[j] == 0) { num++; x /= p[j]; } if (num > 0) { q[i].push_back(j); qq[i].push_back(num); } } } int n, t; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lld", &a[i]); if (a[i] > 100) a[i] %= 100; } if (n > 100) { printf("0 "); continue; } memset(c, 0, sizeof(c)); int sum = 0; for (int i = 0; i < n; i++) sum += (int)a[i]; for (int i = 2; i <= sum; i++) { for (int j = 0; j < q[i].size(); j++) { c[q[i][j]] += qq[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 2; j <= a[i]; j++) { for (int k = 0; k < q[j].size(); k++) { c[q[j][k]] -= qq[j][k]; } } } int ans = 1; for (int i = 0; i < cnt; i++) { for (int j = 0; j < c[i]; j++) { ans = (ans * p[i]) % 10; } } printf("%d ", ans); } return 0; }
命名的烦恼
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> #include<iostream> #include<map> #include<queue> #include<string> using std::vector; using std::queue; using std::map; using std::sort; using std::string; #define read(x) scanf("%d", &x) #define reads(x) scanf("%s", x) #define write(x) printf("%d ", x) #define writes(x) printf("%s ", x) #define writeln(x) printf("%d ", x) #define writesln(x) printf("%s ", x) int cmp(const void * x, const void * y) { #define datatype int datatype dx = *((datatype *)(x)), dy = *((datatype *)(y)); //x < y return dx > dy ? 1 : -1; #undef datatype } char a[20][105], str[20][105]; int cost[20][20], dp[1 << 16][20]; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n, m = 0; read(n); for (int i = 0; i < n; i++) reads(a[i]); for (int i = 0; i < n; i++) { bool flag = false; for (int j = 0; j < n; j++) { if (i == j) continue; if (flag) break; int li = strlen(a[i]), lj = strlen(a[j]); for (int k = 0; k + li - 1 < lj; k++) { bool find = true; for (int p = 0; p < li; p++) { if (a[i][p] != a[j][k + p]) { find = false; break; } } if (find) { flag = true; break; } } } if (!flag) { memcpy(str[m], a[i], sizeof(a[i])); m++; } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (i == j) continue; int common, li = strlen(str[i]), lj = strlen(str[j]); for (common = 0; common < li && common < lj; common++) { bool match = true; for (int k = 0; k < common; k++) { if (str[i][li - common + k] != str[j][k]) { match = false; break; } } if (match) cost[i][j] = lj - common; } } } memset(dp, 0x3F, sizeof(dp)); for (int i = 0; i < m; i++) { dp[1 << i][i] = strlen(str[i]); } for (int i = 0; i < (1 << m); i++) { for (int j = 0; j < m; j++) { if (dp[i][j] == 0x3F3F3F3F) continue; for (int k = 0; k < m; k++) { if (i & (1 << k)) continue; if (dp[i | (1 << k)][k] > dp[i][j] + cost[j][k]) dp[i | (1 << k)][k] = dp[i][j] + cost[j][k]; } } } int ans = 0x3FFFFFFF; for (int i = 0; i < m; i++) { if (dp[(1 << m) - 1][i] < ans) ans = dp[(1 << m) - 1][i]; } writeln(ans); return 0; }