P1967 [NOIP2013 提高组] 货车运输 做题记录
套路题了。
根据和角公式 \(\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 提高组] 货车运输 做题记录的更多相关文章
- [NOIP2013提高组]货车运输
题目:洛谷P1967.Vijos P1843.codevs3287. 题目大意:有n个城市m条道路,每条道路有一个限重,规定货车运货不能超过限重.有一些询问,问你两个城市之间一次最多能运多少重的货(可 ...
- [NOIP2013 提高组] 货车运输
前言 使用算法:堆优化 \(prim\) , \(LCA\) . 题意 共有 \(n\) 个点,有 \(m\) 条边来连接这些点,每条边有权值.有 \(q\) 条类似于 \(u\) \(v\) 询问, ...
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- project euler做题记录
ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- 退役IV次后做题记录
退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
随机推荐
- gitbook生成静态页面不跳转
gitbook页面不跳转 现在可以在localhost:4000/查看自己的网页了.而且生成的网页存在_book文件夹中,下次点击 _book文件夹中的index.html就能打开网页,内容无更新,就 ...
- 基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现
从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要 ...
- Python学习 —— 初步认知
写在前面 Python是一种流行的高级编程语言,具有简单易学.代码可读性高.应用广泛等优势.它是一种解释型语言,可以直接在终端或集成开发环境(IDE)中运行,而无需事先编译. Python的安装 Py ...
- WPF 笔迹算法 从点集转笔迹轮廓
本文将告诉大家一些笔迹算法,从用户输入的点集,即鼠标轨迹点或触摸轨迹点等,转换为一个可在界面绘制显示笔迹画面的基础数学算法.尽管本文标记的是 WPF 的笔迹算法,然而实际上本文更侧重基础数学计算,理论 ...
- DB22
IBM官方网站提供了DB2 Express-C版本的软件免费下载: 下载地址 : http://www.ibm.com/developerworks/cn/downloads/im/udbexp/
- 一个vuepress配置问题,引发的js递归算法思考
前言 这两天在尝试用语雀+ vuepress + github 搭建个人博客. 小破站地址 :王天的 web 进阶之路 语雀作为编辑器,发布文档推送 github,再自动打包部署,大概流程如下. 问题 ...
- HDU4841 AHOI1999 圆桌问题 题解
朴素的约瑟夫问题,用vector处理即可 #include <iostream> #include <vector> using namespace std; //AHOI19 ...
- MUH and Cube Walls 题解
MUH and Cube Walls 前言 怎么题解区同质化这么严重,16 篇题解全是 差分 + KMP,就没有人写别的做法吗. (好吧其实是我一开始没想到差分才有了这么多奇怪做法) 题目大意 给定两 ...
- CC BY-SA 4.0原文及翻译
CC BY-SA 4.0原文及翻译 英文参考链接 中文参考链接 原文: Attribution 4.0 International (CC BY 4.0) This is a human-readab ...
- JAVA多线程(3)——如何加锁
1.加锁不正确导致数据不一致:m1执行过程中,m2(未加synchronized)可以执行,因为m2不用获得锁就可以执行 1 public class TT implements Runnable { ...