洛谷3707 [SDOI2017] 相关分析 【线段树】
分析:
化简一下就行了,注意一下平方和公式的运用以及精度的误差。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn = ;
- int n,m;
- int x[maxn],y[maxn];
- struct node{
- int lazx1,lazx2,lazy1,lazy2;
- double multi,sumx,sumy,sqr;
- }T[maxn<<];
- long long ump(int l,int r){
- return (1ll*r*(r+)*(*r+)-1ll*(l-)*l*(*l-))/;
- }
- void fugai(int now,int tl,int tr,int s,int t){
- T[now].lazx2 = T[now].lazy2 = ;
- T[now].lazx1 = s; T[now].lazy1 = t;
- T[now].sumx = 1ll*((s+tl)+(s+tr))*(tr-tl+)/;
- T[now].sumy = 1ll*((t+tl)+(t+tr))*(tr-tl+)/;
- T[now].sqr = 1ll*(tr-tl+)*s*s+1ll*s*(tl+tr)*(tr-tl+)+ump(tl,tr);
- T[now].multi=1ll*(tr-tl+)*s*t+1ll*(s+t)*(tl+tr)*(tr-tl+)/+ump(tl,tr);
- }
- void add(int now,int tl,int tr,int s,int t){
- T[now].lazx2+=s;T[now].lazy2 += t;
- T[now].multi+=1ll*s*T[now].sumy+1ll*t*T[now].sumx+1ll*s*t*(tr-tl+);
- T[now].sqr +=1ll*s*s*(tr-tl+)+2ll*s*T[now].sumx;
- T[now].sumx += 1ll*s*(tr-tl+); T[now].sumy += 1ll*t*(tr-tl+);
- }
- void push_up(int now){
- T[now].multi = T[now<<].multi+T[now<<|].multi;
- T[now].sumx = T[now<<].sumx+T[now<<|].sumx;
- T[now].sumy = T[now<<].sumy+T[now<<|].sumy;
- T[now].sqr = T[now<<].sqr+T[now<<|].sqr;
- }
- void push_down1(int now,int tl,int tr){
- int mid = (tl+tr)/;
- fugai(now<<,tl,mid,T[now].lazx1,T[now].lazy1);
- fugai(now<<|,mid+,tr,T[now].lazx1,T[now].lazy1);
- T[now].lazx1 = T[now].lazy1 = ;
- }
- void push_down2(int now,int tl,int tr){
- int mid = (tl+tr)/;
- add(now<<,tl,mid,T[now].lazx2,T[now].lazy2);
- add(now<<|,mid+,tr,T[now].lazx2,T[now].lazy2);
- T[now].lazx2 = T[now].lazy2 = ;
- }
- void read(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)scanf("%d",&x[i]);
- for(int i=;i<=n;i++) scanf("%d",&y[i]);
- }
- node merge(node ai,node bi){
- return (node){,,,,ai.multi+bi.multi,ai.sumx+bi.sumx,ai.sumy+bi.sumy,ai.sqr+bi.sqr};
- }
- void build_tree(int now,int l,int r){
- if(l == r){
- T[now].lazx1 = T[now].lazy1 = ;
- T[now].multi = 1ll*x[l]*y[l];
- T[now].sumx = x[l];T[now].sumy = y[l];
- T[now].sqr = 1ll*x[l]*x[l];
- }else{
- int mid = (l+r)/;
- build_tree(now<<,l,mid);
- build_tree(now<<|,mid+,r);
- T[now].lazx1 = T[now].lazy1 = ;
- push_up(now);
- }
- }
- node Query(int now,int tl,int tr,int l,int r){
- if(tl >= l && tr <= r){return T[now];}
- if(tl > r || tr < l){return (node){,,,,,,,};}
- if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
- if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
- int mid = (tl+tr)/;
- node ans = merge(Query(now<<,tl,mid,l,r),Query(now<<|,mid+,tr,l,r));
- push_up(now);
- return ans;
- }
- void Modify1(int now,int tl,int tr,int l,int r,int s,int t){
- if(tl >= l && tr <= r){
- add(now,tl,tr,s,t);
- return;
- }
- if(tl > r || tr < l){return;}
- if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
- if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
- int mid = (tl+tr)/;
- Modify1(now<<,tl,mid,l,r,s,t);
- Modify1(now<<|,mid+,tr,l,r,s,t);
- push_up(now);
- }
- void Modify2(int now,int tl,int tr,int l,int r,int s,int t){
- if(tl >= l && tr <= r){
- fugai(now,tl,tr,s,t);
- return;
- }
- if(tl > r || tr < l){return;}
- if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
- if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
- int mid = (tl+tr)/;
- Modify2(now<<,tl,mid,l,r,s,t);
- Modify2(now<<|,mid+,tr,l,r,s,t);
- push_up(now);
- }
- void work(){
- build_tree(,,n);
- for(int i=;i<=m;i++){
- int cas; scanf("%d",&cas);
- if(cas == ){
- int l,r; scanf("%d%d",&l,&r);
- node forw = Query(,,n,l,r);
- double pjx = 1.0*forw.sumx/(r-l+),pjy = 1.0*forw.sumy/(r-l+);
- double res=forw.multi+pjx*pjy*(r-l+)-pjx*forw.sumy-pjy*forw.sumx;
- res /= 1.0*(forw.sqr+pjx*pjx*(r-l+)-2.0*pjx*forw.sumx);
- printf("%.10lf\n",res);
- }else{
- if(cas == ){
- int l,r,s,t; scanf("%d%d%d%d",&l,&r,&s,&t);
- Modify1(,,n,l,r,s,t);
- }else{
- int l,r,s,t; scanf("%d%d%d%d",&l,&r,&s,&t);
- Modify2(,,n,l,r,s,t);
- }
- }
- }
- }
- int main(){
- read();
- work();
- return ;
- }
洛谷3707 [SDOI2017] 相关分析 【线段树】的更多相关文章
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- 洛谷P5111 zhtobu3232的线段树
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试
1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...
- poj2226 Muddy Fields 填充棒子(二分匹配)
参考博客:https://blog.csdn.net/liujc_/article/details/51287019 参考博客:https://blog.csdn.net/acdreamers/art ...
- 用python表白了!!!
用python 画一颗心,代码: import numpy as np import matplotlib.pyplot as plt x = np.linspace(-8 , 8, 1024) ...
- Echarts x轴文本内容太长的几种解决方案
Echarts 标签中文本内容太长的时候怎么办 ? - 1对文本进行倾斜 在xAxis.axisLabe中修改rotate的值 xAxis: { data: ["衬衫11111", ...
- jmeter接口测试------基础笔记
1.postman发送json格式的post请求,直接放链接 row里面body放请求参数,得到请求结果 2.jmeter请求json时需要注意在请求前创建http信息头管理器,然后信息头添加一条名称 ...
- sql之cursor的简介和字符串拆分(split)与游标的使用
字符串拆分(split)与游标的使用 CREATE TABLE Plates ( ,), ) NOT NULL, [BusinessId] INT NOT NULL, ) ),),), SELECT ...
- 对B+树,B树,红黑树的理解
出处:https://www.jianshu.com/p/86a1fd2d7406 写在前面,好像不同的教材对b树,b-树的定义不一样.我就不纠结这个到底是叫b-树还是b-树了. 如图所示,区别有以下 ...
- liunx 运维知识二部分
Windows下的目录和Linux系统下的目录有什么区别? Windows目录下的文件一般都是分区(C盘,D盘...),C盘下面有什么目录,目录下面还有其他目录加上文件. Linux系统目录结构一切都 ...
- java中的a++与++a的区别
++a:如果++在前就会先把a+1. a++:如果++在后就会先a然后在执行++的操作.代码: int a = 1; System.out.pritln(++a); //输出2 int s = 1; ...
- Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战
一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...