经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
Kickstart Round G 2018
来源:cnblogs  作者:basasuya  时间:2018/10/23 9:06:42  对本文有异议

第一次打codejam....惨的一比,才A1.5题,感觉自己最近状态渣到姥姥家了,赶紧练练
A 模拟,注意0的问题

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <vector>
  8. #include <list>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <functional>
  16. #include <assert.h>
  17. #include <iomanip>
  18. using namespace std;
  19. const int N = 7005;
  20. const int M = 2e5 + 5;
  21. const int INF = 0x3f3f3f3f;
  22. const int MOD = 1000000007;
  23. typedef long long ll;
  24. int n;
  25. int A[N];
  26. vector<int> vc[M];
  27. int maxx;
  28. int solve(ll x, int pos) {
  29. if(x > maxx) return 0;
  30. int tt = (lower_bound(vc[x].begin(), vc[x].end(), pos) - vc[x].begin());
  31. return vc[x].size() - tt;
  32. }
  33. int main() {
  34. freopen("A-large.in", "r", stdin);
  35. freopen("A-large.out", "w", stdout);
  36. // vector<int> t1;
  37. // t1.push_back(1); t1.push_back(2);
  38. // int tt = (lower_bound(t1.begin(), t1.end(), -1) - t1.begin());
  39. // printf("%d\n", tt);
  40. int T;
  41. scanf("%d", &T);
  42. for(int _ = 1; _ <= T; ++_){
  43. for(int i = 0; i < M; ++i) vc[i].clear();
  44. scanf("%d", &n);
  45. maxx = -1;
  46. for(int i = 1; i <= n; ++i) {
  47. scanf("%d", &A[i]);
  48. vc[A[i]].push_back(i);
  49. maxx = max(maxx, A[i]);
  50. }
  51. ll ans = 0;
  52. for(int i = 1; i <= n; ++i) {
  53. for(int j = i + 1; j <= n; ++j) {
  54. if(A[i] == 0 && A[j] == 0) ans += n - j;
  55. else if(A[i] == 0 || A[j] == 0) ans += solve(0, j + 1);
  56. else {
  57. int pre = -1;
  58. if(A[i] % A[j] == 0) ans += solve(A[i] / A[j], j+1), pre = A[i] / A[j];
  59. if(A[j] % A[i] == 0 && pre != A[j] / A[i]) ans += solve(A[j] / A[i], j+1), pre = A[j] / A[i];
  60. if(pre != 1ll * A[j] * A[i]) ans += solve(1ll * A[j] * A[i], j+1);
  61. }
  62. }
  63. }
  64. printf("Case #%d: %lld\n", _, ans);
  65. }
  66. return 0;
  67. }

B 前缀和,二分

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <vector>
  8. #include <list>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <functional>
  16. #include <assert.h>
  17. #include <iomanip>
  18. using namespace std;
  19. const int N = 4e5 + 5;
  20. const int MM = 1e5 + 5;
  21. // const int M = 2e5 + 5;
  22. const int INF = 0x3f3f3f3f;
  23. const int MOD = 1000000007;
  24. typedef long long ll;
  25. struct Node{
  26. int num, offset;
  27. Node(int a=0, int b=0):num(a), offset(b) {}
  28. bool operator < (const Node &T) const {
  29. if(num != T.num) return num < T.num;
  30. else return offset < T.offset;
  31. ///
  32. }
  33. };
  34. struct Tode{
  35. ll sum; int val; int len; int now;
  36. Tode(ll a=0, int b=0, int c=0, int d=0):sum(a), val(b), len(c), now(d){}
  37. bool operator < (const Tode &T) const {
  38. if(sum != T.sum) return sum < T.sum;
  39. else return 1;
  40. ///
  41. }
  42. };
  43. int n, q;
  44. ll X[N], Y[N], A[5], B[5], C[5], M[5];
  45. ll Z[MM];
  46. Node seq[N * 2];
  47. Tode prefix[N * 2];
  48. ll hhh[N * 2];
  49. int main() {
  50. freopen("B-small-attempt4.in", "r", stdin);
  51. freopen("B-small-attempt4.out", "w", stdout);
  52. int T;
  53. scanf("%d", &T);
  54. for(int _ = 1; _ <= T; ++_){
  55. scanf("%d %d", &n, &q);
  56. scanf("%lld %lld %lld %lld %lld %lld", &X[1], &X[2], &A[1], &B[1], &C[1], &M[1]);
  57. scanf("%lld %lld %lld %lld %lld %lld", &Y[1], &Y[2], &A[2], &B[2], &C[2], &M[2]);
  58. scanf("%lld %lld %lld %lld %lld %lld", &Z[1], &Z[2], &A[3], &B[3], &C[3], &M[3]);
  59. for(int i = 3; i <= n; ++i) {
  60. X[i] = (A[1] * X[i - 1] + B[1] * X[i - 2] + C[1]) % M[1];
  61. Y[i] = (A[2] * Y[i - 1] + B[2] * Y[i - 2] + C[2]) % M[2];
  62. }
  63. for(int i = 3; i <= q; ++i) {
  64. Z[i] = (A[3] * Z[i - 1] + B[3] * Z[i - 2] + C[3]) % M[3];
  65. }
  66. for(int i = 1; i <= n; ++i) {
  67. X[i] ++; Y[i] ++;
  68. }
  69. for(int i = 1; i <= q; ++i) Z[i] ++;
  70. int tot = 0;
  71. ll tt = 0;
  72. for(int i = 1; i <= n; ++i) {
  73. if(X[i] > Y[i]) swap(X[i], Y[i]);
  74. // printf("%lld %lld\n", X[i], Y[i]);
  75. tt += Y[i] - X[i] + 1;
  76. seq[tot ++ ] = Node(X[i], 1);
  77. seq[tot ++ ] = Node(Y[i] + 1, -1);
  78. }
  79. // printf("%lld\n", tt);
  80. sort(seq, seq + tot);
  81. // for(int i = 0; i < tot; ++i) printf("%d %d : ", seq[i].num, seq[i].offset); printf("\n");
  82. // seq[tot] = Node(seq[tot - 1].num + 1, 0);
  83. int tmp = 0;
  84. int tot2 = 0;
  85. ll all = 0;
  86. for(int i = 1; i < tot; ++i) {
  87. tmp += seq[i-1].offset;
  88. if(seq[i].num != seq[i-1].num) {
  89. int tt = seq[i].num - seq[i - 1].num;
  90. prefix[tot2] = Tode(all, tmp, tt, seq[i-1].num);
  91. // if(seq[i-1].num < 0) printf("hhh");
  92. hhh[tot2 ++] = all;
  93. // printf("%lld %d %d from %d to %d\n", all, tmp, tt, seq[i-1].num, seq[i].num);
  94. all += 1ll * tt * tmp;
  95. }
  96. }
  97. // printf("%lld\n", all);
  98. ll ans = 0;
  99. for(int i = 1; i <= q; ++i) {
  100. // printf("hhh: %lld\n", Z[i]);
  101. Z[i] = tt - Z[i] + 1;
  102. if(Z[i] <= 0) continue;
  103. // Z[i] = 1;
  104. // printf("hhh: %lld\n", Z[i]);
  105. int pos = lower_bound(hhh, hhh + tot2, Z[i]) - hhh;
  106. pos --;
  107. ll lef = Z[i] - prefix[pos].sum;
  108. // printf("%d %d %lld\n", pos, prefix[pos].now, lef);
  109. ll tt = prefix[pos].now + lef / prefix[pos].val ;
  110. if(lef && (lef % prefix[pos].val == 0) ) tt --;
  111. // printf("%lld\n", tt);
  112. ans += 1ll * tt * i;
  113. }
  114. printf("Case #%d: %lld\n", _, ans);
  115. }
  116. return 0;
  117. }
  118. /*
  119. 3
  120. 5 5
  121. 3 1 4 1 5 9
  122. 2 7 1 8 2 9
  123. 4 8 15 16 23 42
  124. 3
  125. 5 1
  126. 3 1 4 1 5 9
  127. 2 7 1 8 2 9
  128. 4 8 15 16 23 42
  129. 5 5
  130. 3 1 4 1 5 9
  131. 2 7 1 8 2 9
  132. 4 8 15 16 23 42
  133. 1 2
  134. 0 0 0 0 0 1
  135. 0 0 0 0 0 1
  136. 0 1 0 0 0 2
  137. 100
  138. 1 2
  139. 0 0 0 0 0 1
  140. 0 0 0 0 0 1
  141. 0 1 0 0 0 2
  142. 100
  143. 55769 1
  144. 0 0 0 0 0 1000000000
  145. 999999999 999999999 0 0 999999999 1000000000
  146. 2512670 116262940 14464944 27962747 49835299 118572793
  147. 400000 1
  148. 97295458 97277314 13871606 251023440 11331260 274678035
  149. 97295458 97277314 13871606 251023440 11331260 274678035
  150. 244442 258459 136705 290087 276595 400000
  151. */

C 状压dp+dfs

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <vector>
  8. #include <list>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13. #include <tuple>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <assert.h>
  18. #include <iomanip>
  19. using namespace std;
  20. const int N = 32768;
  21. const int M = 2e5 + 5;
  22. const int INF = 0x3f3f3f3f;
  23. const int MOD = 1000000007;
  24. typedef long long ll;
  25. int n, m, e, sx, sy, tx, ty;
  26. int mp[105][105];
  27. int has[105][105];
  28. int dir[][2] = { {-1, 0}, {1, 0}, {0, 1}, {0, -1} };
  29. ll energy[N];
  30. int exiting[N];
  31. int remain[N];
  32. int tag[105][105];
  33. vector<tuple<int, int, int> > trap;
  34. int trapNum;
  35. ll dp[N];
  36. void solve(ll all, int id) {
  37. memset(has, 0, sizeof(has));
  38. queue<tuple<int, int> > Q;
  39. Q.push(make_tuple(sx, sy));
  40. has[sx][sy] = 1;
  41. int flag = 0;
  42. int remainNum = 0;
  43. while(!Q.empty()) {
  44. int x = get<0>(Q.front()); int y = get<1>(Q.front()); Q.pop();
  45. if(x == tx && y == ty) {
  46. flag = 1;
  47. }
  48. for(int i = 0; i < 4; ++i) {
  49. int dx = x + dir[i][0]; int dy = y + dir[i][1];
  50. if(dx < 1 || dx > n || dy < 1 || dy > m || has[dx][dy] || mp[dx][dy] == -100000) continue;
  51. if(mp[dx][dy] < 0 ) {
  52. remainNum |= 1 << tag[dx][dy]; continue;
  53. }
  54. all += mp[dx][dy];
  55. has[dx][dy] = 1;
  56. Q.push(make_tuple(dx, dy));
  57. }
  58. }
  59. energy[id] = all;
  60. exiting[id] = flag;
  61. remain[id] = remainNum;
  62. }
  63. ll dfs(int mask) {
  64. if(~dp[mask]) return dp[mask];
  65. ll ans = -1;
  66. if(exiting[mask] == 1) ans = energy[mask];
  67. for(int i = 0; i < trapNum; ++i) {
  68. if( (remain[mask] >> i) & 1) {
  69. if(-mp[get<0>(trap[i])][get<1>(trap[i])] <= energy[mask])
  70. ans = max(ans, dfs(mask | (1<<i)));
  71. }
  72. }
  73. dp[mask] = ans;
  74. return ans;
  75. }
  76. int main() {
  77. freopen("./C-large-practice2.in", "r", stdin);
  78. // freopen("./C-large-practice2.out", "w", stdout);
  79. int T;
  80. scanf("%d", &T);
  81. for(int _ = 1; _ <= T; ++_){
  82. trap.clear();
  83. memset(dp, -1, sizeof(dp));
  84. scanf("%d %d %d %d %d %d %d", &n, &m, &e, &sx, &sy, &tx, &ty);
  85. for(int i = 1; i <= n; ++i) {
  86. for(int j = 1; j <= m; ++j) {
  87. scanf("%d", &mp[i][j]);
  88. }
  89. }
  90. for(int i = 1; i <= n; ++i) {
  91. for(int j = 1; j <= m; ++j) {
  92. if(mp[i][j] < 0 && mp[i][j] != -100000) {
  93. trap.emplace_back(i, j, mp[i][j]);
  94. tag[i][j] = trap.size() - 1;
  95. }
  96. }
  97. }
  98. trapNum = trap.size();
  99. for(int i = 0; i < 1 << trapNum; ++i) {
  100. ll all = e;
  101. for(int j = 0; j < trapNum; ++j) {
  102. if( (i >> j) & 1 ) {
  103. mp[get<0>(trap[j])][get<1>(trap[j])] = 0;
  104. all += get<2>(trap[j]);
  105. }
  106. }
  107. solve(all, i);
  108. for(int j = 0; j < trapNum; ++j) {
  109. if( (i >> j) & 1 ) {
  110. mp[get<0>(trap[j])][get<1>(trap[j])] = get<2>(trap[j]);
  111. }
  112. }
  113. }
  114. // for(int i = 0; i < 1<<trapNum; ++i) printf("%lld %d %d\n", energy[i], remain[i], exiting[i]);
  115. printf("Case #%d: %lld\n", _, dfs(0));
  116. }
  117. return 0;
  118. }
  119. /*
  120. 2
  121. 4 4 100 1 1 4 4
  122. 0 0 0 0
  123. 0 0 0 0
  124. 0 0 0 -100000
  125. 0 0 -100000 0
  126. 8 8 250 7 1 1 7
  127. -100000 -100000 -100000 -100000 -100000 -100000 0 -100000
  128. -100000 0 -100000 0 -400 0 0 -100000
  129. -100000 100 -300 0 -100000 -300 -100000 -100000
  130. -100000 0 -100000 500 -100000 250 0 -100000
  131. -100000 -200 -100000 -100000 -100000 -100000 -100 -100000
  132. -100000 0 -100000 0 0 50 50 -100000
  133. 0 0 -100 0 -100000 50 -100000 -100000
  134. -100000 -100000 -100000 -100000 -100000 -100000 -100000 -100000
  135. */
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号