华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: smileandyxu
打印 上一主题 下一主题

2015 HSYIT代码暂存楼[0]

[复制链接]

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
41#
 楼主| 发表于 2016-4-19 20:20:15 | 只看该作者
  1. P1882 [NOIP2000P4]单词接龙[code]#include <iostream>
  2. #include <string>
  3. using namespace std;
  4. bool C[21][21]; ///i包含j C[i][j] || C[j][i] ...
  5. int B[21][21];
  6. string S[21];
  7. int A[51];
  8. int P[51];
  9. char c;
  10. int n, tmp, ans;
  11. bool can(int i)
  12. {
  13.     bool flag = false;
  14.     for (int j = 1; j <= n && (!flag); ++j)
  15.         if (P[j] <= 1 && B[A[i - 1]][j] > 0 && (!C[A[i - 1]][j]) && (!C[j][A[i - 1]]))
  16.             flag = true;
  17.     return flag;
  18. }
  19. void dfs(int i)
  20. {
  21.     for (int k = 0; k < i; ++k) {
  22.         cout << S[A[k]] << " ";
  23.         cout << endl;
  24.     }
  25.     if (!can(i))
  26.         if (tmp > ans)
  27.             ans = tmp;
  28.     else {
  29.         for (int j = 1; j <= n; ++j) {
  30.             if (P[j] <= 1 && B[A[i - 1]][j] > 0 && (!C[A[i - 1]][j]) && (!C[j][A[i - 1]])) {
  31.                 ++P[j];
  32.                 A[i] = j;
  33.                 tmp += (S[j].size() - B[i][j]);
  34.                 dfs(i + 1);
  35.                 tmp -= (S[j].size() - B[i][j]);
  36.                 --P[j];
  37.             }
  38.         }
  39.     }
  40. }
  41. int main()
  42. {
  43.     cin >> n;
  44.     for (int i = 1; i <= n; ++i)
  45.         cin >> S[i];
  46.     cin >> c;
  47.     for (int i = 1; i <= n - 1; ++i) {
  48.         for (int j = i + 1; j <= n; ++j) {
  49.             for (int k = 1; k <= S[i].size() - 1 && k <= S[j].size() - 1; ++k) {
  50.                 if (S[i].substr(S[i].size() - k, k) == S[j].substr(0, k))
  51.                     B[i][j] = k;
  52.                 if (S[j].substr(S[j].size() - k, k) == S[i].substr(0, k))
  53.                     B[j][i] = k;
  54.             }
  55.             if (S[i].size() >= S[j].size())
  56.                 for (int k = 0; k + S[j].size() <= S[i].size(); ++k)
  57.                     if (S[i].substr(k, S[j].size()) == S[j])
  58.                         C[i][j] = true;
  59.             else
  60.                 for (int k = 0; k + S[i].size() <= S[j].size(); ++k)
  61.                     if (S[j].substr(k, S[i].size()) == S[i])
  62.                         C[j][i] = true;
  63.         }
  64.     }
  65.     for (int i = 1; i <= n; ++i) {
  66.         for (int j = 1; j <= n; ++j) {
  67.             cout << B[i][j] << " ";
  68.         }
  69.         cout << endl;
  70.     }
  71.     for (int i = 1; i <= n; ++i) {
  72.         if (S[i][0] == c) {
  73.             A[0] = i;
  74.             tmp = S[i].size();
  75.             ++P[i];
  76.             dfs(1);
  77.             --P[i];
  78.         }
  79.     }
  80.     cout << ans;
  81.     return 0;
  82. }
复制代码
[/code]
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
42#
 楼主| 发表于 2016-4-23 18:36:10 | 只看该作者
木棍分割
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cctype>
  4. #define INF 0x7fffffff
  5. using namespace std;
  6. inline int getint()
  7. {
  8.     char c = getchar();
  9.     while (!isdigit(c))
  10.         c = getchar();
  11.     int x = 0;
  12.     while (isdigit(c)) {
  13.         x = x * 10 + c - '0';
  14.         c = getchar();
  15.     }
  16.     return x;
  17. }
  18. int F[50001][2];
  19. int C[50001][2];
  20. int A[50001];
  21. int S[50001];
  22. int m, n, l, d, r, len, ans;
  23. int main()
  24. {
  25.     n = getint();
  26.     m = getint();
  27.     for (int i = 1; i <= n; ++i) {
  28.         A[i] = getint();
  29.         S[i] = S[i - 1] + A[i];
  30.         if (A[i] > l)
  31.             l = A[i];
  32.     }
  33.     r = S[n];
  34.     len = INF;
  35.     d = (l + r) / 2;
  36.     while (l <= r) {
  37.         d = (l + r) / 2;
  38.         int cnt = 0;
  39.         int tmp = 0;
  40.         int maxlen = 0;
  41.         for (int i = 1; i <= n; ++i) {
  42.             if (tmp + A[i] > d) {
  43.                 if (tmp > maxlen)
  44.                     maxlen = tmp;
  45.                 tmp = A[i];
  46.                 ++cnt;
  47.             }
  48.             else
  49.                 tmp += A[i];
  50.         }
  51.         if (tmp > maxlen)
  52.             maxlen = tmp;
  53.         //cout << cnt << endl;
  54.         if (cnt <= m) {
  55.             if (maxlen < len)
  56.                 len = maxlen;
  57.             r = d - 1;
  58.         }
  59.         else
  60.             l = d + 1;
  61.     }
  62.     printf("%d\40", len);
  63.     for (int i = 1; i <= n; ++i) {
  64.         if (S[i] <= len)
  65.             F[i][0] = 1;
  66.     }

  67.         cout << 0 << ":" << endl;
  68.         for (int i = 1; i <= n; ++i)
  69.             cout << F[i][0] << " ";
  70.         cout << endl;
  71.     for (int j = 1; j <= m; ++j) {
  72.         int p = j % 2;
  73.         int tmp = 0;
  74.         int pos = 1;
  75.         for (int i = 1; i <= j; ++i)
  76.             F[i][p ^ 1] = 0;
  77.         for (int i = j + 1; i <= n; ++i) {
  78.             for (int k = pos; k < i; ++k) {
  79.                 if (S[i] - S[k] <= len) {
  80.                     tmp += F[k][p ^ 1];
  81.                     pos = k;
  82.                 }
  83.                 else
  84.                     tmp -= F[k][p ^ 1];
  85.             }
  86.             F[i][p] = tmp;
  87.             tmp += F[i][p ^ 1];
  88.         }
  89.         cout << j << ":" << endl;
  90.         for (int i = 1; i <= n; ++i)
  91.             cout << F[i][p] << " ";
  92.         cout << endl;
  93.     }
  94.     /*for (int i = 1; i <= n; ++i)
  95.         printf("%d\40", F[i][m % 2]);*/
  96.     printf("\n");
  97.     printf("%d", ans);
  98.     return 0;
  99. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
43#
 楼主| 发表于 2016-4-23 20:02:11 | 只看该作者
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string>
  5. #include <queue>
  6. using namespace std;
  7. struct edge {
  8.     int end;
  9.     int len;
  10. };
  11. struct data {
  12.     string way;
  13.     int len;
  14.     bool operator<(const data &x) const {
  15.         return len > x.len;
  16.     }
  17. };
  18. priority_queue<data> Q;
  19. vector<edge> V[51];
  20. data w;
  21. bool B[51];
  22. int A[51];
  23. int m, n, k, a, b, cnt;
  24. string change(int x)
  25. {
  26.     string s;
  27.     do {
  28.         s += char((x % 10) + '0');
  29.         x /= 10;
  30.     } while (x > 0);
  31.     reverse(s.begin(), s.end());
  32.     return s;
  33. }
  34. void put(int x)
  35. {
  36.     w.way += change(x);
  37.     w.way += '-';
  38. }
  39. void del()
  40. {
  41.     string s = w.way;
  42.     int i = s.size() - 2;
  43.     while (s[i] != '-' && i >= 0);
  44.         --i;
  45.     w.way = s.substr(0, i + 1);
  46. }
  47. void add(int u, int v, int l)
  48. {
  49.     edge tmp;
  50.     tmp.end = v;
  51.     tmp.len = l;
  52.     V[u].push_back(tmp);
  53. }
  54. void dfs(int p)
  55. {
  56.     if (p == b) {
  57.         cout << w.way << endl;
  58.         Q.push(w);
  59.         ++cnt;
  60.     }
  61.     else {
  62.         for (int i = 0; i != V[p].size(); ++i) {
  63.             if (!B[V[p][i].end]) {
  64.                 B[V[p][i].end] = true;
  65.                 put(V[p][i].end);
  66.                 w.len += V[p][i].len;
  67.                 dfs(V[p][i].end);
  68.                 B[V[p][i].end] = false;
  69.                 w.len -= V[p][i].len;
  70.                 del();
  71.             }
  72.         }
  73.     }
  74. }
  75. int main()
  76. {
  77.     cin >> n >> m >> k >> a >> b;
  78.     for (int i = 0, u, v, l; i != m; ++i) {
  79.         cin >> u >> v >> l;
  80.         add(u, v, l);
  81.     }
  82.     put(a);
  83.     B[a] = true;
  84.     dfs(a);
  85.     if (cnt < k)
  86.         cout << "No";
  87.     else {
  88.         for (int i = 1; i <= k - 1; ++i)
  89.             Q.pop();
  90.         cout << Q.top().way;
  91.     }
  92.     return 0;
  93. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
44#
 楼主| 发表于 2016-4-30 20:46:26 | 只看该作者
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #define INF 0x7fffffff
  5. using namespace std;
  6. inline int abs(int x)
  7. {
  8.     return (x > 0 ? x : -x);
  9. }
  10. vector<int> V;
  11. bool B[251];
  12. int A[251];
  13. int P[251];
  14. int n, k, a, b, tmp, ans;
  15. void cmn(int i)
  16. {
  17.     if (i == k)
  18.         V.push_back(tmp);
  19.     else {
  20.         for (int j = (i == 0 ? 0 : P[i - 1]); j != n; ++j) {
  21.             if (!B[j]) {
  22.                 B[j] = true;
  23.                 P[i] = j;
  24.                 tmp += A[j];
  25.                 cmn(i + 1);
  26.                 tmp -= A[j];
  27.                 B[j] = false;
  28.             }
  29.         }
  30.     }
  31. }
  32. int main()
  33. {
  34.     cin >> n >> k >> a >> b;
  35.     for (int i = 0; i != n; ++i)
  36.         cin >> A[i];
  37.     cmn(0);
  38.     sort(V.begin(), V.end());
  39.     for (int i = a; i <= b; ++i) {
  40.         vector<int>::iterator iter = lower_bound(V.begin(), V.end(), i);
  41.         tmp = INF;
  42.         if (iter != V.end()) {
  43.             tmp = min(tmp, abs(*iter - i));
  44.         }
  45.         --iter;
  46.         if (iter != V.end()) {
  47.             tmp = min(tmp, abs(*iter - i));
  48.         }
  49.         ans = max(ans, tmp);
  50.     }
  51.     cout << ans;
  52.     return 0;
  53. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
45#
 楼主| 发表于 2016-4-30 21:49:22 | 只看该作者
  1. #include <iostream>
  2. #include <string>
  3. #define INF 0x7fffffff
  4. using namespace std;
  5. struct stack {
  6.     char C[500001];
  7.     int top = 0;
  8.     int size() const {
  9.         return top;
  10.     }
  11.     bool empty() const {
  12.         return top == 0;
  13.     }
  14.     void pop() {
  15.         --top;
  16.     }
  17.     void push(char c) {
  18.         C[top] = c;
  19.         ++top;
  20.     }
  21. };
  22. stack S;
  23. string s;
  24. int tot, tmp;
  25. void dfs(int i)
  26. {
  27.     if (i == s.size()) {
  28.         if (S.empty()) {
  29.             ++tot;
  30.             if (tot == 1000000009)
  31.                 tot = 0;
  32.         }
  33.     }
  34.     else if (s[i] == '?') {
  35.         if (!(!S.empty() && s[i - 1] == 'W')) {
  36.             S.push('B');
  37.             ++tmp;
  38.             s[i] = 'B';
  39.             dfs(i + 1);
  40.             s[i] = '?';
  41.             --tmp;
  42.             S.pop();
  43.         }
  44.         if (!S.empty()) {
  45.             S.pop();
  46.             s[i] = 'W';
  47.             dfs(i + 1);
  48.             s[i] = '?';
  49.             S.push('B');
  50.         }
  51.     }
  52.     else {
  53.         if (s[i] == 'B') {
  54.             if ((!S.empty() && s[i - 1] == 'W') || tmp >= s.size() / 2)
  55.                 return;
  56.             S.push('B');
  57.             ++tmp;
  58.             dfs(i + 1);
  59.             S.pop();
  60.             --tmp;
  61.         }
  62.         else {
  63.             if (S.empty())
  64.                 return;
  65.             S.pop();
  66.             dfs(i + 1);
  67.             S.push('B');
  68.         }
  69.     }
  70. }
  71. int main()
  72. {
  73.     cin >> s;
  74.     if (s[0] == 'W')
  75.         cout << 0;
  76.     else {
  77.         S.push('B');
  78.         s[0] = 'B';
  79.         tmp = 1;
  80.         dfs(1);
  81.         cout << tot;
  82.     }
  83.     return 0;
  84. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
46#
 楼主| 发表于 2016-5-3 13:51:16 | 只看该作者
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cctype>
  4. #define father(x) (x >> 1)
  5. #define lchild(x) (x << 1)
  6. #define rchild(x) (x << 1 | 1)
  7. #define isleft(x) (x == ((x >> 1) << 1))
  8. #define isright(x) (x == ((x >> 1) << 1) | 1)
  9. #define INF 0x7fffffff
  10. using namespace std;
  11. inline int getint()
  12. {
  13.     char c = getchar();
  14.     while (!isdigit(c))
  15.         c = getchar();
  16.     int x = 0;
  17.     while (isdigit(c)) {
  18.         x = x * 10 + c - '0';
  19.         c = getchar();
  20.     }
  21.     return x;
  22. }
  23. inline int max(int x, int y)
  24. {
  25.     return (x > y ? x : y);
  26. }
  27. int T[4000001]; ///maximum
  28. int A[4000001]; ///add
  29. int L, R;
  30. int m, n;
  31. bool found;
  32. int value(int x)
  33. {
  34.     int a = T[x];
  35.     x = father(x);
  36.     while (x >= 1) {
  37.         a += A[x];
  38.         x = father(x);
  39.     }
  40.     return a;
  41. }
  42. void input()
  43. {
  44.     n = getint();
  45.     m = getint();
  46.     L = 1;
  47.     while (L < n)
  48.         L <<= 1;
  49.     R = L + n - 1;
  50.     found = false;
  51.     for (int i = 0; i != L; ++i)
  52.         T[L + i] = -INF;
  53.     for (int i = 0; i != n; ++i) {
  54.         T[L + i] = getint();
  55.         T[L + i] = -T[L + i];
  56.     }
  57. }
  58. void build()
  59. {
  60.     for (int i = L - 1; i >= 1; --i)
  61.         T[i] = max(T[lchild(i)], T[rchild(i)]);
  62. }
  63. bool add(int left, int right, int d)
  64. {
  65.     int l = left;
  66.     int r = right;
  67.     bool flag = true;
  68.     while (l < r && flag) {
  69.         cout << l << " " << r << " " << value(l) + d << " " << value(r) + d << endl;
  70.         if (isleft(l) && isright(r)) {
  71.             l = father(l);
  72.             r = father(r);
  73.         }
  74.         else {
  75.             if (isright(l)) {
  76.                 if (value(l) + d > 0)
  77.                     flag = false;
  78.                 l = father(l) + 1;
  79.             }
  80.             else {
  81.                 l = father(l);
  82.             }

  83.             if (isleft(r)) {
  84.                 if (value(r) + d > 0)
  85.                     flag = false;
  86.                 r = father(r) - 1;
  87.             }
  88.             else {
  89.                 r = father(r);
  90.             }
  91.         }
  92.     }
  93.     if (l == r && value(l) + d > 0)
  94.         flag = false;
  95.     l = left;
  96.     r = right;

  97.     while (l < r && flag) {
  98.         if (isleft(l) && isright(r)) {
  99.             l = father(l);
  100.             r = father(r);
  101.         }
  102.         else if (isright(l)) {
  103.             A[l] += d;
  104.             l = father(l) + 1;
  105.         }
  106.         else if (isleft(r)) {
  107.             A[r] += d;
  108.             r = father(r) - 1;
  109.         }
  110.     }
  111.     if (l == r)
  112.         A[l] += d;
  113.     return flag;
  114. }
  115. int main()
  116. {
  117.     input();
  118.     build();
  119.     for (int i = 0, d, s, t; i != m; ++i) {
  120.         d = getint();
  121.         s = getint();
  122.         t = getint();
  123.         if (!found) {
  124.             if (!add(L + s - 1, L + t - 1, d)) {
  125.                 if (!found)
  126.                     printf("-1\n");
  127.                 found = true;
  128.                 printf("%d\n", i + 1);
  129.             }
  130.         }
  131.     }
  132.     if (!found)
  133.         printf("0");
  134.     return 0;
  135. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
47#
 楼主| 发表于 2016-5-3 15:54:59 | 只看该作者
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. struct num {
  5.     int A[200] = {0};
  6.     int LEN = 200;
  7.     num operator+(num y)
  8.     {
  9.         int x = 0;
  10.         for (int i = 0; i != LEN; ++i) {
  11.             A[i] += y.A[i];
  12.             A[i] += x;
  13.             x = A[i] / 10;
  14.             A[i] %= 10;
  15.         }
  16.         return *this;
  17.     }
  18.     num operator*(int y)
  19.     {
  20.         int x = 0;
  21.         for (int i = 0; i != LEN; ++i) {
  22.             A[i] *= y;
  23.             A[i] += x;
  24.             x = A[i] / 10;
  25.             A[i] %= 10;
  26.         }
  27.         return *this;
  28.     }
  29.     void operator=(int y)
  30.     {
  31.         for (int i = 0; i != LEN && y > 0; ++i) {
  32.             A[i] = y % 10;
  33.             y /= 10;
  34.         }
  35.     }
  36.     void operator=(num y)
  37.     {
  38.         for (int i = 0; i != LEN; ++i)
  39.             A[i] = y.A[i];
  40.     }
  41. };
  42. num max(num x, num y)
  43. {
  44.     int flag = 0;
  45.     for (int i = x.LEN - 1; i >= 0 && flag == 0; --i) {
  46.         if (x.A[i] > y.A[i])
  47.             flag = 1;
  48.         else
  49.             flag = -1;
  50.     }
  51.     return (flag == 1 ? x : y);
  52. }
  53. void input(num &x)
  54. {
  55.     string tmp;
  56.     cin >> tmp;
  57.     for (int i = 0; i != tmp.size(); ++i)
  58.         x.A[i] = tmp[tmp.size() - i - 1] - '0';
  59. }
  60. void output(num x)
  61. {
  62.     int i = x.LEN - 1;
  63.     while (i > 0 && x.A[i] == 0)
  64.         --i;
  65.     while (i >= 0) {
  66.         cout << x.A[i];
  67.         --i;
  68.     }
  69. }
  70. num F[101][101];
  71. num A[101];
  72. num ans;
  73. int m, n;
  74. int main()
  75. {
  76.     cin >> n >> m;
  77.     for (int i = 1; i <= n; ++i) {
  78.         for (int j = 1; j <= m; ++j)
  79.             input(A[j]);
  80.         for (int j = 1; j <= m; ++j)
  81.             for (int k = 1; k <= m; ++k)
  82.                 F[j][k] = 0;
  83.         for (int l = 1; l <= m; ++l) {
  84.             for (int j = 1; j + l - 1 <= m; ++j) {
  85.                 F[j][j + l - 1] = max(F[j][j + l - 2] * 2 + A[j + l - 1], F[j + 1][j + l - 1] * 2 + A[j]);
  86.             }
  87.         }
  88.         ans = ans + F[1][m];
  89.     }
  90.     output(ans * 2);
  91.     return 0;
  92. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
48#
 楼主| 发表于 2016-5-10 20:16:11 | 只看该作者
  1. #include <iostream>
  2. #include <stack>
  3. #define father(x) (x >> 1)
  4. #define lchild(x) (x << 1)
  5. #define rchild(x) ((x << 1) | 1)
  6. #define isleft(x) (x == (x >> 1) << 1)
  7. #define isright(x) (x == ((x >> 1) << 1) | 1)
  8. using namespace std;
  9. int T[800001];
  10. int A[800001];
  11. int L, R;
  12. int n, q;
  13. int value(int x)
  14. {
  15.     int v = 0;
  16.     while (x >= 1) {
  17.         v += A[x];
  18.         x = father(x);
  19.     }
  20.     return v;
  21. }
  22. int query(int l, int r)
  23. {
  24.     int v = 0;
  25.     while (l <= r) {
  26.         if (isleft(l) && isright(r)) {
  27.             l = father(l);
  28.             r = father(r);
  29.         }
  30.         else {
  31.             if (isright(l)) {
  32.                 v += value(l) + T[l];
  33.                 l = father(l) + 1;
  34.             }
  35.             else
  36.                 l = father(l);
  37.             if (isleft(r)) {
  38.                 v += value(r) + T[r];
  39.                 r = father(r) - 1;
  40.             }
  41.             else
  42.                 r = father(r);
  43.         }
  44.     }
  45. }
  46. void update(int x)
  47. {
  48.     do {
  49.         x = father(x);
  50.         T[x] = T[lchild(x)] + T[rchild(x)];
  51.     } while (x >= 1);
  52. }
  53. void maintain(int x)
  54. {
  55.     stack<int> S;
  56.     while (x > 1) {
  57.         S.push(isright(x));
  58.         x = father(x);
  59.     }
  60.     while (!S.empty()) {
  61.         A[lchild(x)] += A[x];
  62.         A[rchild(x)] += A[x];
  63.         A[x] = 0;
  64.         x = lchild(x) | (S.top());
  65.         S.pop();
  66.     }
  67. }
  68. void add(int l, int r, int x)
  69. {
  70.     l = L + l - 1;
  71.     r = L + r - 1;
  72.     while (l <= r) {
  73.         if (isleft(l) && isright(r)) {
  74.             l = father(l);
  75.             r = father(r);
  76.         }
  77.         else {
  78.             if (isright(l)) {
  79.                 A[l] += x;
  80.                 maintain(l);
  81.                 l = father(l) + 1;
  82.             }
  83.             else
  84.                 l = father(l);
  85.             if (isleft(r)) {
  86.                 A[r] += x;
  87.                 maintain(r);
  88.                 r = father(r) - 1;
  89.             }
  90.             else
  91.                 r = father(r);
  92.         }
  93.     }
  94. }
  95. int main()
  96. {
  97.     cin >> n;
  98.     L = 1;
  99.     while (L < n)
  100.         L <<= 1;
  101.     R = L * 2 - 1;
  102.     for (int i = 0; i != n; ++i) {
  103.         cin >> T[L + i];
  104.         update(L + i);
  105.     }
  106.     for (int i = 0, p, a, b, x; i != q; ++i) {
  107.         cin >> p >> a >> b;
  108.         if (p == 1) {
  109.             cin >> x;
  110.             add(a, b, x);
  111.         }
  112.         if (p == 2) {
  113.             cout << query(a, b) << endl;
  114.         }
  115.     }
  116.     return 0;
  117. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
49#
 楼主| 发表于 2016-5-15 16:48:24 | 只看该作者
  1. #include <iostream>
  2. #include <stack>
  3. #define father(x) (x >> 1)
  4. #define lchild(x) (x << 1)
  5. #define rchild(x) ((x << 1) | 1)
  6. #define isleft(x) (x == ((x >> 1) << 1))
  7. #define isright(x) (x == (((x >> 1) << 1) | 1))
  8. using namespace std;
  9. int T[800001];
  10. int A[800001];
  11. int L, R;
  12. int n, q;
  13. int height(int x)
  14. {
  15.     int len = 0;
  16.     while (x >= 1) {
  17.         x = father(x);
  18.         ++len;
  19.     }
  20.     return len - 1;
  21. }
  22. int width(int x)
  23. {
  24.     int len = 1;
  25.     while (height(L) > height(x)) {
  26.         len <<= 1;
  27.         x = lchild(x);
  28.     }
  29.     return len;
  30. }
  31. void update(int x)
  32. {
  33.     do {
  34.         x = father(x);
  35.         T[x] = T[lchild(x)] + T[rchild(x)];
  36.     } while (x >= 1);
  37. }
  38. void maintain(int x)
  39. {
  40.     stack<int> S;
  41.     while (x > 1) {
  42.         S.push(isright(x));
  43.         x = father(x);
  44.     }
  45.     while (!S.empty()) {
  46.         A[lchild(x)] += A[x];
  47.         A[rchild(x)] += A[x];
  48.         T[lchild(x)] += A[x] * width(lchild(x));
  49.         T[rchild(x)] += A[x] * width(rchild(x));
  50.         A[x] = 0;
  51.         x = lchild(x) | (S.top());
  52.         S.pop();
  53.     }
  54. }
  55. void add(int l, int r, int x)
  56. {
  57.     l = L + l - 1;
  58.     r = L + r - 1;
  59.     while (l <= r) {
  60.         if (isleft(l) && isright(r)) {
  61.             l = father(l);
  62.             r = father(r);
  63.         }
  64.         else {
  65.             if (isright(l)) {
  66.                 A[l] += x;
  67.                 T[l] += x * width(l);
  68.                 update(l);
  69.                 l = father(l) + 1;
  70.             }
  71.             else
  72.                 l = father(l);
  73.             if (isleft(r)) {
  74.                 A[r] += x;
  75.                 T[r] += x * width(r);
  76.                 for (int j = 1; j <= R; ++j)
  77.                 update(r);
  78.                 r = father(r) - 1;
  79.             }
  80.             else
  81.                 r = father(r);
  82.         }
  83.     }
  84. }
  85. int query(int l, int r)
  86. {
  87.     l = L + l - 1;
  88.     r = L + r - 1;
  89.     int v = 0;
  90.     while (l <= r) {
  91.         if (isleft(l) && isright(r)) {
  92.             l = father(l);
  93.             r = father(r);
  94.         }
  95.         else {
  96.             if (isright(l)) {
  97.                 maintain(l);
  98.                 v += T[l];
  99.                 l = father(l) + 1;
  100.             }
  101.             else
  102.                 l = father(l);
  103.             if (isleft(r)) {
  104.                 maintain(r);
  105.                 v += T[r];
  106.                 r = father(r) - 1;
  107.             }
  108.             else
  109.                 r = father(r);
  110.         }
  111.     }
  112. }
  113. int main()
  114. {
  115.     cin >> n;
  116.     L = 1;
  117.     while (L < n)
  118.         L <<= 1;
  119.     R = L * 2 - 1;
  120.     for (int i = 0; i != n; ++i) {
  121.         cin >> T[L + i];
  122.         update(L + i);
  123.     }
  124.     cin >> q;
  125.     for (int i = 0, p, a, b, x; i != q; ++i) {
  126.         cin >> p >> a >> b;
  127.         if (p == 1) {
  128.             cin >> x;
  129.             add(a, b, x);
  130.         }
  131.         if (p == 2) {
  132.             cout << query(a, b) << endl;
  133.         }
  134.     }
  135.     return 0;
  136. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

49

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
50#
 楼主| 发表于 2016-5-16 13:54:08 | 只看该作者
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <stack>
  5. #define father(x) (x >> 1)
  6. #define lchild(x) (x << 1)
  7. #define rchild(x) ((x << 1) | 1)
  8. #define isleft(x) (x == ((x >> 1) << 1))
  9. #define isright(x) (x == (((x >> 1) << 1) | 1))
  10. using namespace std;
  11. inline int getint()
  12. {
  13.     char c = getchar();
  14.     while (!isdigit(c))
  15.         c = getchar();
  16.     int x = 0;
  17.     while (isdigit(c)) {
  18.         x = x * 10 + c - '0';
  19.         c = getchar();
  20.     }
  21.     return x;
  22. }
  23. inline void putint(int x)
  24. {
  25.     int tmp[20];
  26.     int i = 0;
  27.     do {
  28.         tmp[i] = x % 10;
  29.         x /= 10;
  30.         ++i;
  31.     } while (x > 0);
  32.     --i;
  33.     while (i >= 0) {
  34.         putchar(tmp[i] + '0');
  35.         --i;
  36.     }
  37.     putchar('\n');
  38. }
  39. int T[800001];
  40. int A[800001];
  41. int L, R;
  42. int n, q;
  43. int height(int x)
  44. {
  45.     int len = 0;
  46.     while (x >= 1) {
  47.         x = father(x);
  48.         ++len;
  49.     }
  50.     return len - 1;
  51. }
  52. int width(int x)
  53. {
  54.     int len = 1;
  55.     while (height(L) > height(x)) {
  56.         len <<= 1;
  57.         x = lchild(x);
  58.     }
  59.     return len;
  60. }
  61. void update(int x)
  62. {
  63.     do {
  64.         x = father(x);
  65.         T[x] = T[lchild(x)] + T[rchild(x)];
  66.     } while (x > 1);
  67. }
  68. void maintain(int x)
  69. {
  70.     stack<bool> S;
  71.     while (x > 1) {
  72.         S.push(isright(x));
  73.         x = father(x);
  74.     }
  75.     while (!S.empty()) {
  76.         A[lchild(x)] += A[x];
  77.         A[rchild(x)] += A[x];
  78.         T[lchild(x)] += A[x] * width(lchild(x));
  79.         T[rchild(x)] += A[x] * width(rchild(x));
  80.         A[x] = 0;
  81.         x = lchild(x) + int(S.top());
  82.         S.pop();
  83.     }
  84. }
  85. void add(int l, int r, int x)
  86. {
  87.     l = L + l - 1;
  88.     r = L + r - 1;
  89.     while (l <= r) {
  90.         if (isleft(l) && isright(r)) {
  91.             l = father(l);
  92.             r = father(r);
  93.         }
  94.         else {
  95.             if (isright(l)) {
  96.                 A[l] += x;
  97.                 T[l] += x * width(l);
  98.                 update(l);
  99.                 l = father(l + 1);
  100.             }
  101.             else
  102.                 l = father(l);
  103.             if (isleft(r)) {
  104.                 A[r] += x;
  105.                 T[r] += x * width(r);
  106.                 update(r);
  107.                 r = father(r - 1);
  108.             }
  109.             else
  110.                 r = father(r);
  111.         }
  112.     }
  113. }
  114. int query(int l, int r)
  115. {
  116.     l = L + l - 1;
  117.     r = L + r - 1;
  118.     int v = 0;
  119.     while (l <= r) {
  120.         if (isleft(l) && isright(r)) {
  121.             l = father(l);
  122.             r = father(r);
  123.         }
  124.         else {
  125.             if (isright(l)) {
  126.                 maintain(l);
  127.                 v += T[l];
  128.                 l = father(l + 1);
  129.             }
  130.             else
  131.                 l = father(l);
  132.             if (isleft(r)) {
  133.                 maintain(r);
  134.                 v += T[r];
  135.                 r = father(r - 1);
  136.             }
  137.             else
  138.                 r = father(r);
  139.         }
  140.     }
  141.     return v;
  142. }
  143. int main()
  144. {
  145.     n = getint();
  146.     L = 1;
  147.     while (L < n)
  148.         L <<= 1;
  149.     R = L * 2 - 1;
  150.     for (int i = 0; i != n; ++i) {
  151.         T[L + i] = getint();
  152.         update(L + i);
  153.     }
  154.     q = getint();
  155.     for (int i = 0, p, a, b, x; i != q; ++i) {
  156.         p = getint();
  157.         a = getint();
  158.         b = getint();
  159.         if (p == 1) {
  160.             x = getint();
  161.             if (a != b)
  162.                 add(a, b, x);
  163.             else {
  164.                 T[L + a - 1] += x;
  165.                 update(L + a - 1);
  166.             }
  167.         }
  168.         if (p == 2) {
  169.             putint(query(a, b));
  170.         }
  171.     }
  172.     return 0;
  173. }
  174. /*
  175. 12
  176. 9 899 6 5 7 2 4 4 3 59 78 116
  177. 6
  178. 1 1 9 11
  179. 2 6 9
  180. 1 7 7 4
  181. 1 5 8 10
  182. 2 5 7
  183. 2 1 12
  184. */
  185. /*
  186. 12
  187. 9 899 6 5 7 2 4 4 3 59 78 116
  188. 5
  189. 1 1 9 11
  190. 2 6 9
  191. 1 5 8 10
  192. 2 5 7
  193. 2 1 12
  194. */
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 02:37 , Processed in 0.346661 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表