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的更多相关文章

  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. 基于Spark Mllib的文本分类

    基于Spark Mllib的文本分类 文本分类是一个典型的机器学习问题,其主要目标是通过对已有语料库文本数据训练得到分类模型,进而对新文本进行类别标签的预测.这在很多领域都有现实的应用场景,如新闻网站 ...

  2. HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)

    前缀数组其实就是有序的,那么答案显然是      我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知  令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...

  3. 如何整合Office Web Apps至自己开发的系统(一)

    在前面我的一篇博客中 Office Web Apps安装部署(一),有一张介绍Office Web Apps与其他系统的关系图,   从上述图中,可知实际上Office Web Apps也是可以接入自 ...

  4. LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)

    哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...

  5. C# 分析 IIS 日志(Log)

    由于最近又要对 IIS日志 (Log) 分析,以便得出各个搜索引擎每日抓取的频率,所以这两天一直在尝试各个办法来分析 IIS 日志 (Log),其中尝试过:导入数据库.Log parser.Powse ...

  6. 图像处理之规则裁剪(Resize)

    1 图像裁剪 在实际工作中,经常需要根据研究工作要求对图像进行裁剪(Subset Image),按照实际图像分幅裁剪的过程,可以将图像分幅裁剪分为两种类型:规则分幅裁剪(Rectangle Subse ...

  7. node的path.join 和 path.resolve的区别

    直接上图: join resolve 明显可以看出,join只会帮你把路径连接起来,而resolve会以当前路径为父路径来把你提供的路径连接起来

  8. logback常见配置

    依赖jar包 <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> <dependency& ...

  9. jQuery1.11源码分析(2)-----Sizzle源码中的正则表达式[原创]

    看完了上篇,对Sizzle有了一个大致的了解,我们接下来就可以正式开始啃Sizzle的源码了.上来就讲matcher难度太大,先来点开胃菜,讲讲Sizzle中的各个正则表达式的作用吧(本来还想讲初始化 ...

  10. Jenkins mac pkg安装 后默认配置文件/启动路径

    自启动文件路径 /Library/LaunchDaemons/org.jenkins-ci.plist jenkins.war 执行文件路径 /Applications/Jenkins/jenkins ...