【题目链接】:http://hihocoder.com/problemset/problem/1488

【题意】



中文题

【题解】



莫队算法+树状数组;

首先贪心地知道,应该按照时间从小到大的顺序打水;

可以发现;

新增加一个人打水的话,对时间小于它的人打水没有影响;

只对时间大于它的人打水的时间有影响;

具体的;

对于时间大于它的打水的人的个数*这个人打水的时间;是新增加的打水时间;

然后同时还要加上这个人单独打水的时间;

即在它前面(时间比它小的打水的人)的所有打水时间总和+这个人的打水时间就是这个人的单独打水时间;

同样的道理

减去一个人也只会对它后面的人造成影响;

前面的人不受影响;

再减去它自身就可以了;

既然能够知道减少一个或者多一个人对答案的影响了;

则直接用莫队算法搞就好了



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 2e4+100; struct abc
{
int l,r,id;
}; int n,m,a[N],l,r,num;
LL bit[N],bit2[N],ans,out[N];
abc b[N]; int lowbit(int x)
{
return x&(-x);
} bool cmp(abc a,abc b)
{
if (a.l/100==b.l/100)
return a.r < b.r;
else
return a.l < b.l;
} void add(int x,int key)
{
if (key==1)
{
int y = x-1;
LL sum = 0,cnt = 0;
while (y>0)
{
sum+=bit[y];
cnt+=bit2[y];
y-=lowbit(y);
}
ans+=sum+x+(num-cnt)*x;
y = x;
while (y<N-10)
{
bit[y]+=x;
bit2[y]++;
y+=lowbit(y);
}
num++;
}
else
{
int y = x-1;
LL sum = 0,cnt = 0;
while (y>0)
{
sum+=bit[y];
cnt+=bit2[y];
y-=lowbit(y);
}
ans-=sum+x+(num-cnt-1)*x;
y = x;
while (y<N-10)
{
bit[y]-=x;
bit2[y]--;
y+=lowbit(y);
}
num--;
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
int T;
cin >> T;
while (T--)
{
rep1(i,0,N-10)
bit[i] = bit2[i] = 0;
cin >> n >> m;
rep1(i,1,n) cin >> a[i];
rep1(i,1,m)
{
cin >> b[i].l >> b[i].r;
b[i].id = i;
}
sort(b+1,b+1+m,cmp);
l = 1,r = 1,ans = 0,num = 0;
add(a[l],1);
rep1(i,1,m)
{
while (r<b[i].r) add(a[++r],1);
while (l>b[i].l) add(a[--l],1);
while (r>b[i].r) add(a[r--],-1);
while (l<b[i].l) add(a[l++],-1);
out[b[i].id] = ans;
}
rep1(i,1,m) cout << out[i] << endl;
}
return 0;
}

【[Offer收割]编程练习赛11 D】排队接水的更多相关文章

  1. hihocoder offer收割编程练习赛11 D 排队接水

    思路: 莫队算法+树状数组. 莫队算法的基本思想是对大量要查询的区间进行离线处理,按照一定的顺序计算,来降低复杂度.概括来说,我们在知道了[l, r]的解,并且可以通过一个较低的复杂度推出[l - 1 ...

  2. hihocoder offer收割编程练习赛11 C 岛屿3

    思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x ...

  3. hihocoder offer收割编程练习赛11 B 物品价值

    思路: 状态压缩 + dp. 实现: #include <iostream> #include <cstdio> #include <cstring> #inclu ...

  4. hihocoder offer收割编程练习赛11 A hiho字符串

    思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: #include <iostream> #include <cstdio> #includ ...

  5. 【[Offer收割]编程练习赛11 B】物品价值

    [题目链接]:http://hihocoder.com/problemset/problem/1486 [题意] [题解] 设f[i][j]表示前i个物品,每种属性的状态奇偶状态为j的最大价值; 这里 ...

  6. 【[Offer收割]编程练习赛11 C】岛屿3

    [题目链接]:http://hihocoder.com/problemset/problem/1487 [题意] 中文题 [题解] 岛屿的数目对应了这个图中联通块的数目; 面积则对应有多少个方块; 周 ...

  7. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  8. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  9. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

随机推荐

  1. web动画小结

    前端写动画,无非两种方案,一种是通过css,另一种是js css的方案: 1.transform的单独使用 (IE9+) rotate(90deg) 2d旋转,也可以理解为沿着3D的Z轴旋转 rota ...

  2. [Swift]LeetCode1066. 校园自行车分配 II | Campus Bikes II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. Struts和Spring MVC的比较(非原创)

    文章大纲 一.Spring MVC项目例子二.Struts项目例子三.Struts和Spring MVC对比四.参考文章   一.Spring MVC项目例子 https://www.jianshu. ...

  4. itext 生成pdf文档 小结(自己备忘)

    1.引入maven <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf& ...

  5. Java 自定义线程池

    Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...

  6. MemcachedClient 使用说明

    上一篇介绍了Memcached基本使用方法<Memcached使用手册>,下面介绍java如何操作memcached.使用的是java_memcached-release_2.6.6. 一 ...

  7. Android点击跳转到淘宝的某一商品详情页或者某一店铺页面

    最近项目的有个需求是点击购买资料按钮进入淘宝界面,简单分析一下,如果用户手机有淘宝就打开淘宝的页面,没有的话也可以选择使用webView进行展示,还是使用手机浏览器进行展示. 判断有无淘宝的代码就不贴 ...

  8. 【Linux】ubuntu中怪异的vi编辑器

    由于前几天一场windows系统的比特币勒索病毒,我下狠心装了Linux的ubuntu版本.可是今天在使用命令行中的vi编辑器时出现了怪异的现象:backspace不能删除,编辑模式回车随机出现字母. ...

  9. XML、集合、JSP综合练习

    一.利用DOM解析XML文件得到信息:存入泛型集合中在JSP页面循环打印读取的信息 a)         编写XML文件:添加测试节点数据 b)         建立web项目:在JSP页面中使用DO ...

  10. 【C++】四种排序算法的时间比较

    四种排序算法的时间比较 [注]clock函数对输入(用户输入)元素N排序的计时 #include<iostream> #include<time.h> using namesp ...