线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛
题目描述
妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活。
换用更高尚的说法,是随时准备着为这个无药可救的世界献身。
然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂漫的生活,自然也无暇考虑什么拯救世界之类的重任。
有一天小妖精们又在做游戏。这个游戏是这样的。
妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。
每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?
比如储物点i有x个东西,要运到储物点j,代价为
\(x×dist(i,j)\)
dist就是仓库间的距离。
当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模。
输入输出格式
输入格式:
第一行两个数表示n,m
第二行n−1个数,第i个数表示第i个储物点与第i+1个储物点的距离
第三行n个数,表示每个储物点的东西个数
之后m行每行三个数
x l r
表示查询要把区间[l,r]储物点的物品全部运到储物点x的花费
输出格式:
对于每个询问输出一个数表示答案
对于输入的距离,我们可以通过前缀和求出每个点的具体位置。
这样我们就可以知道任意两个点的距离了。
然后发现这道题没有修改操作,(好吧其实也没什么用。。。)
查询的话,推个式子就好了。
\]
一开始的时候,我是这么推得,(错的。)
\\=abs(\sum_{i=l}^ra(i)*dis(i)-\sum_{i=l}^ra(i)*dis[x])
\]
显然,对于abs的处理是错误的。
那么思博了一下,发现自己想的简单了,需要分情况讨论。
所以可以得出三个式子:
一、 x<l 时
\\=\sum_{i=l}^ra(i)*dis(i)-dis(x)*\sum_{i=l}^ra(i)
\]
二、\(x>r\)时
\\=dis(x)*\sum_{i=l}^ra(i)-\sum_{i=l}^ra(i)*dis(i)
\]
三、\(l\leq x\leq r\)时
\]
就可以发现\(\sum\)里面只有\(a(i)\)和\(a(i)*dis(i)\),那么直接线段树维护套上式子就可以了。
另外,难得思博。。。
#include<iostream>
#include<cstdio>
#define ls(o) o<<1
#define rs(o) o<<1|1
#define int long long
using namespace std;
const int wx=1000017;
const int mod=19260817;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
return sum*f;
}
struct val_tree{
int l,r,sum1,sum2,tag;
#define sum1(o) t[o].sum1
#define sum2(o) t[o].sum2
#define tag(o) t[o].tag
}t[wx*4];
int a[wx];
int dis[wx],w[wx];
int n,m;
int Abs(int a){
if(a<0)return -a;
return a;
}
void up(int o){
sum1(o)=(sum1(ls(o))+sum1(rs(o)))%mod;
sum2(o)=(sum2(ls(o))+sum2(rs(o)))%mod;
}
void build(int o,int l,int r){
t[o].l=l;t[o].r=r;
if(l==r){sum1(o)=a[l]%mod;sum2(o)=(a[l]%mod*w[l]%mod)%mod;return;}
int mid=t[o].l+t[o].r>>1;
if(l<=mid)build(ls(o),l,mid);
if(r>mid)build(rs(o),mid+1,r);
up(o);
// printf("%d %d %d %d\n",t[o].l,t[o].r,sum1(o),sum2(o));
}
int query_a(int o,int l,int r){
if(l<=t[o].l&&t[o].r<=r){
return sum1(o)%mod;
}
int mid=t[o].l+t[o].r>>1;
int sum=0;
if(l<=mid)sum+=query_a(ls(o),l,r),sum%=mod;
if(r>mid)sum+=query_a(rs(o),l,r),sum%=mod;
return sum%mod;
}
int query_b(int o,int l,int r){
if(l<=t[o].l&&t[o].r<=r){
return sum2(o)%mod;
}
int mid=t[o].l+t[o].r>>1;
int sum=0;
if(l<=mid)sum+=query_b(ls(o),l,r),sum%=mod;
if(r>mid)sum+=query_b(rs(o),l,r),sum%=mod;
return sum%mod;
}
signed main(){
// freopen("001.in","r",stdin);
n=read();m=read();
for(int i=1;i<n;i++)dis[i]=read();
w[1]=1;
for(int i=2;i<=n;i++)w[i]=w[i-1]+dis[i-1];
for(int i=1;i<=n;i++)w[i]%=mod;
for(int i=1;i<=n;i++)a[i]=read()%mod;
build(1,1,n);
for(int i=1;i<=m;i++){
int x,l,r;
x=read();l=read();r=read();
if(x<l){
printf("%lld\n",(query_b(1,l,r)-((query_a(1,l,r))%mod*(w[x]%mod))%mod+20*mod)%mod);
}
else if(x>r){
printf("%lld\n",(((query_a(1,l,r))%mod*(w[x]%mod))%mod-query_b(1,l,r)+20*mod)%mod);
}
else{
printf("%lld\n",(((query_a(1,l,x-1)%mod)*(w[x]%mod))%mod-query_b(1,l,x-1)+query_b(1,x+1,r)-((query_a(1,x+1,r)%mod)*(w[x]%mod))%mod+20*mod)%mod);
}
}
return 0;
}
线段树 洛谷P3932 浮游大陆的68号岛的更多相关文章
- [洛谷P3932]浮游大陆的68号岛
题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...
- P3932 浮游大陆的68号岛 【线段树】
P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...
- P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完 ...
- [Luogu3932] 浮游大陆的68号岛
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...
- noip模拟赛 浮游大陆的68号岛
题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...
- LuoguP3932 浮游大陆的68号岛 题解
Content 在一个无限长的数轴上有 \(n\) 个点.第 \(i\) 个点上面有 \(a_i\) 件物品,且第 \(i\) 个点到第 \(i+1\) 个点的距离为 \(b_i\). 定义从第 \( ...
- [线段树]洛谷P5278 算术天才⑨与等差数列
题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k ...
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...
- AC日记——校门外的树 洛谷 P1047
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
随机推荐
- java支付宝开发-异常-01-"sub_code":"isv.invalid-app-id","sub_msg":"无效的AppID参数"
一.现象 无论请求哪个接口都报这个错误 二.异常原因 后来检查了一下,发现是因为 我支付宝网关写错了.沙箱环境和正式环境 的支付宝网关不同,如下 //支付宝网关名-正式环境 //public stat ...
- Spring MVC表单提交
实际应用中,列表中的单条记录的修改,可能需要传很多对象参数到后台服务器,Spring MVC表单标签<form:> 提供了一种简洁的提交方式. <form id="form ...
- innerdb disable error
innodb=OFF ignore-builtin-innodb skip-innodbdefault-storage-engine=myisam default-tmp-storage-engine ...
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- Git远程克隆仓库出现Permission denied (publickey)
$ git clone git@github.com:DavidWanderer/test1.git Cloning into 'test1'... Warning: Permanently adde ...
- bzoj 3730 震波 —— 动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 建点分树,每个点记两个树状数组,存它作为重心管辖的范围内,所有点到它的距离情况和到它在 ...
- SQL SERVER 中的*=和=*
一.* =和= * 是在sql server2000中左连接,右连接的用法相当于left join 和right join,现在sql2005和2008默认是不支持的,可以设置兼容2000或2008 ...
- wpf 样式继承
当定义的wpf多个样式,其样式内容(属性.触发器等)有较多的重复时,可以考虑将其抽象成父样式,来提升样式代码的可维护性以及减少代码冗余. wpf 进行样式继承时,需要使用style的BasedOn属性 ...
- go语言执行windows下命令行的方法
转自:http://www.jb51.net/article/61727.htm 在golang里执行windows下的命令行,例如在golang里面调用 del d:\a.txt 命令 packag ...
- JSP介绍(4)--- JSP Cookie 处理
Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息. JSP脚本通过request对象中的getCookies()方法来访问这些cookie,这个方法会返回一个Cookie对象的数组. 通常 ...