【题解】P6352 区间加区间 sin 和

news/2024/11/14 12:19:13/文章来源:https://www.cnblogs.com/ywhhdjser-97/p/18542971

目录
  • 题目内容
  • 思路
  • 代码

题目内容

题目链接

给出一个长为 \(n\) 的整数序列 \(a\),支持两种操作:

  1. 给定 \(l,r,v\),将 \(a\) 中下标 \(\in[l,r]\) 的数全部加上 \(v\)

  2. 给定 \(l,r\),查询 \(\sum\limits_{i=l}^{r}sin(a_i)\)

\(1\le n,m,a_i,v\le 2\times10^5,1\le l\le r\le n\)

思路

只能说身为 lxl 的题有单 \(\log\) 做法数据范围才到 \(2e5\) 还是太收敛了。

前置知识:

弧度制

三角恒等式

于是在线段树上维护 \(\sum\limits_{i=L}^{R}sin(a_i)\)\(\sum\limits_{i=L}^{R}cos(a_i)\)(注意区分线段树上的 \(L\) 和询问的 \(l\))。这样的话查询是显然的。修改时套用上面的公式:

\[\begin{aligned}\sum\limits_{i=L}^{R}sin(a_i+x)&=\sum\limits_{i=L}^{R}[sin(a_i)\times cos(x)+cos(a_i)\times sin(x)]\\&=\sum\limits_{i=L}^{R}[sin(a_i)\times cos(x)]+\sum\limits_{i=L}^{R}[cos(a_i)\times sin(x)]\\&=cos(x)\times\sum\limits_{i=L}^{R}sin(a_i)+sin(x)\times\sum\limits_{i=L}^{R}cos(a_i)\end{aligned} \]

然后就做完了。维护 cos 值使用另一个公式:

\[\begin{aligned}\sum\limits_{i=L}^{R}cos(a_i+x)&=\sum\limits_{i=L}^{R}[cos(a_i)\times cos(x)-sin(a_i)\times sin(x)]\\&=\sum\limits_{i=L}^{R}[cos(a_i)\times cos(x)]-\sum\limits_{i=L}^{R}[sin(a_i)\times sin(x)]\\&=cos(x)\times\sum\limits_{i=L}^{R}cos(a_i)-sin(x)\times\sum\limits_{i=L}^{R}sin(a_i)\end{aligned} \]

注意 lazy 标记累加有可能爆 int。注意修改时要开中间变量,且要开成 double。

代码

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ri register int
#define inf 0x3f3f3f3f
int a,b[200002],c,in,u,v,w;
struct Segment_Tree
{#define N 800008int left[N],right[N];long long lazy[N];double sn[N],cs[N];il int ls(int x){return x<<1;}il int rs(int x){return x<<1|1;}il void pushup(int x){sn[x]=sn[ls(x)]+sn[rs(x)];cs[x]=cs[ls(x)]+cs[rs(x)];}il void pushdown(int x){if(lazy[x]){lazy[ls(x)]+=lazy[x];lazy[rs(x)]+=lazy[x];register double sin0=sn[ls(x)],cos0=cs[ls(x)];sn[ls(x)]=cos(lazy[x])*sin0+sin(lazy[x])*cos0;cs[ls(x)]=cos(lazy[x])*cos0-sin(lazy[x])*sin0;sin0=sn[rs(x)],cos0=cs[rs(x)];sn[rs(x)]=cos(lazy[x])*sin0+sin(lazy[x])*cos0;cs[rs(x)]=cos(lazy[x])*cos0-sin(lazy[x])*sin0;lazy[x]=0;}}void build(int x,int lt,int rt){left[x]=lt;right[x]=rt;if(lt==rt){sn[x]=sin(b[lt]);cs[x]=cos(b[lt]);return;}ri me=(lt+rt)>>1;build(ls(x),lt,me);build(rs(x),me+1,rt);pushup(x);}void add(int x,int lt,int rt,int y){if(lt<=left[x]&&right[x]<=rt){lazy[x]+=y;register double sin0=sn[x],cos0=cs[x];sn[x]=cos(y)*sin0+sin(y)*cos0;cs[x]=cos(y)*cos0-sin(y)*sin0;return;}pushdown(x);ri me=(left[x]+right[x])>>1;if(lt<=me){add(ls(x),lt,rt,y);}if(rt>me){add(rs(x),lt,rt,y);}pushup(x);}double find(int x,int lt,int rt){if(lt<=left[x]&&right[x]<=rt){return sn[x];}pushdown(x);ri me=(left[x]+right[x])>>1;register double rn=0;if(lt<=me){rn+=find(ls(x),lt,rt);}if(rt>me){rn+=find(rs(x),lt,rt);}return rn;}#undef N
}st;
int main()
{scanf("%d",&a);for(ri i=1;i<=a;i++){scanf("%d",&b[i]);}st.build(1,1,a);scanf("%d",&c);while(c--){scanf("%d",&in);if(in==1){scanf("%d%d%d",&u,&v,&w);st.add(1,u,v,w);}else{scanf("%d%d",&u,&v);printf("%.1lf\n",st.find(1,u,v));}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据质量管理:数据可靠性与数据质量问题解决之道02数据湖仓

数据湖仓1. 组装 1.1. 对于任何数据从业者来说,解决生产过程中的数据质量问题都是一项关键技能,但只要有适当的系统和流程,就基本可以防止数据宕机 1.2. 数据在管道的任何阶段都可能会受到操作数量、编程甚至数据相关性的影响,也许只需一次模式更改或代码推送,就会让下游报…

.NET 9正式发布,亮点是.NET Aspire和AI

Microsoft 今天正式发布了 .NET 9,这是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。这是来自世界各地的数千名开发人员又一年努力的结果。此新版本包括数千项性能、安全性和功能改进。您将发现整个 .NET 堆栈中从编程语言、开发人员工具和工作负载的全面增…

多校 A 层冲刺 NOIP2024 模拟赛 21

难度 ★★★☆☆多校A层冲刺NOIP2024模拟赛21 T1 送信卒 签到题 答案显然具有单调性,考虑二分答案,然后使用跑 dj check。 时间复杂度 \(O(nm\log (nm)\log (V))\) T2 共轭树图 特殊性质,树形 DP 考虑链怎么做,注意到一个性质,一条链上产生在 \(G\),将 \(G\) 中的边放到原…

APISR:受动漫制作启发的现实世界动漫超分辨率

APISR:受动漫制作启发的现实世界动漫超分辨率虽然现实世界的动漫超分辨率(SR)在SR社区越来越受到关注,但现有的方法仍然采用真实感领域的技术。分析了动漫制作工作,并重新思考了如何为了现实世界的动漫SR而使用它的特点。首先,由于手绘框架的重复使用,视频网络和数据集对…

2024.11.12 2024 CCPC女生专场

2024 CCPC女生专场 Solved:10/13 Penalty:1299 Rank:6今年题有这么简单吗?还是队伍变强了? 我做起来感觉比去年和前年都难。。感觉前两年至少都有 7~8 道签到,今年从 4~5 题就需要思考了。C. CCPC 题意:重排字符串使得形如 CCPC 的子串最多。 CCPCCP...CCPC #include<…

2024.11.12 CCPC2024女生专场

CCPC2024女生专场 Solved:10/13 Penalty:1299 Rank:6今年题有这么简单吗?还是队伍变强了? 我做起来感觉比去年和前年都难。。感觉前两年至少都有 7~8 道签到,今年从 4~5 题就需要思考了。C. CCPC 题意:重排字符串使得形如 CCPC 的子串最多。 CCPCCP...CCPC #include<…

串行总线的学习

一、USB概念 Universal Serial Bus,简称 USB。中文翻译称为通用串行总线,是一种串口总线的标准,也是一种输入输出接口的技术规范 二、USB接口外形分辨主要类型:Type-A,Type-B,Type-C,Micro,Mini下面以USB2.0协议展示不同类型接口的形状 Type-AType-B 通常在打印机设备使用,…

一文搞懂 ARM 64 系列: PACISB

一文搞懂 ARM 64 系列: PACISB1 PAC AMR64提供了PAC(Pointer Authentication Code)机制。 所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算,得出一个「签名」,将这个「签名」写入指针的高bit上。计算出来的「签名」之所以…

NewStarCTF-pwn

NewStarCTF-pwn目录NewStarCTF-pwnweek1overwriteread() 参数gdbweek2week3week4 week1 overwrite 首先查看文件,保护全开,为64位放入IDA查看代码,发现关键函数func()第9-12行代码,首先打印提示信息“pls input the length you want to readin: ”,然后使用__isoc99_scanf…

Animal Controller文档——Animal Modifiers

Overview 是一个结构类,在进入新动画时修改Animal的Main Core功能。通常用于States或Animator Controller中的Animal Modifier Behaviour组件。有关如何使用这些的更多信息,请参阅States页面。Parameters RootMotion 启用/禁用Animator上的Root Motion。 Sprint 启用/禁用Ani…

南开高级语言程序设计2--OJ题目答案

注意:素数是从2开始,2也是素数 第七章(运算符重载) #include <cstdio> #include <iostream>using namespace std; int gcd(int a, int b) {return b ? gcd(b, a % b) : a; } int lcm(int a, int b) {return a * b / gcd(a, b); } class Rational { private:in…

Animal Controller文档——States

Overview States是动物控制的核心逻辑,使动物能够移动、坠落、跳跃、死亡等。 States的动画相互独立。例如,动物不能同时处于奔跑和跳跃,或飞行和游泳状态。 它们按优先级排序,优先级高的状态将优先尝试激活,之后才是优先级低的状态。如果一个高优先级状态是当前激活的状态…