1121

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. #include<algorithm>
  11. using namespace std;
  12. typedef long long ll;
  13. const int N = 1e6+5;
  14. const int INF = 0x3f3f3f3f;
  15. #define MP(x, y) make_pair(x, y)
  16. int pai[N];
  17. int a[N];
  18. int has[N];
  19. int ord[N];
  20. int main() {
  21. int n;
  22. while(~scanf("%d", &n)) {
  23. memset(pai, -1, sizeof(pai));
  24. for(int i = 0; i < n; ++i) {
  25. int a, b; scanf("%d%d", &a, &b);
  26. pai[a] = b; pai[b] = a;
  27. }
  28. int m; scanf("%d", &m);
  29. for(int i = 0; i < m; ++i) {
  30. scanf("%d", &a[i]);
  31. has[a[i]] ++; if(pai[a[i]] != -1) has[pai[a[i]]] ++;
  32. }
  33. int tot = 0;
  34. for(int i = 0; i < m; ++i) {
  35. if(has[a[i]] == 1) {
  36. ord[tot ++] = a[i];
  37. }
  38. }
  39. sort(ord, ord + tot);
  40. printf("%d\n", tot);
  41. for(int i = 0; i < tot; ++i) {
  42. if(i) printf(" ");
  43. printf("%05d", ord[i]);
  44. }
  45. if(tot) printf("\n");
  46. }
  47. return 0;
  48. }

1122 我把爆搜都写完了,才发现这题的圈顺序是给定的,我爆搜就不删了

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. #include<algorithm>
  11. using namespace std;
  12. typedef long long ll;
  13. const int N = 205;
  14. const int INF = 0x3f3f3f3f;
  15. #define MP(x, y) make_pair(x, y)
  16. struct Node{
  17. int to, nx;
  18. }E[N*N*2];
  19. int mp[N][N];
  20. int head[N], tot;
  21. void add(int fr, int to) {
  22. E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
  23. }
  24. set<int> st;
  25. int suc;
  26. void dfs(int l, int r) {
  27. printf("%d %d\n", l, r);
  28. if(suc) return;
  29. if(st.size() == 0) {
  30. if(mp[l][r]) suc = 1;
  31. return;
  32. }
  33. if(st.size() == 1) {
  34. int tt = *st.begin();
  35. if(mp[l][tt] && mp[r][tt]) {
  36. suc = 1;
  37. }
  38. return;
  39. }
  40. vector<int> ch1; vector<int> ch2;
  41. for(int i = head[l]; ~i; i = E[i].nx) {
  42. if(st.find(E[i].to) != st.end()) {
  43. ch1.push_back(E[i].to);
  44. }
  45. }
  46. if(l == r) {
  47. for(int i = 0; i < ch1.size() && !suc; ++i) {
  48. for(int j = i+1; j < ch1.size() && !suc; ++j) {
  49. st.erase(ch1[i]); st.erase(ch1[j]);
  50. dfs(ch1[i], ch1[j]);
  51. st.insert(ch1[i]); st.insert(ch1[j]);
  52. }
  53. }
  54. return;
  55. }
  56. for(int i = head[r]; ~i; i = E[i].nx) {
  57. if(st.find(E[i].to) != st.end()) {
  58. ch2.push_back(E[i].to);
  59. }
  60. }
  61. for(int i = 0; i < ch1.size() && !suc; ++i) {
  62. for(int j = 0; j < ch2.size() && !suc; ++j) {
  63. if(ch1[i] != ch2[j]) {
  64. st.erase(ch1[i]); st.erase(ch2[j]);
  65. dfs(ch1[i], ch2[j]);
  66. st.insert(ch1[i]); st.insert(ch2[j]);
  67. }
  68. }
  69. }
  70. }
  71. int main() {
  72. int n,m;
  73. while(~scanf("%d %d", &n, &m)) {
  74. memset(head, -1, sizeof(head));
  75. tot = 0;
  76. for(int i = 0; i < m; ++i) {
  77. int a, b; scanf("%d %d", &a, &b);
  78. add(a, b); add(b, a);
  79. mp[a][b] = mp[b][a] = 1;
  80. }
  81. int k; scanf("%d", &k);
  82. while(k --) {
  83. int a; scanf("%d", &a);
  84. int fl = 1;
  85. st.clear();
  86. int pre = -1;
  87. int St = -1;
  88. for(int i = 0; i < a; ++i) {
  89. int b; scanf("%d", &b);
  90. if(St == -1) St = b;
  91. if(st.find(b) != st.end() && i != a-1) fl = 0;
  92. if(i == a-1 && St != b) fl = 0;
  93. if(~pre && !mp[b][pre]) fl = 0;
  94. pre = b;
  95. st.insert(b);
  96. }
  97. // int tt = *st.begin(); st.erase(tt);
  98. // suc = 0;
  99. // dfs(tt, tt);
  100. if(fl && a > 4) printf("YES\n");
  101. else printf("NO\n");
  102. }
  103. }
  104. return 0;
  105. }

1123 和之前一道avl类似

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 25;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. int root;
  16. int num[N];
  17. int L[N], R[N], fa[N];
  18. int n;
  19. void insert(int x, int tag) {
  20. // printf("tag: %d\n", x);
  21. if(!root) {
  22. root = tag; fa[tag] = tag; return;
  23. }
  24. if(num[x] > num[tag]) {
  25. if(!L[x]) L[x] = tag, fa[tag] = x;
  26. else insert(L[x], tag);
  27. }else {
  28. if(!R[x]) R[x] = tag, fa[tag] = x;
  29. else insert(R[x], tag);
  30. }
  31. }
  32. struct Node{
  33. int po, val;
  34. Node(int a=0, int b=0):po(a), val(b){}
  35. }E[10];
  36. int cmp(Node a,Node b) {
  37. return a.val < b.val;
  38. }
  39. void LL(int x) {
  40. // printf("LL\n");
  41. int fart = fa[fa[x]];
  42. int t1 = x; int t2 = R[x]; int t3 = fa[x];
  43. fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
  44. R[t1] = t3; fa[t3] = t1;
  45. L[t3] = t2; fa[t2] = t3;
  46. if(t3 == root) {
  47. root = t1; fa[t1] = t1;
  48. }else if(L[fart] == t3) {
  49. L[fart] = t1; fa[t1] = fart;
  50. }else R[fart] = t1, fa[t1] = fart;
  51. }
  52. void RR(int x) {
  53. // printf("RR\n");
  54. int fart = fa[fa[x]];
  55. int t1 = x; int t2 = L[x]; int t3 = fa[x];
  56. fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
  57. L[t1] = t3; fa[t3] = t1;
  58. R[t3] = t2; fa[t2] = t3;
  59. if(t3 == root) {
  60. root = t1; fa[t1] = t1;
  61. }else if(L[fart] == t3) {
  62. L[fart] = t1; fa[t1] = fart;
  63. }else R[fart] = t1, fa[t1] = fart;
  64. }
  65. void LR(int x, int tag) {
  66. // printf("LR\n");
  67. int fart = fa[fa[x]];
  68. int t1 = x; int t2 = R[x]; int t3 = fa[x];
  69. int a1 = L[t2]; int a2 = R[t2];
  70. fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
  71. R[t1] = 0; L[t3] = 0;
  72. L[t2] = t1; fa[t1] = t2;
  73. R[t2] = t3; fa[t3] = t2;
  74. if(t3 == root) {
  75. root = t2; fa[t2] = t2;
  76. }else if(L[fart] == t3) {
  77. L[fart] = t2; fa[t2] = fart;
  78. }else {
  79. R[fart] = t2; fa[t2] = fart;
  80. }
  81. if(a1) insert(root, a1);
  82. if(a2) insert(root, a2);
  83. }
  84. void RL(int x, int tag) {
  85. // printf("RL\n");
  86. int fart = fa[fa[x]];
  87. int t1 = x; int t2 = L[x]; int t3 = fa[x];
  88. int a1 = L[t2]; int a2 = R[t2];
  89. L[t1] = 0; R[t3] = 0;
  90. fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
  91. L[t2] = t3; fa[t3] = t2;
  92. R[t2] = t1; fa[t1] = t2;
  93. // printf("hh %d %d %d\n", num[t1], num[t2], num[t3]);
  94. if(t3 == root) {
  95. root = t2; fa[t2] = t2;
  96. }else if(L[fart] == t3) {
  97. L[fart] = t2; fa[t2] = fart;
  98. }else {
  99. R[fart] = t2; fa[t2] = fart;
  100. }
  101. // printf("hh %d %d", fart, R[fart]);
  102. if(a1) insert(root, a1);
  103. if(a2) insert(root, a2);
  104. }
  105. void fix(int x) {
  106. int rt = fa[fa[x]]; int fart = fa[rt];
  107. if( (L[rt]==0) + (R[rt]==0) == 1) {
  108. int tot = 0;
  109. for(int i = 0, tt = x; i < 3; ++i) {
  110. E[tot++] = Node(tt, num[tt]);
  111. tt = fa[tt];
  112. }
  113. sort(E, E+tot, cmp);
  114. L[E[1].po] = E[0].po; fa[E[0].po] = E[1].po;
  115. R[E[1].po] = E[2].po; fa[E[2].po] = E[1].po;
  116. L[E[0].po] = 0; R[E[0].po] = 0;
  117. L[E[2].po] = 0; R[E[2].po] = 0;
  118. if(root == rt) {
  119. root = E[1].po; fa[root] = root;
  120. }else if(L[fart] == rt) {
  121. L[fart] = E[1].po; fa[E[1].po] = fart;
  122. }else {
  123. R[fart] = E[1].po; fa[E[1].po] = fart;
  124. }
  125. }else {
  126. // printf("%d %d %d\n", x, rt, fa[rt]);
  127. if (L[fa[rt]] == rt && L[rt] == fa[x] ) LL(rt);
  128. else if(R[fa[rt]] == rt && R[rt] == fa[x] ) RR(rt);
  129. else if(L[fa[rt]] == rt && R[rt] == fa[x] ) LR(rt, x);
  130. else if(R[fa[rt]] == rt && L[rt] == fa[x] ) RL(rt, x);
  131. }
  132. }
  133. void test(int x, int pre) {
  134. printf("%d from %d\n", x, pre);
  135. if(L[x]) test(L[x], x);
  136. if(R[x]) test(R[x], x);
  137. }
  138. int height[N]; int tag;
  139. void dfs(int x) {
  140. int t1 = 0, t2 = 0;
  141. if(L[x]) dfs(L[x]), t1 = height[L[x]];
  142. if(R[x]) dfs(R[x]), t2 = height[R[x]];
  143. height[x] = max(t1, t2)+1;
  144. if( abs(t1- t2) > 1 && !tag) tag = x;
  145. }
  146. void solve(int x) {
  147. // printf("do %d\n", x);
  148. memset(height, 0, sizeof(height));
  149. tag = 0;
  150. dfs(root);
  151. if(tag) {
  152. int t1 = tag;
  153. if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
  154. else t1 = R[t1];
  155. if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
  156. else t1 = R[t1];
  157. if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
  158. else if(height[L[t1]] < height[R[t1]]) t1 = R[t1];
  159. // printf("%d %d\n", tag, t1);
  160. fix(t1);
  161. }
  162. // test(root, root);
  163. // printf("\n");
  164. }
  165. void bfs(int x) {
  166. int all = 0;
  167. queue<int> Q;
  168. Q.push(x);
  169. while(Q.front() != 0) {
  170. int po = Q.front(); Q.pop();
  171. all ++;
  172. Q.push(L[po]); Q.push(R[po]);
  173. }
  174. while(!Q.empty()) Q.pop();
  175. Q.push(x);
  176. int nn = 0;
  177. while(!Q.empty()) {
  178. int po = Q.front(); Q.pop();
  179. if(!nn) nn = 1; else printf(" ");
  180. printf("%d", num[po]);
  181. if(L[po]) Q.push(L[po]);
  182. if(R[po]) Q.push(R[po]);
  183. }
  184. printf("\n");
  185. if(all == n) printf("YES\n");
  186. else printf("NO\n");
  187. }
  188. int main() {
  189. while(~scanf("%d", &n)) {
  190. root = 0;
  191. memset(fa, 0, sizeof(fa));
  192. memset(L, 0, sizeof(L));
  193. memset(R, 0, sizeof(R));
  194. for(int i = 1; i <= n; ++i) {
  195. scanf("%d", &num[i]);
  196. insert(root, i);
  197. solve(i);
  198. // fa[root] = root;
  199. // check(root);
  200. }
  201. // printf("hh\n");
  202. bfs(root);
  203. // printf("%d\n", num[root]);
  204. }
  205. return 0;
  206. }

1124

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 25;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. map<string, int> mp;
  16. int main() {
  17. int m, n, s;
  18. while(~scanf("%d %d %d", &m, &n, &s)) {
  19. int won = s;
  20. int all = 0;
  21. mp.clear();
  22. for(int i = 1, j = 1; i <= m; ++i) {
  23. char s[10]; scanf("%s", s);
  24. if(j == won) {
  25. if(mp.find(s) == mp.end()) printf("%s\n", s), won += n, all ++;
  26. else j --;
  27. mp[s] = 1;
  28. }
  29. j++;
  30. }
  31. if(!all) printf("Keep going...\n");
  32. }
  33. return 0;
  34. }

1125 讲道理我没有读懂题之前 = =我以为在你们选几个组成不就行了,直接选两个最大的

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 1e4+5;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. int a[N];
  16. int main() {
  17. int n;
  18. while(~scanf("%d", &n)) {
  19. for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
  20. sort(a, a + n);
  21. int ans = a[0];
  22. for(int i = 1; i < n; ++i) {
  23. ans = (ans + a[i]) / 2;
  24. }
  25. printf("%d\n", ans);
  26. }
  27. return 0;
  28. }

1126需先判断下图的连通性

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 505;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. struct Node{
  16. int to, nx;
  17. }E[N*N*2];
  18. int head[N], tot;
  19. int vis[N];
  20. void add(int fr, int to) {
  21. E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
  22. }
  23. void dfs(int x) {
  24. for(int i = head[x]; ~i; i = E[i].nx) {
  25. int to = E[i].to;
  26. if(!vis[to]) {
  27. vis[to] = 1;
  28. dfs(to);
  29. }
  30. }
  31. }
  32. int in[N];
  33. int main() {
  34. int n, m;
  35. while(~scanf("%d %d", &n, &m)) {
  36. memset(in, 0, sizeof(in));
  37. memset(vis, 0, sizeof(vis));
  38. memset(head, -1, sizeof(head)); tot = 0;
  39. for(int i = 0; i < m; ++i) {
  40. int a, b; scanf("%d %d", &a, &b);
  41. add(a, b); add(b, a);
  42. in[a] ++; in[b] ++;
  43. }
  44. vis[1] = 1;
  45. dfs(1);
  46. int fl = 1;
  47. for(int i = 1; i <= n; ++i) {
  48. if(!vis[i]) {
  49. fl = 0; break;
  50. }
  51. }
  52. int odd = 0; int even = 0;
  53. for(int i = 1; i <= n; ++i) {
  54. if(in[i] % 2 == 0) even ++;
  55. else odd ++;
  56. }
  57. for(int i = 1; i <= n; ++i) {
  58. if(i != 1) printf(" ");
  59. printf("%d", in[i]);
  60. } printf("\n");
  61. if(odd == 0 && fl) printf("Eulerian\n");
  62. else if(odd == 2 && fl) printf("Semi-Eulerian\n");
  63. else printf("Non-Eulerian\n");
  64. }
  65. return 0;
  66. }

1127

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 35;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. int in[N];
  16. int post[N];
  17. map<int, int> L;
  18. map<int, int> R;
  19. int solve(int LL, int RR, int l, int r) {
  20. if(l > r) return 0;
  21. else if(l == r) return post[l];
  22. int tag = post[r];
  23. int po = 0;
  24. for(int i = LL; i <= RR; ++i) {
  25. if(in[i] == tag) {
  26. po = i; break;
  27. }
  28. }
  29. int _po = l + (po-1-LL);
  30. L[tag] = solve(LL, po-1, l, _po);
  31. R[tag] = solve(po+1, RR, _po+1, r-1);
  32. return tag;
  33. }
  34. void bfs(int x) {
  35. queue<int> Q;
  36. Q.push(x);
  37. int fl = 1;
  38. while(!Q.empty()) {
  39. vector<int> vc;
  40. int ed = Q.size();
  41. for(int i = 0; i < ed; ++i) {
  42. int po = Q.front(); Q.pop();
  43. vc.push_back(po);
  44. if(L[po]) Q.push(L[po]);
  45. if(R[po]) Q.push(R[po]);
  46. }
  47. if(fl) for(int i = vc.size()-1; i >= 0; --i) {
  48. if(vc[i] != x) printf(" ");
  49. printf("%d", vc[i]);
  50. }else for(int i = 0; i < vc.size(); ++i) {
  51. if(vc[i] != x) printf(" ");
  52. printf("%d", vc[i]);
  53. }
  54. fl ^= 1;
  55. }
  56. printf("\n");
  57. }
  58. int main() {
  59. int n;
  60. while(~scanf("%d", &n)) {
  61. for(int i = 1; i <= n; ++i) {
  62. scanf("%d", &in[i]);
  63. }
  64. for(int i = 1; i <= n; ++i) scanf("%d", &post[i]);
  65. int root = solve(1, n, 1, n);
  66. bfs(root);
  67. }
  68. return 0;
  69. }

1128

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 1005;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. int dia1[N*2];
  16. int row[N];
  17. int dia2[N*2];
  18. int main() {
  19. int k;
  20. while(~scanf("%d", &k)) {
  21. for(int i = 1; i <= k; ++i) {
  22. int a; scanf("%d", &a);
  23. int fl = 1;
  24. for(int j = 1; j <= a; ++j) {
  25. int b; scanf("%d", &b);
  26. int t1 = b; int t2 = b-j + a; int t3 = b+j;
  27. if(row[t1] == i|| dia1[t2] == i || dia2[t3] == i ) fl = 0;
  28. row[t1] = i; dia1[t2] = i; dia2[t3] = i;
  29. }
  30. if(fl) printf("YES\n");
  31. else printf("NO\n");
  32. }
  33. }
  34. return 0;
  35. }

1129

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 5e4+5;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. int has[N];
  16. int a[N];
  17. struct Node{
  18. int nu, po;
  19. Node(int a=0, int b=0):nu(a), po(b) {}
  20. bool operator <(const Node &T) const {
  21. if(nu != T.nu) return nu > T.nu;
  22. else return po < T.po;
  23. }
  24. };
  25. set<Node> st;
  26. set<Node> ::iterator it;
  27. int main() {
  28. int n, k;
  29. while(~scanf("%d %d", &n, &k)) {
  30. st.clear();
  31. memset(has, 0, sizeof(has));
  32. for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  33. has[a[1]] ++;
  34. st.insert(Node(has[a[1]], a[1]));
  35. for(int i = 2; i <= n; ++i) {
  36. printf("%d: ", a[i]);
  37. int cnt = 0;
  38. for(it = st.begin(); it != st.end(); ++it) {
  39. if(it != st.begin()) printf(" ");
  40. printf("%d", (*it).po);
  41. cnt ++;
  42. if(cnt >= k) break;
  43. }
  44. printf("\n");
  45. has[a[i]] ++;
  46. it = st.find(Node(has[a[i]]-1, a[i]) );
  47. if( it != st.end() ) st.erase(it), st.insert(Node(has[a[i]], a[i]));
  48. else {
  49. st.insert(Node(has[a[i]], a[i]));
  50. if(st.size() > k) st.erase(--st.end());
  51. }
  52. }
  53. }
  54. return 0;
  55. }

1030

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 25;
  13. const int INF = 0x3f3f3f3f;
  14. #define MP(x, y) make_pair(x, y)
  15. char num[N][15];
  16. int dep[N];
  17. int root;
  18. int L[N], R[N];
  19. void dfs(int x) {
  20. if(x != root && L[x] + R[x]) printf("(");
  21. if(L[x]) dfs(L[x]);
  22. printf("%s", num[x]);
  23. if(R[x]) dfs(R[x]);
  24. if(x != root && L[x] + R[x]) printf(")");
  25. }
  26. int main() {
  27. int n;
  28. while(~scanf("%d", &n)) {
  29. for(int i = 1; i <= n; ++i) {
  30. char b[10], c[10];
  31. scanf("%s %s %s", num[i], b, c);
  32. int tt;
  33. if(b[0] != '-') {
  34. sscanf(b, "%d", &tt);
  35. L[i] = tt, dep[tt] ++;
  36. }
  37. if(c[0] != '-') {
  38. sscanf(c, "%d", &tt);
  39. R[i] = tt; dep[tt] ++;
  40. }
  41. }
  42. for(int i = 1; i <= n; ++i) {
  43. if(!dep[i]) {
  44. root = i;
  45. dfs(i);
  46. break;
  47. }
  48. }
  49. printf("\n");
  50. }
  51. return 0;
  52. }

1031 最后一题还是花了一点时间,简单来说就是最短路即可,但是中间处理还是有点难的

  1. #include<cmath>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<set>
  7. #include<vector>
  8. #include<queue>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 105;
  13. const int M = 1e5+5;
  14. const int INF = 0x3f3f3f3f;
  15. #define MP(x, y) make_pair(x, y)
  16. map<int, int> nam;
  17. map<int, int> ::iterator it;
  18. int _nam[M];
  19. vector<int> input[N];
  20. int n;
  21. int tol;
  22. struct Node{
  23. int nx, to, ty;
  24. }E[M*10];
  25. int head[M], tot;
  26. void add(int fr, int to, int ty) {
  27. E[tot].to = to; E[tot].nx = head[fr]; E[tot].ty = ty; head[fr] = tot++;
  28. }
  29. struct Hode{
  30. int po, di, ti, ty;
  31. Hode(int a=0, int b=0, int c=0, int d=0):po(a), di(b), ti(c), ty(d) {}
  32. bool operator < (const Hode & T) const{
  33. if(di != T.di) return di > T.di;
  34. else return ti > T.ti;
  35. }
  36. };
  37. pair<int, int> pre[M]; int vis[M];
  38. int dis[M], tim[M];
  39. vector<pair<int, int> > ans;
  40. void dfs(int x, int s) {
  41. // printf("%d %d\n", x, _nam[x]);
  42. if(x == s) {
  43. return ;
  44. }
  45. dfs(pre[x].first, s);
  46. ans.push_back(MP(x, pre[x].second));
  47. }
  48. void dij(int s, int t) {
  49. // printf("%d %d\n", s, t);
  50. for(int i = 1; i <= tol; ++i) {
  51. vis[i] = 0; dis[i] = INF; tim[i] = INF;
  52. }
  53. dis[s] = 0; tim[s] = 0;
  54. priority_queue<Hode> Q;
  55. Q.push(Hode(s, dis[s], tim[s], INF));
  56. while(!Q.empty()) {
  57. int po = Q.top().po; int ty = Q.top().ty; Q.pop();
  58. if(vis[po]) continue;
  59. vis[po] = 1;
  60. for(int i = head[po]; ~i; i = E[i].nx) {
  61. int to = E[i].to;
  62. int tt = ty != E[i].ty;
  63. if(dis[to] > dis[po] + 1) {
  64. dis[to] = dis[po] + 1;
  65. tim[to] = tim[po] + tt;
  66. pre[to] = MP(po, E[i].ty);
  67. Q.push(Hode(to, dis[to], tim[to], E[i].ty));
  68. }else if(dis[to] == dis[po] + 1 && tim[to] > tim[po] + tt ) {
  69. tim[to] = tim[po] + tt;
  70. pre[to] = MP(po, E[i].ty);
  71. Q.push(Hode(to, dis[to], tim[to], E[i].ty));
  72. }
  73. }
  74. }
  75. ans.clear();
  76. dfs(t, s);
  77. printf("%d\n", dis[t]);
  78. int fr = s;
  79. ans.push_back(MP(INF, INF));
  80. for(int i = 1; i < ans.size(); ++i) {
  81. if(ans[i].second != ans[i-1].second) {
  82. printf("Take Line#%d from %04d to %04d.\n", ans[i-1].second, _nam[fr], _nam[ans[i-1].first]);
  83. fr = ans[i-1].first;
  84. }
  85. }
  86. }
  87. int main() {
  88. while(~scanf("%d", &n)) {
  89. memset(head, -1, sizeof(head)); tot = 0;
  90. for(int i = 1; i <= n; ++i) {
  91. int m; scanf("%d", &m);
  92. input[i].push_back(m);
  93. for(int j = 0; j < m; ++j) {
  94. int b; scanf("%d", &b);
  95. input[i].push_back(b);
  96. nam[b] ++;
  97. }
  98. }
  99. tol = 0;
  100. for(it = nam.begin(); it != nam.end(); ++it) {
  101. nam[it->first] = ++tol;
  102. _nam[tol] = it->first;
  103. }
  104. // for(int i = 1; i <= tol; ++i) printf("%d:%d ", _nam[i], nam[_nam[i]]); printf("\n");
  105. for(int i = 1; i <= n; ++i) {
  106. for(int j = 2; j < input[i].size(); ++j) {
  107. add(nam[input[i][j]], nam[input[i][j-1]], i); add(nam[input[i][j-1]], nam[input[i][j]], i);
  108. }
  109. }
  110. int m; scanf("%d", &m);
  111. while(m --) {
  112. int a, b; scanf("%d %d", &a, &b);
  113. dij(nam[a], nam[b]);
  114. }
  115. }
  116. return 0;
  117. }

pat1121-1131的更多相关文章

  1. BZOJ 1131: [POI2008]Sta

    Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...

  2. cdoj 1131 男神的礼物 区间dp

    男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1131 Descr ...

  3. 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1131 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合 ...

  4. BZOJ 1131: [POI2008]Sta( dfs )

    对于一棵树, 考虑root的答案向它的孩子转移, 应该是 ans[son] = (ans[root] - size[son]) + (n - size[son]). so , 先 dfs 预处理一下, ...

  5. 1131: [POI2008]Sta

    1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 783  Solved: 235[Submit][Status] ...

  6. CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划)

    CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划) Description Luogu: 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国 ...

  7. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  8. hdu 1130,hdu 1131(卡特兰数,大数)

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. BZOJ 1131 [POI2008]Sta(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1131 [题目大意] 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度 ...

  10. 51nod 1131 数列

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1131 1131 覆盖数字的数量 基准时间限制:1 秒 空间限制:1310 ...

随机推荐

  1. 《深入理解Java虚拟机》学习笔记(一)

    JDK是支持Java程序开发的最小环境集,JRE是支持Java程序运行的标准环境,JRE是JDK的一部分. Java 1.0版本诞生于1995年,其使用的虚拟机是Sun Classisc VM,这款虚 ...

  2. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  3. Python3 栈的实现

    这篇博客主要记录我在学习python算法时实现栈的过程,这里栈的实现只是最简单的实现,其中也包括符号匹配,前缀.中缀以及后缀表达式的实例.参考书目为: problem-solving-with-alg ...

  4. 发放春节福利,ASP.NET Core断点续传

    ASP.NET Core断点续传 在ASP.NET WebAPi写过完整的断点续传文章,目前我对ASP.NET Core仅止于整体上会用,对于原理还未去深入学习,由于有园友想看断点续传在ASP.NET ...

  5. Trie树/字典树题目(2017今日头条笔试题:异或)

    /* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...

  6. Python数据结构之二——tuple(元组)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 列表和元组是Python中最常见的内建序列.元组与列表一样,但是tuple一旦创建就不能修改.创建元组的语法非常简单 ...

  7. [转]用JavaScript在浏览器中创建下载文件

    前端很多项目中,都有文件下载的需求,特别是JS生成文件内容,然后让浏览器执行下载操作(例如在线图片编辑.在线代码编辑.iPresst等. 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开 ...

  8. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...

  9. LaTeX 各种命令,符号

    函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} ...

  10. 有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!

    所有做过网络编程的程序员,想必都会看<TCP/IP详解>卷一:协议 后来出了第二版,但是由于第一版才是Rechard Stevens的原版,本人还是多次看了第一版. 对这一版印象最深的就是 ...