AC日记——[SDOI2017]相关分析 洛谷 P3707

时间:2022-09-15 15:53:04

[SDOI2017]相关分析

思路:

  裸线段树;

  (玄学ac);

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct TreeNodeType {
int l,r,mid;
double flagx2,flagy2,flagx3,flagy3,size;
double sumx,sumy,suml,sumxy,sumx2,sumy2,suml2;
bool if_3;
inline void updata2(double posx,double posy)
{
sumx2+=size*posx*posx+*posx*sumx;
sumy2+=size*posy*posy+*posy*sumy;
sumxy+=size*posx*posy+sumx*posy+sumy*posx;
sumx+=size*posx,sumy+=size*posy;
flagx2+=posx,flagy2+=posy;
}
inline void updata3(double posx,double posy)
{
sumxy=size*posx*posy+suml*(posx+posy)+suml2;
sumx2=size*posx*posx+posx**suml+suml2;
sumy2=size*posy*posy+posy**suml+suml2;
sumx=size*posx+suml,sumy=size*posy+suml;
if_3=true,flagx3=posx,flagy3=posy;
flagx2=,flagy2=;
}
};
struct TreeNodeType tree[maxn<<];
int n,m;
double Sumx,Sumy,Sumx2,Sumy2,Sumxy,ai[maxn],bi[maxn];
inline void updata(int now)
{
tree[now].sumx=tree[now<<].sumx+tree[now<<|].sumx;
tree[now].sumy=tree[now<<].sumy+tree[now<<|].sumy;
tree[now].suml=tree[now<<].suml+tree[now<<|].suml;
tree[now].sumxy=tree[now<<].sumxy+tree[now<<|].sumxy;
tree[now].sumx2=tree[now<<].sumx2+tree[now<<|].sumx2;
tree[now].sumy2=tree[now<<].sumy2+tree[now<<|].sumy2;
tree[now].suml2=tree[now<<].suml2+tree[now<<|].suml2;
}
void build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r,tree[now].size=r-l+;
if(l==r)
{
tree[now].sumx=ai[l],tree[now].sumy=bi[l],tree[now].suml=l;
tree[now].sumxy=ai[l]*bi[l],tree[now].suml2=(double)l*l;
tree[now].sumx2=ai[l]*ai[l],tree[now].sumy2=bi[l]*bi[l];
return;
}
tree[now].mid=l+r>>;
build(now<<,l,tree[now].mid);
build(now<<|,tree[now].mid+,r);
updata(now);
}
inline void pushdown(int now)
{
if(tree[now].if_3)
{
tree[now].if_3=false;
tree[now<<].updata3(tree[now].flagx3,tree[now].flagy3);
tree[now<<|].updata3(tree[now].flagx3,tree[now].flagy3);
}
if(tree[now].flagx2||tree[now].flagy2)
{
tree[now<<].updata2(tree[now].flagx2,tree[now].flagy2);
tree[now<<|].updata2(tree[now].flagx2,tree[now].flagy2);
tree[now].flagx2=,tree[now].flagy2=;
}
}
void operation1(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
Sumx+=tree[now].sumx,Sumy+=tree[now].sumy;
Sumx2+=tree[now].sumx2,Sumy2+=tree[now].sumy2;
Sumxy+=tree[now].sumxy;return;
}
if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
if(l<=tree[now].mid) operation1(now<<,l,r);
if(r>tree[now].mid) operation1(now<<|,l,r);
}
void operation2(int now,int l,int r,double s,double t)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
tree[now].updata2(s,t);
return;
}
if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
if(l<=tree[now].mid) operation2(now<<,l,r,s,t);
if(r>tree[now].mid) operation2(now<<|,l,r,s,t);
updata(now);
}
void operation3(int now,int l,int r,double s,double t)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
tree[now].updata3(s,t);
return;
}
if(tree[now].if_3||tree[now].flagx2||tree[now].flagy2) pushdown(now);
if(l<=tree[now].mid) operation3(now<<,l,r,s,t);
if(r>tree[now].mid) operation3(now<<|,l,r,s,t);
updata(now);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lf",&ai[i]);
for(int i=;i<=n;i++) scanf("%lf",&bi[i]);
build(,,n);
int op,l,r;double s,t;
while(m--)
{
scanf("%d%d%d",&op,&l,&r);
if(op==)
{
Sumx=,Sumy=,Sumxy=,Sumx2=,Sumy2=;
operation1(,l,r);
double size=r-l+,x_=Sumx/size,y_=Sumy/size;
double a=Sumxy-Sumy*x_-Sumx*y_+y_*x_*size;
double b=Sumx2-*Sumx*x_+x_*x_*size;
printf("%.10lf\n",a/b);
}
if(op==) scanf("%lf%lf",&s,&t),operation2(,l,r,s,t);
if(op==) scanf("%lf%lf",&s,&t),operation3(,l,r,s,t);
}
return ;
}

AC日记——[SDOI2017]相关分析 洛谷 P3707的更多相关文章

  1. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  2. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  3. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  4. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  5. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  6. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  7. AC日记——导弹拦截 洛谷 P1020 &lpar;dp&plus;模拟&rpar;

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  8. AC日记——信息传递 洛谷 P2661 (tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. AC日记——积木大赛 洛谷 P1969

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

随机推荐

  1. ios-XML文档解析之SAX解析

    首先SAX解析xml *xml文档的格式特点是节点,大体思路是把每个最小的子节点作为对象的属性,每个最小子节点的'父'节点作为对象,将节点转化为对象,输出. 每个节点都是成对存在的,有开始有结束.有始 ...

  2. POJ1088 滑雪(记忆化搜索)

    题目链接. 分析: 状态转移方程 d[i][j] = max(d[i-1][j], d[i+1][j], d[i][j-1], d[i][j+1]). #include <iostream&gt ...

  3. 光流和KLT

    一 光流 光流的概念是Gibson在1950年首先提出来的. 它是空间运动物体在观察成像平面上的像素运动的瞬时速度.是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存 ...

  4. ovs2&period;7 在系统重启后,再次使用时提示数据库无法连接的问题。

    问题现象如下,ovs开始安装后,对ovs的操作是正常的,但是,现在系统重启后,OVS的操作第一条命令就失败,如下: 问题解决方法: 参考  http://blog.csdn.net/xyq54/art ...

  5. CentOS配代理服务器

    背景: 某云上有台Windows主机,为了省钱(...),购买的1M带宽... 然后日常只有我用,特别卡,嫌弃得不行. 最近接触到代理,琢磨代理连接到局域网内带宽大的主机,是否上网速度会蹭蹭得涨?实践 ...

  6. ssm mysql 新增数据返回id

    描述: 在ssm项目中,新增一条数据,返回该数据的数据库id(主键) 实现方法: 1.xml 增加  useGeneratedKeys="true" keyProperty=&qu ...

  7. 【OpenGL】第一个窗口

    包含头文件: #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> 初始化与配置GLFW: glfwInit(); //初始 ...

  8. 蛮力法解决0&lowbar;1背包问题新思路-——利用C语言位域类型

    废话不说了,直接上代码 #include<stdio.h> #include<math.h> #define N 5 //物品种类数目 #define CAPACITY 6 / ...

  9. shell替换掉两个以上的空格

    方法一:sed 's/ \+/ /g' test.txt > test1.txt

  10. UVA - 1262 数学

    UVA - 1262 题意: 有两个6*5 的大写字母组成的矩阵,需要找出满足条件的字典序第k小的密码:密码中每个字母在两个矩阵的对应的同一列中都出现过 代码: // 先处理出来每一列可以取的字母,例 ...