链接:https://www.nowcoder.com/acm/contest/160/D
来源:牛客网

题目描述
给出一个长度为n的整数序列a1,a2,...,an,进行m次操作,操作分为两类。
操作1:给出l,r,v,将al,al+1,...,ar分别加上v;
操作2:给出l,r,询问
输入描述:

第一行一个整数n
接下来一行n个整数表示a1,a2,...,an
接下来一行一个整数m
接下来m行,每行表示一个操作,操作1表示为1 l r v,操作2表示为2 l r
保证1≤n,m,ai,v≤200000;1≤l≤r≤n,v是整数

输出描述:

对每个操作2,输出一行,表示答案,四舍五入保留一位小数
保证答案的绝对值大于0.1,且答案的准确值的小数点后第二位不是4或5
数据随机生成(n,m人工指定,其余整数在数据范围内均匀选取),并去除不满足条件的操作2

输入

4
1 2 3 4
5
2 2 4
1 1 3 1
2 2 4
1 2 4 2
2 1 3

输出

0.3
-1.4
-0.3

题意 : 给你 n 个数字,第一种操作是将一个区间内每一个数字加上同一个数字,第二种操作是求一个区间内每一个数 sin 的累加和

思路分析 :对于每个区间维护一下 cos 和 sin 的值,当一个区间要加上一个数字时,此时再重新计算 sin的值时 , sin(a + x) = sin(a)*cos(x) + cos(a)*sin(x) ,一个区间内的所有值都可以这样计算,因此就会用到区间内的 sin 总和 以及 cos 的总和

这个题有个很坑的地方,就是大量的地方用到 sin 与 cos 函数,若输入的是一个整形数强制转变为浮点数后再用 sin函数,cos函数则会超时,不强制转换会快一半的时间!!!

代码示例 :

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5+5;
#define lson k<<1
#define rson k<<1|1 int n, m;
struct node
{
int l, r;
ll lazy;
double rs, rc;
}t[maxn<<2]; void pushdown(int k){
double x1 = t[lson].rs*cos(t[k].lazy) + t[lson].rc*sin(t[k].lazy);
double x2 = t[lson].rc*cos(t[k].lazy) - t[lson].rs*sin(t[k].lazy);
t[lson].rs = x1, t[lson].rc = x2; x1 = t[rson].rs*cos(t[k].lazy) + t[rson].rc*sin(t[k].lazy);
x2 = t[rson].rc*cos(t[k].lazy) - t[rson].rs*sin(t[k].lazy);
t[rson].rs = x1, t[rson].rc = x2; t[lson].lazy += t[k].lazy;
t[rson].lazy += t[k].lazy;
t[k].lazy = 0;
}
int x;
void build(int l, int r, int k){
t[k].l = l, t[k].r = r;
t[k].rc = t[k].rs = 0.0;
t[k].lazy = 0;
if (l == r) {
scanf("%d", &x);
t[k].rs = sin(x), t[k].rc = cos(x);
return;
}
int m = (l+r) >> 1;
build(l, m, lson);
build(m+1, r, rson); t[k].rs = t[lson].rs+t[rson].rs;
t[k].rc = t[lson].rc+t[rson].rc;
} void update(int l, int r, ll v, int k){
if (l <= t[k].l && t[k].r <= r){
double x1 = t[k].rs*cos(v)+t[k].rc*sin(v);
double x2 = t[k].rc*cos(v)-t[k].rs*sin(v);
t[k].rs = x1, t[k].rc = x2;
t[k].lazy += v;
return;
}
if (t[k].lazy) pushdown(k);
int m = (t[k].l+t[k].r) >> 1;
if (l <= m) update(l, r, v, lson);
if (r > m) update(l, r, v, rson);
t[k].rs = t[lson].rs+t[rson].rs;
t[k].rc = t[lson].rc+t[rson].rc;
} double sum;
void query(int l, int r, int k){
if (l <= t[k].l && t[k].r <= r){
sum += t[k].rs;
return;
}
if (t[k].lazy) pushdown(k);
int m = (t[k].l + t[k].r) >> 1;
if (l <= m) query(l, r, lson);
if (r > m) query(l, r, rson);
} int main() {
int pt, l, r;
ll v; cin >> n;
build(1, n, 1);
cin >> m;
while(m--){
scanf("%d%d%d", &pt, &l, &r);
if (pt == 1) {
scanf("%lld", &v);
update(l, r, v, 1);
}
else {
sum = 0;
query(l, r, 1);
printf("%.1lf\n", sum);
}
}
return 0;
}

带 sin, cos 的线段树 - 牛客的更多相关文章

  1. BZOJ 4129 树上带修莫队+线段树

    思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...

  2. 笛卡尔树--牛客第四场(sequence)

    思路: O(n)建一颗笛卡尔树,再O(n)dfs向上合并答案就行了. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include &l ...

  3. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  4. BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)

    题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...

  5. 「ZJOI2019」线段树

    传送门 Description 线段树的核心是懒标记,下面是一个带懒标记的线段树的伪代码,其中 tag 数组为懒标记: 其中函数\(Lson(Node)\)表示\(Node\)的左儿子,\(Rson( ...

  6. @loj - 3043@「ZJOI2019」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...

  7. 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树

    目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...

  8. 牛客练习赛28 B数据结构(线段树)

    链接:https://www.nowcoder.com/acm/contest/200/B来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

随机推荐

  1. 12627 - Erratic Expansion——[递归]

    Piotr found a magical box in heaven. Its magic power is that if you place any red balloon inside it ...

  2. UVA 11400"Lighting System Design"

    传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...

  3. vue-learning:37 - router - 目录

    vue路由vue-router 目录 前端路由历史 服务端渲染(SSR:server side render) 客户端路由(client side routing) 前端路由实现原理 hash模式: ...

  4. msbuild 项目文件常用判断条件

    在写项目文件的时候,需要根据不同的条件定义或执行不同的代码,有一些比较常使用的判断,本文收藏起来,方便大家找 在 msbuild 的项目文件 cspoj 或 xx.target 等文件里面,可以使用 ...

  5. OpenWrt Kernel Module Creation Howto

    OpenWrt Kernel Module Creation Howto About OpenWrt Kernel Module Compilation You are planning to com ...

  6. Kafka Eagle安装详情及问题解答

    1.概述 最近有很多同学给笔者留言,说在安装Kafka Eagle的时候,会遇到一些问题,请教如何解决?今天笔者就在这里总结一下安装步骤,和一些安装的注意事项,以及解决方式. 2.内容 在安装Kafk ...

  7. 学习Java第八周

    1.流的分类 1.字节流:Stream 2.字符流: Writer,Reader 输入流 :InputStream ,Reader 输出流 :OuputStream,Writer 字节流重要还是字符流 ...

  8. linux上传文件的命令

    由于svm挂机不能通过svn提交代码,所以今天尝试了一下linux的rz和sz命令 1.sz命令是把文件下载到本地,使用方法如下 sz  文件名 回车之后会弹出一个本地的路径选择框,选择要下载的路径即 ...

  9. SpringBoot如何优雅的使用RocketMQ

    目录 SpringBoot如何优雅的使用RocketMQ SpringBoot如何优雅的使用RocketMQ MQ,是一种跨进程的通信机制,用于上下游传递消息.在传统的互联网架构中通常使用MQ来对上下 ...

  10. 缓存一致性协议(MESI)

    在目前主流的计算机中,cpu执行计算的主要流程如图所示: 数据加载的流程如下: 1.将程序和数据从硬盘加载到内存中 2.将程序和数据从内存加载到缓存中(目前多三级缓存,数据加载顺序:L3->L2 ...