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

整数序列
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给出一个长度为n的整数序列a1,a2,...,an,进行m次操作,操作分为两类。
操作1:给出l,r,v,将al,al+1,...,ar分别加上v;
操作2:给出l,r,询问\sum\limits_{i=l}^{r}sin(a_i)
i=l

r

sin(a
i

)
输入描述:
第一行一个整数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
示例1
输入
复制
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

题意:

思路:

肯定会想到用线段树维护这样的操作,可是sin(xi)并不满足区间可加性。

转换一下

sin(x+v) = sin(x)cos(v) + cos(x)sin(v)

cos(x+v) = cos(x)cos(v) - sin(x)sin(v)

我们只需要维护sin(x) 和 cos(x) 就可以轻易的得到sin(x+v) 和 cos(x+v)

如果引入复数的:

cos(x)+sin(x)i ( cos(v)+sin(v)i ) = cos(x)cos(v)-sin(x)sin(v)+cos(x)sin(v)+sin(x)*cos(v) = cos(x+v)+sin(x+v)i


(此部分引用自)Uniontake的博客: https://blog.csdn.net/m0_38013346/article/details/81807711

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=200010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/typedef complex<double> comd;
int a[maxn];struct node
{comd val;comd add;int l,r;
}segment_tree[maxn<<2];
int n;
void pushup(int rt)
{segment_tree[rt].val=segment_tree[rt<<1].val+segment_tree[rt<<1|1].val;}
void build(int rt,int l,int r)
{segment_tree[rt].add=comd(1,0);segment_tree[rt].l=l;segment_tree[rt].r=r;if(l==r){segment_tree[rt].val=comd(cos(a[l]),sin(a[l]));return ;}int mid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt);
}
void pushdown(int rt)
{if(segment_tree[rt].add!=comd(1,0)){segment_tree[rt<<1].add*=segment_tree[rt].add;segment_tree[rt<<1].val*=segment_tree[rt].add;segment_tree[rt<<1|1].add*=segment_tree[rt].add;segment_tree[rt<<1|1].val*=segment_tree[rt].add;segment_tree[rt].add=comd(1,0);}
}
void update(int rt,int l,int r,comd x)
{if(segment_tree[rt].l>=l&&segment_tree[rt].r<=r){segment_tree[rt].val*=x;segment_tree[rt].add*=x;return ;}pushdown(rt);int mid=(segment_tree[rt].l+segment_tree[rt].r)>>1;if(mid>=l){update(rt<<1,l,r,x);}if(mid<r){update(rt<<1|1,l,r,x);}pushup(rt);}
double ask(int rt,int l,int r)
{if(segment_tree[rt].l>=l&&segment_tree[rt].r<=r){return segment_tree[rt].val.imag();}double res=0.0;pushdown(rt);int mid=(segment_tree[rt].l+segment_tree[rt].r)>>1;if(mid>=l){res+=ask(rt<<1,l,r);}if(mid<r){res+=ask(rt<<1|1,l,r);}return res;
}
int main()
{//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);gbtb;cin>>n;repd(i,1,n){cin>>a[i];}build(1,1,n);int m;cin>>m;int op,l,r;int x;while(m--){cin>>op>>l>>r;if(op==1){cin>>x;update(1,l,r,comd(cos(x),sin(x)));}else{cout<<fixed<<setprecision(1)<<ask(1,l,r)<<endl;}}return 0;
}inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11286328.html

Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)相关推荐

  1. Wannafly挑战赛22 D-整数序列 (线段树)

    https://www.nowcoder.com/acm/contest/160/D 做法:用线段树维护,对于树上的每个叶子结点,维护一个复数结构体 cos(a[i] + sin(a[i])*i ,每 ...

  2. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  3. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游 ...

  4. Wannafly挑战赛22

    B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...

  5. Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列

    传送门 文章目录 题意: 思路: 题意: 思路: 首先一个括号序列合法的条件可以转化成两个(左括号代价为111,右括号代价为−1-1−1): (1) 左括号个数等于右括号个数. (2) 括号的前缀和非 ...

  6. codeforces 877E. Danil and a Part-time Job (DFS序列+线段树)

    传送门:codeforces 877E 题目大意: 有一颗树,树的每个节点有一盏灯,状态为亮或灭.现在可以进行以下两种操作: 1.pow x,将以 x 为根节点的子树(包括根节点)的所有节点的灯的状态 ...

  7. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  8. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  9. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

最新文章

  1. 2018湖湘杯海选复赛Writeup
  2. csrutil是什么_经常在程序里见到 Util ,想知道它一般是指什么意思?
  3. STM32F103实现点灯(寄存器方式)
  4. spring mvc学习(8):springmvc常用注解代码
  5. 538.把二叉搜索树转换为累加树(结合自己的理解解释一下别人题解的递归部分)
  6. 谜题27:变幻莫测的i值
  7. ERP小白必读|十篇ERP初学者经典论文
  8. java1.8.0_java jdk官方下载|java jdk v1.8.0 官方免费版-520下载站
  9. C语言:输入一个三位数,反向输出该三位数
  10. SpringBoot 多语言切换
  11. 单点登录系统CAS入门
  12. IFI Claims:2018年中国企业在美国申请专利数量7298件
  13. 蚂蚁金服-基于数据和堆栈映射快速定位前端问题
  14. 大数据课程作业(一)
  15. 走近“领域特定语言”
  16. python爬虫80行代码拿下喜马拉雅有声书
  17. 威力曲面sw2020_威力曲面powersufacing_沐风网
  18. 【C++】上下取整取整函数
  19. 锐捷服务器无线认证配置,【WLAN从入门到精通之对接案例】配置802.1X认证示例_Web(锐捷SAM服务器)...
  20. 树莓派无显示器连接无线

热门文章

  1. CRM_REPORT_RF_AUTH_OBJ_ORD_PR
  2. price initialization when clicking new button in WebUI
  3. SAP Customer Data Cloud的administrator设置
  4. ABAP文档生成工具
  5. Selenium对多浏览器的支持
  6. 外星人进化_深层分析宇宙常数对生命形成进化的影响,外星人或许根本就“不是人”!...
  7. sql delete删除两个表_超强干货!SQL语法大合集
  8. java创建子类对象的步骤_一顿Spring骚操作:我敢说没有人比我更懂Java对象的创建!
  9. java中channelmessage,MessageStore支持的QueueChannel与Spring Integration Java Config
  10. python nonetype object has no_为什么会出现这个?'NoneType' object has no attribute 'contet