F - 回转寿司 (权值线段树)

题目链接:https://cn.vjudge.net/contest/281960#problem/F

题目大意:中文题目

具体思路:权值线段树,我们每次寻找的是满足 (i<j)   L<=s[i]-s[j]<=R.转换一下,就是 s[j]-R<=s[i]<=s[j]-L。这样的话,我们每一次寻找满足情况的合数就可以了。

ps:第一次做权值线段树,感觉这东西和线段树差不多,只不过每一个区间表示成了具体的值有多少个。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 10000000000ll
 5 # define lson l,m,rt<<1
 6 # define rson m+1,r,rt<<1|1
 7 const int maxn = 8e6+5;
 8 int son[maxn][2];
 9 ll siz[maxn];
10 int tot,rt;
11 void update(int &x,ll l,ll r,ll val)
12 {
13     if(!x)// 如果这一段区间之前没有过,编号
14         x=++tot;
15     siz[x]++;
16     if(l==r)
17         return ;
18     ll m=(l+r)>>1;
19     if(val<=m)
20         update(son[x][0],l,m,val);
21     else if(val>m)
22         update(son[x][1],m+1,r,val);
23 }
24 ll query(int x,ll l,ll r,ll L,ll R)
25 {
26     if(!x)
27         return 0;
28     if(l==L&&R==r)//查询的时候注意,如果查询到底的话,会超时
29     {
30         return siz[x];
31     }
32     ll m=(l+r)>>1;
33      if(R<=m)
34         return query(son[x][0],l,m,L,R);
35     else if(L>m)
36         return query(son[x][1],m+1,r,L,R);
37     else
38         return query(son[x][0],l,m,L,m)+query(son[x][1],m+1,r,m+1,R);
39 }
40 int main()
41 {
42     int  n,l,r;
43     scanf("%d %d %d",&n,&l,&r);
44     ll tmp=0,sum=0,ans=0;
45     for(int i=1; i<=n; i++)
46     {
47         update(rt,-inf,inf,sum);
48         scanf("%lld",&tmp);
49         sum+=tmp;
50         ans+=query(rt,-inf,inf,max(-inf,sum-r),min(sum-l,inf));
51    //  cout<<tmp<<endl;
52     }
53     printf("%lld\n",ans);
54     return 0;
55 }

原文地址:https://www.cnblogs.com/letlifestop/p/10355510.html

时间: 2024-11-24 02:10:56

F - 回转寿司 (权值线段树)的相关文章

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

P2234 [HNOI2002]营业额统计 (权值线段树)

P2234 [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 当最小波动值越大

【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结点的权值线段树之间毫无关联 可以看这个:http://blog.csdn.net/popoqqq/article/details/40108669?utm_source=tuicool #include<cstdio> #include<algorithm> using namespa

【BZOJ-2892&amp;1171】强袭作战&amp;大sz的游戏 权值线段树+单调队列+标记永久化+DP

2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] Description 在一个没有冬马的世界里,经历了学园祭后的春希着急着想要见到心爱的雪菜.然而在排队想见雪菜的fans太多了,春希一时半会凑不到雪菜面前. 作为高帅富,这样的问题怎么能难倒春希?春希从武也手中拿到了取自金闪闪宝库里的多啦A梦的传话筒,并且给每一个排队的fans都发了一个传话筒. 于

【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树

Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 之前没怎么接触过权值线段树(非主席树),这次就当学习了一下吧.一开始还把题意理解错了,我的天啊-- 起初思考了好久,发现不知道怎么处理负数的情况,不过数据里并没有负数? 权值线段树的每个节点表示一个区间[L,R],存储原序列中权值为[L,R]的元素的信息,所以这里的权值线段树每个节点上都是一棵普通线段树,就是负责统计原序列中权值为[L,R]的元素的个数. 每次插入一个相同的值x时就相当于

bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除一个相同的量.我真不知道除了调工资他还做什么其它事情.工资的频繁调

动态求区间K大值(权值线段树)

我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和前一颗树没有关系,so,并不需要可持久化,一个朴素的权值线段树就可以啦. 我们知道普通的线段树是刚开始就把所有的节点都开了,但我们发现并不需要,因为每个点里的操作并不是很多,很大一部分的节点是用不到的,那么我们就可以不开.用Ls 和 Rs 来记左右儿子的地址,随用随开即可. #include<bit

【权值线段树】离散化介绍 (+利用 线段树 求逆序对)

先介绍一下离散化 桶排大家应该知道,就是开一个数组(下标为数值,记录了该数值的出现次数)然后遍历过去如果出现次数不为零,那就输出这些数字,理论时间复杂度可以达到O(N)但是由于内存限制,不能开很大的数组. 然而 如果某个数列中的数字不要求大小确定,只要求这些数字有相对的大小就够了的话,离散化就有了用武之地 举个例子:数列 3 8 7 5 2000000000000000 我们发现有几个数之间差距很大,但是我们用不到数值的大小,只要求相对大小,那怎么办呢? 观察下面的数列: 1 4 3 2 5 真

HDU 6464 /// 权值线段树

题目大意: 共Q次操作 操作有两种 操作一 在序列尾部加入f[i]个s[i] 操作二 查询序列第f[i]小到第s[i]小之间的总和 离线操作 把序列内的值离散化 然后利用离散化后的值 在线段树上对应权值操作 权值线段树维护权值对应的值的个数和总和 查询 用s[i]的前缀和减去f[i]-1的前缀和 具体看注释 #include <bits/stdc++.h> using namespace std; #define LL long long #define INF 0x3f3f3f3f #def