2019 CCPC wannfly winter camp Day 5
C - Division
思路:我们考虑到一点,从大往小取得顺序是不会有问题的,所以可以直接主席树,但是开不下空间,我们可以log分段求。
- #include<bits/stdc++.h>
- #define LL long long
- #define fi first
- #define se second
- #define mk make_pair
- #define PLL pair<LL, LL>
- #define PLI pair<LL, int>
- #define PII pair<int, int>
- #define SZ(x) ((int)x.size())
- #define ull unsigned long long
- using namespace std;
- const int N = 1e5 + ;
- const int inf = 0x3f3f3f3f;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- const int mod = ;
- const double eps = 1e-;
- int n, q, all, hs[ * N], hcnt, a[N], bin[];
- LL ans[ * N], sum[N], csum[N];
- pair<PII, int> qus[ * N];
- vector<int> vc[][N];
- int root[ * N], tot;
- struct node {
- LL sum;
- int cnt, ls, rs;
- } o[ * N * ];
- void update(int p, int l, int r, int &x, int y) {
- x = ++tot;
- o[x] = o[y];
- o[x].sum += p;
- o[x].cnt++;
- if(l == r) return;
- int mid = l + r >> ;
- if(p <= hs[mid]) update(p, l, mid, o[x].ls, o[y].ls);
- else update(p, mid + , r, o[x].rs, o[y].rs);
- }
- LL query(int res, int l, int r, int x, int y) {
- if(o[x].cnt - o[y].cnt <= res) return o[x].sum - o[y].sum;
- if(l == r) return 1ll * res * hs[l];
- int mid = l + r >> , cntr = o[o[x].rs].cnt - o[o[y].rs].cnt;
- if(cntr >= res) return query(res, mid + , r, o[x].rs, o[y].rs);
- else return o[o[x].rs].sum - o[o[y].rs].sum + query(res-cntr, l, mid, o[x].ls, o[y].ls);
- }
- int main() {
- for(int i = bin[] = ; i <= ; i++) bin[i] = bin[i - ] << ;
- scanf("%d%d", &n, &q);
- for(int i = ; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i - ] + a[i];
- for(int i = ; i <= q; i++) {
- scanf("%d%d%d", &qus[i].fi.fi, &qus[i].fi.se, &qus[i].se);
- ans[i] = sum[qus[i].fi.se] - sum[qus[i].fi.fi - ];
- }
- for(int i = , j = ; i <= n; i++, j = ) {
- while(a[i]) {
- int val = a[i] - a[i] / ;
- while(val < bin[j]) j--;
- vc[j][i].push_back(val);
- a[i] /= ;
- }
- }
- for(int k = ; k >= ; k--) {
- tot = ; hcnt = ; all = ;
- for(int i = ; i <= n; i++) csum[i] = csum[i - ] + SZ(vc[k][i]);
- if(!csum[n]) continue;
- for(int i = ; i <= n; i++) for(auto& t : vc[k][i]) hs[++hcnt] = t;
- sort(hs + , hs + + hcnt); hcnt = unique(hs + , hs + + hcnt) - hs - ;
- for(int i = ; i <= n; i++) for(auto& t : vc[k][i]) update(t, , hcnt, root[all + ], root[all]), all++;
- for(int i = ; i <= q; i++) {
- if(!qus[i].se) continue;
- int L = qus[i].fi.fi, R = qus[i].fi.se, has = csum[R] - csum[L - ];
- if(has >= qus[i].se) {
- ans[i] -= query(qus[i].se, , hcnt, root[csum[R]], root[csum[L - ]]);
- qus[i].se = ;
- } else {
- ans[i] -= query(has, , hcnt, root[csum[R]], root[csum[L - ]]);
- qus[i].se -= has;
- }
- }
- }
- for(int i = ; i <= q; i++) printf("%lld\n", ans[i]);
- return ;
- }
- /*
- */
2019 CCPC wannfly winter camp Day 5的更多相关文章
- 2019 CCPC wannfly winter camp Day 8
E - Souls-like Game 直接线段树合并矩阵会被卡T掉,因为修改的复杂度比询问的复杂度多一个log,所以我们考虑优化修改. 修改的瓶颈在于打lazy的时候, 所以我们预处理出每个修改矩阵 ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 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 ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 2020 CCPC Wannafly Winter Camp Day1-F-乘法
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- 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 ...
随机推荐
- HGOI20181030 模拟题解
problem:给定一个序列,问你能不能通过一次交换把他弄成有序 sol: 对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!) 对于100%的数据,显然我们先对数列进行排序然后上下 ...
- JavaScript -- 标签 , Break 和 Continue 语句
break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. 标签引用,break 语句可用于跳出任何 JavaScript 代码块. demo: <!DOCTYPE html& ...
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- log4j常见配置
依赖jar <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId ...
- swift学习笔记3
1.在 Swift 中,枚举类型是一等(first-class)类型.它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的 ...
- Codeforces 906 D. Power Tower
http://codeforces.com/contest/906/problem/D 欧拉降幂 #include<cstdio> #include<iostream> usi ...
- 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] 斜率 ...
- Spring RedisTemplate操作-Set操作(5)
@Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...
- [转载]五理由 .NET开发者应该关注HTML 5
http://developer.51cto.com/art/201107/275039.htm
- 一些js的小技巧
这里收集了一些编码上的小技巧,大家可以学习学习. 1.浮点转整型 使用|0快速转换 var a=(12.002)|0;//12 使用~~快速转换 ~取反运算符,2=0010,~2=1101,因为第一位 ...