• atcoder abc357


    A Sanitize Hands 

    问题:

    思路:前缀和,暴力,你想咋做就咋做

    代码:

    1. #include
    2. using namespace std;
    3. const int N = 2e5 + 10;
    4. int n, m;
    5. int a[N];
    6. int main() {
    7. cin >> n >> m;
    8. for(int i = 1; i <= n; i ++ ) {
    9. cin >> a[i];
    10. }
    11. int ans = 0;
    12. for(int i = 1; i <= n; i ++ ) {
    13. m -= a[i];
    14. ans = i;
    15. if(m <= 0) break;
    16. }
    17. if(m < 0) cout << ans - 1;
    18. else cout << ans;
    19. return 0;
    20. }

    B Uppercase and Lowercase

    问题:

    思路:大小写转换,这里有个问题,为什么我的转换最后都变成数字了,先留个疑问

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 2e5 + 10;
    6. string str;
    7. int main() {
    8. cin >> str;
    9. int cnt1 = 0, cnt2 = 0;
    10. for(auto t: str) {
    11. if(t >= 'a' && t <= 'z') cnt1 ++;
    12. else cnt2 ++;
    13. }
    14. if(cnt1 >= cnt2)
    15. transform(str.begin(),str.end(),str.begin(),::tolower);
    16. else
    17. transform(str.begin(),str.end(),str.begin(),::toupper);
    18. cout<
    19. return 0;
    20. }

    C Sierpinski carpet

    问题:

    思路:阴间题,第一眼递归,但是不想求太多坐标,于是想到把图全变成‘#’最后填充'.'

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = pow(3, 6) + 10;
    6. char g[N][N];
    7. int n;
    8. int main() {
    9. cin >> n;
    10. int len = pow(3, n);
    11. for(int i = 1; i <= len; i ++ ) {
    12. for(int j = 1; j <= len; j ++ ) {
    13. g[i][j] = '#';
    14. }
    15. }
    16. for(int level = 1; level <= n; level ++ ) {
    17. for(int i = 1 + pow(3, level - 1); i <= len; i += pow(3, level)) {
    18. for(int j = 1 + pow(3, level - 1); j <= len; j += pow(3, level)) {
    19. for(int k = i; k <= i + pow(3, level - 1) - 1; k ++ ) {
    20. for(int u = j; u <= j + pow(3, level - 1) - 1; u ++ ) {
    21. g[k][u] = '.';
    22. }
    23. }
    24. }
    25. }
    26. }
    27. for(int i = 1; i <= len; i ++ ) {
    28. for(int j = 1; j <= len; j ++ ) {
    29. cout << g[i][j];
    30. }
    31. cout << endl;
    32. }
    33. return 0;
    34. }

    D 88888888

    问题:

    思路:逆元,快速幂,对原式子变形后发现最后的结果实际上就是x 乘上一个等比数列,这是碰见的第一道逆元的题目,也明确了我对逆元的认识,由于 a / b % mod != (a % mod/ b % mod) % mod,而直接除的话会造成精度丢失,因此我们可以把除法变成乘法,根据费马小定理如果b和p互质,那么b的逆元就等于b ^ p - 2 因此可以快速幂求逆元

    代码:
     

    1. #include
    2. using namespace std;
    3. const int mod = 998244353;
    4. long long x;
    5. int get(long long a) {
    6. int cnt = 0;
    7. while(a) {
    8. a /= 10;
    9. cnt ++;
    10. }
    11. return cnt;
    12. }
    13. long long qmi(long long a, long long b) {
    14. long long res = 1;
    15. while(b) {
    16. if(b & 1) res = ((res % mod) * (a % mod)) % mod;
    17. b >>= 1;
    18. a = (a % mod * a % mod) % mod;
    19. }
    20. return res;
    21. }
    22. int main() {
    23. cin >> x;
    24. int len = get(x);
    25. long long part1 = x % mod;
    26. long long a = qmi(10, (long long)len);
    27. long long b = qmi(a, x);
    28. b --;
    29. long long c = qmi(a - 1, 998244353 - 2);
    30. long long part2 = (b % mod * c % mod) % mod;
    31. cout << (part1 * part2) % mod;
    32. return 0;
    33. }

    E Reachability in Functional Graph

    问题:

    思路:考虑如果题目是一颗树的话那么直接一个记忆化即可,但是该题会出现环,因此考虑缩点,记得开long long

    据说这是基环树板子,回头学一下基环树

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N = (2e5 + 10) * 2;
    7. stack<int> stk;
    8. int n;
    9. int val[N], ne[N], h[N], idx;
    10. int dfn[N], low[N], id[N], _size[N], scc_cnt, ts;
    11. int cnt[N];
    12. bool ins[N], st[N];
    13. long long ans = 0;
    14. void add(int a, int b) {
    15. val[idx] = b;
    16. ne[idx] = h[a];
    17. h[a] = idx ++;
    18. }
    19. void tarjan(int u) {
    20. dfn[u] = low[u] = ++ ts;
    21. stk.push(u);
    22. ins[u] = true;
    23. for(int i = h[u]; i != -1; i = ne[i]) {
    24. int j = val[i];
    25. if(!dfn[j]) {
    26. tarjan(j);
    27. low[u] = min(low[u], low[j]);
    28. } else if(ins[j]) low[u] = min(low[u], dfn[j]);
    29. }
    30. if(dfn[u] == low[u]) {
    31. ++ scc_cnt;
    32. int y;
    33. do {
    34. y = stk.top();
    35. stk.pop();
    36. ins[y] = false;
    37. id[y] = scc_cnt;
    38. _size[scc_cnt] ++;
    39. } while (y != u);
    40. }
    41. }
    42. void dfs(int u) {
    43. for(int i = h[u]; i != -1; i = ne[i]) {
    44. int j = val[i];
    45. if(!st[j]) {
    46. dfs(j);
    47. st[j] = true;
    48. }
    49. cnt[u] += cnt[j];
    50. ans += _size[u] * cnt[j];
    51. }
    52. }
    53. int main() {
    54. memset(h, -1, sizeof h);
    55. cin >> n;
    56. scc_cnt = n;
    57. for(int i = 1; i <= n; i ++ ) {
    58. int x;
    59. cin >> x;
    60. add(i, x);
    61. }
    62. for(int i = 1; i <= n; i ++ ) if(!dfn[i]) tarjan(i);
    63. for(int i = 1; i <= n; i ++ ) cnt[id[i]] = _size[id[i]];
    64. mapint, int>, int> ma;
    65. for(int i = 1; i <= n; i ++ ) {
    66. for(int j = h[i]; j != -1; j = ne[j]) {
    67. int k = val[j];
    68. if(id[i] != id[k] && !ma[{i, k}]) {
    69. add(id[i], id[k]);
    70. ma[{i, k}] ++;
    71. }
    72. }
    73. }
    74. memset(st, 0, sizeof st);
    75. for(int i = scc_cnt; i > n; i -- ) {
    76. if(!st[i]) {
    77. st[i] = true;
    78. dfs(i);
    79. }
    80. }
    81. for(int i = scc_cnt; i > n; i -- ) ans += (long long)_size[i] * (_size[i] - 1);
    82. cout << ans + n;
    83. return 0;
    84. }

    F two sequence queries

    题目:

    思路:对sigema a*b做一点变形 设a加上了x,b加上了y 

    原式 = sigema (a + x) (b + y) = sigema a * b + y * a + x * b + x * y

    于是题目变成了区间修改区间查询,显然线段树lazytag板子

    代码:这里代码只a了21个数据,应该是哪里没有mod到位或者什么细节没有注意到,短时间内不改了,到期末了

    1. #include
    2. using namespace std;
    3. const int N = 2e5 + 10;
    4. const int mod = 998244353;
    5. int n, m;
    6. struct node{
    7. unsigned long long l, r;
    8. unsigned long long suma, sumb, sumab;
    9. unsigned long long taga, tagb;
    10. }tr[4 * N];
    11. void pushup(int u) {
    12. tr[u].suma = (tr[u << 1].suma + tr[u << 1 | 1].suma) % mod;
    13. tr[u].sumb = (tr[u << 1].sumb + tr[u << 1 | 1].sumb) % mod;
    14. tr[u].sumab = (tr[u << 1].sumab + tr[u << 1 | 1].sumab) % mod;
    15. }
    16. void pushdown(int u) {
    17. tr[u << 1].sumab = (tr[u << 1].sumab + tr[u].taga * tr[u << 1].sumb + tr[u].tagb * tr[u << 1].suma + tr[u].taga * tr[u].tagb * (tr[u << 1].r - tr[u << 1].l + 1)) % mod;
    18. tr[u << 1 | 1].sumab = (tr[u << 1 | 1].sumab + tr[u].taga * tr[u << 1 | 1].sumb + tr[u].tagb * tr[u << 1 | 1].suma + tr[u].taga * tr[u].tagb * (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1)) % mod;
    19. tr[u << 1].suma = (tr[u << 1].suma + (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].taga) % mod;
    20. tr[u << 1 | 1].suma = (tr[u << 1 | 1].suma + (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].taga) % mod;
    21. tr[u << 1].taga = (tr[u << 1].taga + tr[u].taga) % mod;
    22. tr[u << 1 | 1].taga = (tr[u << 1 | 1].taga + tr[u].taga) % mod;
    23. tr[u].taga = 0;
    24. tr[u << 1].sumb = (tr[u << 1].sumb + (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].tagb) % mod;
    25. tr[u << 1 | 1].sumb = (tr[u << 1 | 1].sumb + (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].tagb) % mod;
    26. tr[u << 1].tagb = (tr[u << 1].tagb + tr[u].tagb) % mod;
    27. tr[u << 1 | 1].tagb = (tr[u << 1 | 1].tagb + tr[u].tagb) % mod;
    28. tr[u].tagb = 0;
    29. }
    30. void build(int u, int l, int r) {
    31. tr[u].l = l, tr[u].r = r;
    32. if(l == r) return;
    33. int mid = l + r >> 1;
    34. build(u << 1, l, mid);
    35. build(u << 1 | 1, mid + 1, r);
    36. }
    37. void add(int u, int p, int x, int type) {
    38. if(tr[u].l == tr[u].r) {
    39. if(type == 1) tr[u].suma = x;
    40. else if(type == 2) tr[u].sumb = x;
    41. tr[u].sumab = (tr[u].suma * tr[u].sumb) % mod;
    42. } else {
    43. int mid = tr[u].l + tr[u].r >> 1;
    44. if(p <= mid) add(u << 1, p, x, type);
    45. else add(u << 1 | 1, p, x, type);
    46. pushup(u);
    47. }
    48. }
    49. void modify(int u, int l, int r, unsigned long long d, int type) {
    50. if(tr[u].l >= l && tr[u].r <= r) {
    51. if(type == 1) {
    52. tr[u].suma = (tr[u].suma + d * (tr[u].r - tr[u].l + 1)) % mod;
    53. tr[u].taga = (tr[u].taga + d) % mod;
    54. tr[u].sumab = (tr[u].sumab + d * tr[u].sumb) % mod;
    55. } else if(type == 2) {
    56. tr[u].sumb = (tr[u].sumb + d * (tr[u].r - tr[u].l + 1)) % mod;
    57. tr[u].tagb = (tr[u].tagb + d) % mod;
    58. tr[u].sumab = (tr[u].sumab + d * tr[u].suma) % mod;
    59. }
    60. } else {
    61. pushdown(u);
    62. int mid = tr[u].l + tr[u].r >> 1;
    63. if(mid >= l) modify(u << 1, l, r, d, type);
    64. if(mid < r) modify(u << 1 | 1, l, r, d, type);
    65. pushup(u);
    66. }
    67. }
    68. long long query(int u, int l, int r) {
    69. if(tr[u].l >= l && tr[u].r <= r) {
    70. return tr[u].sumab;
    71. } else {
    72. pushdown(u);
    73. int mid = tr[u].l + tr[u].r >> 1;
    74. long long res = 0;
    75. if(mid >= l) res = query(u << 1, l, r);
    76. if(mid < r) res = (res + query(u << 1 | 1, l, r)) % mod;
    77. return res;
    78. }
    79. }
    80. int main() {
    81. cin >> n >> m;
    82. build(1, 1, n);
    83. for(int i = 1; i <= n; i ++ ) {
    84. int x;
    85. cin >> x;
    86. add(1, i, x % mod, 1);
    87. }
    88. for(int i = 1; i <= n; i ++ ) {
    89. int x;
    90. cin >> x;
    91. add(1, i, x % mod, 2);
    92. }
    93. while(m -- ) {
    94. int op;
    95. cin >> op;
    96. if(op == 1) {
    97. int l, r;
    98. unsigned long long d;
    99. cin >> l >> r >> d;
    100. modify(1, l, r, d % mod, 1);
    101. } else if(op == 2) {
    102. int l, r, d;
    103. cin >> l >> r >> d;
    104. modify(1, l, r, d % mod, 2);
    105. } else {
    106. int l, r;
    107. cin >> l >> r;
    108. cout << query(1, l, r) << endl;
    109. }
    110. }
    111. return 0;
    112. }

  • 相关阅读:
    opensips开启python支持
    03 vi编辑器
    剑指offer面试题36 数组中的逆序对
    Vue基础面试题(二)
    switch里面,一开头就放default是什么意思
    多目标优化问题的研究概述(Matlab代码实现)
    c++(15)静态成员变量、静态成员函数、static占用大小
    Container容器
    Python configparser模块
    Python3-excel文档操作(六):利用openpyxl库处理excel表格:Excel可视化,折线图
  • 原文地址:https://blog.csdn.net/2201_75845839/article/details/139566862