简单数学变换+线段树

简单数据结构签到题不解释

本来应该贴板子的,鉴于最近写代码太少了,而且由于要用两个线段树,平时板子都是一个的。以及板子在队友那。就当熟悉写代码,自己写了一下。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define dual(i, n) (n) + 1 - (i)
  4. typedef long long ll;
  5. int n, q;
  6. const int maxn = 1e+5 + 5;
  7. typedef ll arr[maxn];
  8. arr a, pa;
  9. struct seg_tree
  10. {
  11. // a,nds坐标都是从1开始记
  12. ll *a;
  13. int n;
  14. struct nd
  15. {
  16. ll sum;
  17. };
  18. vector<nd> nds;
  19. seg_tree(ll *a0, int n0)
  20. {
  21. a = a0;
  22. n = n0;
  23. nds.resize(4 * n);
  24. build(1, 1, n);
  25. }
  26. void build(int i, int l, int r)
  27. {
  28. if (l == r)
  29. {
  30. nds[i].sum = a[l];
  31. return;
  32. }
  33. int m = l + (r - l) / 2;
  34. build(2 * i, l, m);
  35. build(2 * i + 1, m + 1, r);
  36. nds[i].sum = nds[2 * i].sum + nds[2 * i + 1].sum;
  37. }
  38. void change(int i, ll x)
  39. {
  40. ll delta = x - a[i];
  41. a[i] = x;
  42. add(i, delta);
  43. }
  44. void add(int i, ll x)
  45. {
  46. int l = 1;
  47. int r = n;
  48. int u = 1;
  49. int m;
  50. while (true)
  51. {
  52. nds[u].sum += x;
  53. if (l == r)
  54. break;
  55. m = l + (r - l) / 2;
  56. if (i <= m)
  57. {
  58. r = m;
  59. u = 2 * u;
  60. }
  61. else
  62. {
  63. l = m + 1;
  64. u = 2 * u + 1;
  65. }
  66. }
  67. }
  68. ll query(int l, int r, int u, int ul, int ur)
  69. {
  70. // ensure ul<=l<=r<=ur
  71. if (ul == l && r == ur)
  72. return nds[u].sum;
  73. int um = ul + (ur - ul) / 2;
  74. if (r <= um) // left
  75. return query(l, r, 2 * u, ul, um);
  76. else if (l >= um + 1) // right
  77. return query(l, r, 2 * u + 1, um + 1, ur);
  78. else
  79. return query(l, um, 2 * u, ul, um) // left
  80. + query(um + 1, r, 2 * u + 1, um + 1, ur); // right
  81. }
  82. inline ll query(int l,int r) {
  83. return query(l,r,1,1,n);
  84. }
  85. };
  86. int main()
  87. {
  88. ios::sync_with_stdio(false);
  89. cin.tie(0);
  90. cin >> n >> q;
  91. for (int i = n; i >= 1; --i)
  92. {
  93. cin >> a[i];
  94. pa[i] = a[i] * i;
  95. }
  96. seg_tree s(a, n);
  97. seg_tree ps(pa, n);
  98. int t, l, r, k;
  99. ll x, px;
  100. for (int i = 0; i < q; ++i)
  101. {
  102. cin >> t;
  103. if (1 == t)
  104. {
  105. // query
  106. cin >> r >> l;
  107. l = dual(l, n);
  108. r = dual(r, n);
  109. cout << ps.query(l, r) - (ll)(l - 1) * s.query(l, r) << "\n";
  110. }
  111. else
  112. {
  113. // a[k] = x
  114. cin >> k >> x;
  115. k = dual(k, n);
  116. px = x * k;
  117. s.change(k, x);
  118. ps.change(k, px);
  119. }
  120. }
  121. cout.flush();
  122. return 0;
  123. }

ACM-ICPC 2018 徐州赛区网络预赛 Ryuji doesn't want to study的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 HRyuji doesn't want to study 树状数组

    题目链接:https://nanti.jisuanke.com/t/A2007 题目大意:有一个序列含有n个数a[1],a[2],a[3],……a[n],有两种操作: 第一种操作:k=1,l,r,询问 ...

  2. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  6. ACM-ICPC 2018 徐州赛区网络预赛(8/11)

    ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

随机推荐

  1. Memcache 安装配置使用

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.                                                     ...

  2. Mysql 初始化 及 密码管理

    安装好mysql后,第一次初始化数据库 前言:启动mysql数据库最好不要使用root用户,而是使用mysql用户启动 官方解释: (永远不要使用root帐号启动MySQL Server.这样做很危险 ...

  3. 利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现

    #include <stdio.h> #include<conio.h> #include<stdlib.h> /* 利用十字链表存储有向图,可用于同时查找某个顶点 ...

  4. PWA(Progressive web apps),渐进式 Web 应用

    学习博客:https://www.jianshu.com/p/098af61bbe04 学习博客:https://www.zhihu.com/question/59108831 官方文档:https: ...

  5. iTerm 2 与 oh-my-zsh配合,自定义你的终端。

    参考博客:https://www.cnblogs.com/xishuai/p/mac-iterm2.html 参考博客:https://www.cnblogs.com/sasuke6/p/497607 ...

  6. leetcode--js--Longest Substring Without Repeating Characters

    问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...

  7. mutations.js文件书写规范及模板调用此文件书写方法

    1)mutations.js代码如下 const mutations={ add(state){ state.count++ }, reduce(state){ state.count-- } } 2 ...

  8. AGC014-F Strange Sorting

    题意 \(n\)-排列,反复进行:将序列中为前缀最大值的数全部移动到序列末(两种数不改变相对位置),问经过多少次后第一次全部升序排列 做法 定义:用high表示为前缀最大值,low则反之 考虑忽略\( ...

  9. opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素

    动态地址访问像素:src.at<Vec3b>(i, j)[0].src.at<uchar>(i, j)  int b = src.at<Vec3b>(i, j)[0 ...

  10. P1422 小玉家的电费(scanf,printf)

    题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定,月用电量在 150 千瓦时及以下部分按每千瓦时 ...