套路题了。

根据和角公式 \(\mathrm{\sin (\alpha + \beta) = \sin \alpha \cos \beta + \cos \alpha \cos \beta, \cos (\alpha + \beta) = \cos \alpha \cos \beta - \sin \alpha \sin \beta}\)

可以考虑在复平面上维护一个复数 \(\mathrm{\sin \alpha + \cos \alpha i}\),或者矩阵维护。

求和及修改可以线段树。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
#define dop(i, a, b) for (int i = (a); i > (b); i -- ) using namespace std; using LL = long long;
using PII = pair<int, int>;
using PLL = pair<LL, LL>; const int N = 300010;
const double pi = acos(-1);
const double eps = 1e-6;
int n, m;
double w[N]; struct Complex {
double x, y;
Complex(){}
Complex(double _x, double _y) { x = _x, y = _y; }
Complex operator + (const Complex& tmp)const {
return Complex(x + tmp.x, y + tmp.y);
}
Complex operator * (const Complex& tmp)const {
return Complex(x * tmp.x - y * tmp.y, x * tmp.y + y * tmp.x);
}
Complex operator - (const Complex& tmp)const {
return Complex(x - tmp.x, y - tmp.y);
}
Complex operator * (const double &tmp)const {
return Complex(x * tmp, y * tmp);
}
void clear() { x = y = 0; }
void makeI() { x = 1.0, y = 0; }
bool empty() { return x == 0 && y == 0; }
bool isI() { return x == 1 && y == 0; }
}; struct Tree {
int l, r;
Complex mul, sum;
int len() { return r - l + 1; }
}tr[N << 2];
#define ls u << 1
#define rs u << 1 | 1 void pushup(int u) {
tr[u].sum = tr[ls].sum + tr[rs].sum;
}
void push_mul(int u, Complex mul) {
if (tr[u].l == tr[u].r) {
tr[u].sum = tr[u].sum * mul;
return;
}
tr[u].mul = tr[u].mul * mul;
tr[u].sum = tr[u].sum * mul;
}
void pushdown(int u) {
if (tr[u].l == tr[u].r) return;
if (!tr[u].mul.isI()) {
push_mul(ls, tr[u].mul);
push_mul(rs, tr[u].mul);
tr[u].mul.makeI();
}
}
void build(int u, int l, int r) {
tr[u] = {l, r}, tr[u].mul.makeI();
if (l == r) {
tr[u].sum = Complex(sin(w[r]), cos(w[r]));
return;
}
int mid = l + r >> 1;
build(ls, l, mid), build(rs, mid + 1, r);
pushup(u);
}
void Multiply(int u, int l, int r, Complex k) {
if (tr[u].l >= l && tr[u].r <= r) {
push_mul(u, k); return;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) Multiply(ls, l, r, k);
if (r > mid) Multiply(rs, l, r, k);
pushup(u);
}
Complex query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1; Complex ans(0, 0);
if (l <= mid) ans = ans + query(ls, l, r);
if (r > mid) ans = ans + query(rs, l, r);
return ans;
} int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
scanf("%lf", &w[i]);
build(1, 1, n); scanf("%d", &m);
while (m -- ) {
int op, l, r; double v;
scanf("%d%d%d", &op, &l, &r);
if (op == 1) {
scanf("%lf", &v);
Multiply(1, l, r, Complex(cos(v), -sin(v)));
}
else
printf("%.1lf\n", query(1, l, r).x);
} return 0;
}

P1967 [NOIP2013 提高组] 货车运输 做题记录的更多相关文章

  1. [NOIP2013提高组]货车运输

    题目:洛谷P1967.Vijos P1843.codevs3287. 题目大意:有n个城市m条道路,每条道路有一个限重,规定货车运货不能超过限重.有一些询问,问你两个城市之间一次最多能运多少重的货(可 ...

  2. [NOIP2013 提高组] 货车运输

    前言 使用算法:堆优化 \(prim\) , \(LCA\) . 题意 共有 \(n\) 个点,有 \(m\) 条边来连接这些点,每条边有权值.有 \(q\) 条类似于 \(u\) \(v\) 询问, ...

  3. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  4. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

  5. [NOIP2013 提高组] 华容道 P1979 洛谷

    [NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...

  6. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  7. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  8. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  9. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  10. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

随机推荐

  1. Python网络编程——基于tcp协议实现远程执行命令、udp协议没有粘包问题、解决粘包问题、socketserver模块的基本使用(基于tcp协议、基于udp协议的使用)

    文章目录 基于tcp协议实现远程执行命令 udp协议没有粘包问题 解决粘包问题 解决粘包问题(终极版) socketserver模块的基本使用 基于tcp协议的使用 基于udp协议的使用 基于tcp协 ...

  2. html表单与框架

    1.以form开头 其中常用的属性有 action=""  method=""  enctype=""   name="" ...

  3. CDQ分治和三维偏序

    专题:CDQ 分治 本页面将完整介绍 CDQ 分治. 简介 CDQ 分治是一种思想而不是具体的算法,与动态规划类似.目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类: 解决和点对有关的问题 ...

  4. Oracle 11g数据库详解(2017-01-23更新)

    Oracle 11g数据库详解 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 ...

  5. 更改Kali Linux系统语言以及安装zenmap

    更改Kali Linux系统语言以及安装zenmap 在使用kali的过程中,会遇到许多问题,其中一个就是看不懂英语,下面是如何更换语言的步骤. 更改Kali Linux系统语言 首先,打开kali, ...

  6. Atcoder Regular Contest 166

    只打了半场. A. Replace C or Swap AB 首先如果存在某个 \(i\),使得 \(Y_i\) 是 C 且 \(X_i\) 不是,那么显然是不合法的,可以直接判掉. 那么除去上述情况 ...

  7. java泛型<? extends E>和<? super E>的区别和适用场景

    <? extends E>是Upper Bound(上限)的通配符,用来限制元素类型的上限,如: List<? extends Fruit> fruits; 表示集合中的元素的 ...

  8. Flask解决跨域问题

    什么是跨域问题 跨域问题指的是浏览器限制了从一个源(协议.域名.端口)访问另一个源的资源的行为,这个限制是浏览器的一个安全机制.如果一个网页从一个源加载了另一种类型的资源(例如 HTML.CSS.脚本 ...

  9. 代码安全之代码混淆及加固(Android)🔒

    ​ 代码安全之代码混淆及加固(Android) 目录 代码安全之代码混淆及加固(Android) 摘要 引言 正文 代码混淆 代码加固 总结 参考资料 摘要 本文将介绍如何通过代码混淆和加固来保护An ...

  10. 手撕Vue-Router-知识储备

    前言 本文是手写Vue-Router的第一篇,主要是对Vue-Router的知识储备,为后面的手写做准备. 那么 VueRouter 怎么实现呢?要想实现 VueRouter,首先要知道 VueRou ...