C - Division

思路:我们考虑到一点,从大往小取得顺序是不会有问题的,所以可以直接主席树,但是开不下空间,我们可以log分段求。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define PLL pair<LL, LL>
  7. #define PLI pair<LL, int>
  8. #define PII pair<int, int>
  9. #define SZ(x) ((int)x.size())
  10. #define ull unsigned long long
  11. using namespace std;
  12.  
  13. const int N = 1e5 + ;
  14. const int inf = 0x3f3f3f3f;
  15. const LL INF = 0x3f3f3f3f3f3f3f3f;
  16. const int mod = ;
  17. const double eps = 1e-;
  18.  
  19. int n, q, all, hs[ * N], hcnt, a[N], bin[];
  20. LL ans[ * N], sum[N], csum[N];
  21. pair<PII, int> qus[ * N];
  22. vector<int> vc[][N];
  23.  
  24. int root[ * N], tot;
  25.  
  26. struct node {
  27. LL sum;
  28. int cnt, ls, rs;
  29. } o[ * N * ];
  30.  
  31. void update(int p, int l, int r, int &x, int y) {
  32. x = ++tot;
  33. o[x] = o[y];
  34. o[x].sum += p;
  35. o[x].cnt++;
  36. if(l == r) return;
  37. int mid = l + r >> ;
  38. if(p <= hs[mid]) update(p, l, mid, o[x].ls, o[y].ls);
  39. else update(p, mid + , r, o[x].rs, o[y].rs);
  40. }
  41.  
  42. LL query(int res, int l, int r, int x, int y) {
  43. if(o[x].cnt - o[y].cnt <= res) return o[x].sum - o[y].sum;
  44. if(l == r) return 1ll * res * hs[l];
  45. int mid = l + r >> , cntr = o[o[x].rs].cnt - o[o[y].rs].cnt;
  46. if(cntr >= res) return query(res, mid + , r, o[x].rs, o[y].rs);
  47. else return o[o[x].rs].sum - o[o[y].rs].sum + query(res-cntr, l, mid, o[x].ls, o[y].ls);
  48. }
  49.  
  50. int main() {
  51. for(int i = bin[] = ; i <= ; i++) bin[i] = bin[i - ] << ;
  52. scanf("%d%d", &n, &q);
  53. for(int i = ; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i - ] + a[i];
  54. for(int i = ; i <= q; i++) {
  55. scanf("%d%d%d", &qus[i].fi.fi, &qus[i].fi.se, &qus[i].se);
  56. ans[i] = sum[qus[i].fi.se] - sum[qus[i].fi.fi - ];
  57. }
  58. for(int i = , j = ; i <= n; i++, j = ) {
  59. while(a[i]) {
  60. int val = a[i] - a[i] / ;
  61. while(val < bin[j]) j--;
  62. vc[j][i].push_back(val);
  63. a[i] /= ;
  64. }
  65. }
  66. for(int k = ; k >= ; k--) {
  67. tot = ; hcnt = ; all = ;
  68. for(int i = ; i <= n; i++) csum[i] = csum[i - ] + SZ(vc[k][i]);
  69. if(!csum[n]) continue;
  70. for(int i = ; i <= n; i++) for(auto& t : vc[k][i]) hs[++hcnt] = t;
  71. sort(hs + , hs + + hcnt); hcnt = unique(hs + , hs + + hcnt) - hs - ;
  72. for(int i = ; i <= n; i++) for(auto& t : vc[k][i]) update(t, , hcnt, root[all + ], root[all]), all++;
  73. for(int i = ; i <= q; i++) {
  74. if(!qus[i].se) continue;
  75. int L = qus[i].fi.fi, R = qus[i].fi.se, has = csum[R] - csum[L - ];
  76. if(has >= qus[i].se) {
  77. ans[i] -= query(qus[i].se, , hcnt, root[csum[R]], root[csum[L - ]]);
  78. qus[i].se = ;
  79. } else {
  80. ans[i] -= query(has, , hcnt, root[csum[R]], root[csum[L - ]]);
  81. qus[i].se -= has;
  82. }
  83. }
  84. }
  85. for(int i = ; i <= q; i++) printf("%lld\n", ans[i]);
  86. return ;
  87. }
  88.  
  89. /*
  90. */

2019 CCPC wannfly winter camp Day 5的更多相关文章

  1. 2019 CCPC wannfly winter camp Day 8

    E - Souls-like Game 直接线段树合并矩阵会被卡T掉,因为修改的复杂度比询问的复杂度多一个log,所以我们考虑优化修改. 修改的瓶颈在于打lazy的时候, 所以我们预处理出每个修改矩阵 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  4. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  5. 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

    题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...

  6. 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信

    题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...

  7. 2020 CCPC Wannafly Winter Camp Day1-F-乘法

    题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...

  8. 2019 wannafly winter camp day 3

    2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...

  9. 2019 wannafly winter camp

    2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...

随机推荐

  1. HGOI20181030 模拟题解

    problem:给定一个序列,问你能不能通过一次交换把他弄成有序 sol: 对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!) 对于100%的数据,显然我们先对数列进行排序然后上下 ...

  2. JavaScript -- 标签 , Break 和 Continue 语句

    break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. 标签引用,break 语句可用于跳出任何 JavaScript 代码块. demo: <!DOCTYPE html& ...

  3. Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  4. log4j常见配置

    依赖jar <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId ...

  5. swift学习笔记3

    1.在 Swift 中,枚举类型是一等(first-class)类型.它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的 ...

  6. Codeforces 906 D. Power Tower

    http://codeforces.com/contest/906/problem/D 欧拉降幂 #include<cstdio> #include<iostream> usi ...

  7. hdu 5956 The Elder

    http://acm.hdu.edu.cn/showproblem.php?pid=5956 转移方程:dp[i]=(dis[i]-dis[j])*(dis[i]-dis[j])+P+dp[j] 斜率 ...

  8. Spring RedisTemplate操作-Set操作(5)

    @Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...

  9. [转载]五理由 .NET开发者应该关注HTML 5

    http://developer.51cto.com/art/201107/275039.htm

  10. 一些js的小技巧

    这里收集了一些编码上的小技巧,大家可以学习学习. 1.浮点转整型 使用|0快速转换 var a=(12.002)|0;//12 使用~~快速转换 ~取反运算符,2=0010,~2=1101,因为第一位 ...