标签:
A:就根据题意计算比较一下即可
B:从每个起点往后走一遍走到底,输出即可,字符串直接map映射掉
C:类似拓扑排序,从临接个数为1的入队,那么临接Xor和,其实就是他的上一个结点,因为他只临接了一个结点,这样利用拓扑排序,当一个结点的度数为1的时候入队即可,注意要判断一下度数0的情况,直接continue
D:利用树状数组去求这种大的全排列数,其实一个全排列 ,可以看成a1 * (n - 1)! + a2 * (n - 2)!....,那么其实只要处理出每一项的系数,然后在由系数就可以求出变换后的全排列了,那么求系数这一步,只需要把两个序列的系数加起来,然后进行进位操作,最后在转化回去即可,这个过程要利用树状数组来维护,因为每个位置都要查询,当前剩下数字中,比该数字小的数字个数
代码:
A:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; double a, b, c, d; int main() { scanf("%lf%lf%lf%lf", &a, &b, &c, &d); double a1 = max(3 * a / 10, a - a / 250 * c); double a2 = max(3 * b / 10, b - b / 250 * d); if (a1 < a2) printf("Vasya\n"); else if (a1 > a2) printf("Misha\n"); else printf("Tie\n"); return 0; }
#include <cstdio> #include <cstring> #include <string> #include <map> using namespace std; int n, hn, vis[2005], to[2005]; map<string, int> hash; char a[25], b[25]; char out[2005][25]; int get(char *str) { if (hash.count(str)) return hash[str]; strcpy(out[hn], str); hash[str] = hn++; return hash[str]; } int dfs(int u) { while (1) { if (to[u] == -1) break; u = to[u]; } return u; } int main() { scanf("%d", &n); hn = 0; memset(to, -1, sizeof(to)); while (n--) { scanf("%s%s", a, b); int u = get(a), v = get(b); to[u] = v; vis[v] = 1; } int tot = 0; for (int i = 0; i < hn; i++) if (!vis[i]) { tot++; } printf("%d\n", tot); for (int i = 0; i < hn ;i++) if (!vis[i]) { printf("%s %s\n", out[i], out[dfs(i)]); } return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; typedef pair<int, int> pii; const int N = (1<<16) + 5; int n, du[N], s[N]; vector<pii> ans; int main() { scanf("%d", &n); queue<int> Q; for (int i = 0; i < n; i++) { scanf("%d%d", &du[i], &s[i]); if (du[i] == 1) Q.push(i); } while (!Q.empty()) { int u = Q.front(); Q.pop(); if (du[u] != 1) continue; ans.push_back(make_pair(u, s[u])); s[s[u]] ^= u; du[s[u]]--; if (du[s[u]] == 1) Q.push(s[u]); } int tot = ans.size(); printf("%d\n", tot); for (int i = 0; i < tot; i++) printf("%d %d\n", ans[i].first, ans[i].second); return 0; }
#include <cstdio> #include <cstring> #define lowbit(x) (x&(-x)) const int N = 200005; int n, a[N]; int bit[N]; void add(int x, int v) { while (x <= n) { bit[x] += v; x += lowbit(x); } } int query(int x) { int ans = 0; while (x) { ans += bit[x]; x -= lowbit(x); } return ans; } int find(int x) { int l = 1, r = n; while (l < r) { int mid = (l + r) / 2; int tmp = query(mid); if (tmp < x) l = mid + 1; else r = mid; } return l; } int main() { scanf("%d", &n); memset(bit, 0, sizeof(bit)); for (int i = 1; i <= n; i++) add(i, 1); int x; for (int i = 1; i <= n; i++) { scanf("%d", &x); x++; int tmp = query(x) - 1; add(x, -1); a[i] += tmp; } for (int i = 1; i <= n; i++) add(i, 1); for (int i = 1; i <= n; i++) { scanf("%d", &x); x++; int tmp = query(x) - 1; add(x, -1); a[i] += tmp; } for (int i = n; i >= 1; i--) { a[i - 1] += a[i] / (n - i + 1); a[i] %= (n - i + 1); } for (int i = 1; i <= n; i++) add(i, 1); for (int i = 1; i <= n; i++) { int tmp = find(a[i] + 1); printf("%d ", tmp - 1); add(tmp, -1); } printf("\n"); return 0; }
Codeforces Round #285 (Div. 2) (A、B、C、D)
标签:
原文地址:http://blog.csdn.net/accelerator_/article/details/42656671