链接: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. python模块之configparser模块

    configparser模块:用于按一定格式创建配置文件 创建 import configparser config = configparser.ConfigParser() config['DEF ...

  2. C++的价值

    In May 2010, the GCC steering committee decided to allow use of a C++ compiler to compile GCC. The c ...

  3. 2018-8-10-如何入门-C++-AMP-教程

    title author date CreateTime categories 如何入门 C++ AMP 教程 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...

  4. 模板——BigInteger

    #include <iostream> #include <cstring> #include <string> #include <vector> # ...

  5. Codeforces 1100F(离线 or 在线)

    传送门 •参考资料 [1]:在线线性基 [2]:离线线性基 [3]:离线线性基 •题意 给你 n 个数,m 次询问: 每次询问给定一个区间 $l,r$,求 $a_{l \cdots r}$ 异或的最大 ...

  6. 【9307】&【a303】过河卒(NOIP2002)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...

  7. 纯CSS绘制的图形一览

    整理网上一些使用纯CSS绘制的图形示例~~纯属抄袭,哈哈...仅仅是为了自己以后查看! Square(正方形) #square { width: 100px; height: 100px; backg ...

  8. 2018-2-13-win10-uwp-绑定静态属性

    title author date CreateTime categories win10 uwp 绑定静态属性 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...

  9. Nginx与PHP交互过程 + Nginx与PHP通信的两种方式

    一.Nginx与PHP交互过程的7步走(用户对动态PHP网页访问过程) step1:用户将http请求发送给nginx服务器(用户和nginx服务器进行三次握手进行TCP连接) step2:nginx ...

  10. 微信群打卡机器人XiaoV项目开源 | 蔡培培的独立博客

    原文首发于蔡培培的独立博客.原文链接<微信群打卡机器人XiaoV项目开源>. 5月21日,在米花(后面" 亚里士多德式友谊"专题会提及)的影响下,决定搞个私人运动群,拉 ...