HihoCoder 1488 : 排队接水(莫队+树状数组)
描述
有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟。
由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小。
小Hi总共会有m次询问,你能帮助他解决这个问题吗?
假设3个小朋友接水的时间分别是2,3,4。如果他们依次接水,第一位小朋友等待加接水的时间是2,第二位小朋友是5,第三位小朋友是9。时间总和是16。
输入
第一行一个数T(T<=10),表示数据组数
对于每一组数据:
第一行两个数n,m(1<=n,m<=20,000)
第二行n个数a1...an,表示每个小朋友接水所需时间(ai<=20,000)
接下来m行,每行两个数l和r
输出
对于每次询问,输出一行一个整数,表示答案。
样例输入
1
4 2
1 2 3 4
1 2
2 4
样例输出
4
16
思路:贪心可知,时间小的在前。但是排序是不可能的,需要更高效的方法,注意到ai<=2e5,适合用树状数组记录a[i]的个数前缀和,以及a[i]的前缀和。
可以离线,所以用莫队+树状数组,莫队的话,第一次写这中数学类型的转移,开始还有点抵触,但是拿出笔一划,公式也不难。
对于暴力的公式,即L<=i<=R的所有i的前缀和:
for(i=L;i<=R;i++)
for(j=L;j<=i;j++)
sum+=a[j];
那么现在加一个第i=x进去,则对新的 i=x,需要多累加前缀:
for(j=L;j<=x;j++)
sum+=a[j];
对于后面的i>=x,都需要累加一个j=x,即a[x]*后面的个数。
for(i=x;i<=R;i++)
for(j=L;j<=i;j++)
sum+=a[j];
然后把上面的转化为树状数组的前缀和即可。 两个树状数组,分别记录个数和累加和。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn=;
ll a[maxn+],num[maxn+],cnt,B,l,r,tmp;
ll sum[maxn+];
struct in{ ll L;ll R;ll id; ll ans;}s[maxn+];
bool cmp(in x,in y){ if(x.L/B==y.L/B) return x.R/B<y.R/B; return x.L/B<y.L/B; }
bool cmp2(in x,in y){ return x.id<y.id;}
void update(){ cnt=; memset(num,,sizeof(num));memset(sum,,sizeof(sum)); }
void addnum(ll x,ll y) { while(x<=maxn){ num[x]+=y; x+=(-x)&x; } }
void addsum(ll x,ll y) { while(x<=maxn){ sum[x]+=y; x+=(-x)&x; } }
int querynum(int x){ ll res=; while(x>){ res+=num[x]; x-=(-x)&x;} return res; }
int querysum(int x){ ll res=; while(x>){ res+=sum[x]; x-=(-x)&x;} return res;}
int main()
{ ll T,n,m,i;ll tsum;
scanf("%d",&T);
while(T--){
update();
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++) scanf("%lld",&a[i]);
for(i=;i<=m;i++) s[i].id=i,scanf("%lld%lld",&s[i].L,&s[i].R);
B=sqrt(n);
sort(s+,s+m+,cmp);
l=r=; tmp=a[]; addnum(a[],); addsum(a[],a[]);
for(i=;i<=m;i++){
while(l<s[i].L){
tsum=querysum(a[l]);
tmp-=tsum;
tmp-=(querynum(maxn)-querynum(a[l]))*a[l];
addnum(a[l],-);
addsum(a[l],-a[l]);
l++;
}
while(l>s[i].L){
l--;
addnum(a[l],);
addsum(a[l],a[l]);
tsum=querysum(a[l]);
tmp+=tsum;
tmp+=(querynum(maxn)-querynum(a[l]))*a[l];
}
while(r<s[i].R){
r++;
addnum(a[r],);
addsum(a[r],a[r]);
tsum=querysum(a[r]);
tmp+=tsum;
tmp+=(querynum(maxn)-querynum(a[r]))*a[r];
}
while(r>s[i].R){
tsum=querysum(a[r]);
tmp-=tsum;
tmp-=(querynum(maxn)-querynum(a[r]))*a[r];
addnum(a[r],-);
addsum(a[r],-a[r]);
r--;
}
s[i].ans=tmp;
}
sort(s+,s+m+,cmp2);
for(i=;i<=m;i++) printf("%lld\n",s[i].ans);
}
return ;
}
HihoCoder 1488 : 排队接水(莫队+树状数组)的更多相关文章
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- BZOJ 3236 莫队+树状数组
思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...
随机推荐
- C# 通过WebService方式 IIS发布网站 上传文件到服务器[转]
http://blog.sina.com.cn/s/blog_517cae3c0102v0y7.html 应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发 ...
- NN优化方法对照:梯度下降、随机梯度下降和批量梯度下降
1.前言 这几种方法呢都是在求最优解中常常出现的方法,主要是应用迭代的思想来逼近.在梯度下降算法中.都是环绕下面这个式子展开: 当中在上面的式子中hθ(x)代表.输入为x的时候的其当时θ參数下的输出值 ...
- MySQL 压缩解决方案
From:https://www.qcloud.com/community/article/876100 导语 描述 MySQL 压缩的使用场景和解决方案,包括压缩传输协议.压缩列解决方案和压缩表解决 ...
- 8款精美的HTML5图片动画分享
From:http://geek.csdn.net/news/detail/196250 HTML5结合jQuery可以让网页图片变得更加绚丽多彩,比如实现一些图片3D切换.CSS3动画绘制以及各种图 ...
- Codeforces Round #267 (Div. 2) B. Fedor and New Game
After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...
- 简单vi配置:YouCompleteMe
下图就是我的VI: 按F5 F6分别调出左右的窗体: 按C-P点出CtrlP搜索,直接查找project中的文件: 自己主动补全用的YouCompleteMe.超级强悍: watermark/2/te ...
- C# winform ListView 的右键菜单的下级菜单的选项视情况禁用方法
ListView 和右键菜单例如以下图: 要实现功能是: 1.用户状态为[活动]时,改动用户状态为[活动]禁用,反之则反. 2.而且仅仅实用户状态为[非活动]时,[删除学员用户]才是可用状态. 功能非 ...
- React - S1
资料: 1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 进度: 教程 - 高级内容remaining; 参考remaining j ...
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
EasyDarwin现有架构介绍 EasyDarwin的现有架构对网络事件的处理是这样的,每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session,不论是RTSP服务对应的 ...
- Nothing but the key 属性全部依赖于主键 third norm form
全依赖 Designs that Violate 1NF CustomerCustomer ID First Name Surname Telephone Number123 Pooja Singh ...