首页 > 其他分享 >P1967 [NOIP2013 提高组] 货车运输 做题记录

P1967 [NOIP2013 提高组] 货车运输 做题记录

时间:2023-01-09 18:26:06浏览次数:57  
标签:tmp NOIP2013 int 货车运输 return Complex alpha const P1967

套路题了。

根据和角公式 \(\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;
}

标签:tmp,NOIP2013,int,货车运输,return,Complex,alpha,const,P1967
From: https://www.cnblogs.com/LcyRegister/p/17037863.html

相关文章

  • NC16541 [NOIP2013]车站分级
    题目链接题目题目描述一条单向的铁路线上,依次有编号为1,2,…,n的n个火车站。每个火车站都有一个级别,最低为1级。现有若干趟车次在这条线路上行驶,每一趟都满足如下......
  • [NOIP2013 提高组] 货车运输 题解
    [NOIP2013提高组]货车运输题解本题解介绍一种最大生成树+并查集+启发式合并离线的做法。想法题目要多次求两点之间的最大瓶颈路长度,所以可以先参照最小瓶颈路的通......
  • 【淼】[NOIP2013 普及组] 小朋友的数字
    [NOIP2013普及组]小朋友的数字思路题中“特征值”是指前面最大的一段数字之和,即以该数结尾的序列的最大子段和,用\(DP\)解决。至于得分,可以从左往右扫一遍,扫的过程中维......
  • 贤鱼的刷题日常--P1981 [NOIP2013 普及组] 表达式求值
    ......
  • P1966 [NOIP2013 提高组] 火柴排队做题笔记
    这题和P5677一样,是从树状数组题单里翻出来的,由于开始看时感觉题解代码写的不是很清晰,就先放进了做题计划里,后来几次看这道题,但由于第一次看题可能留下了一些心理阴影以及......
  • J [NOIP2013]货车运输 lca 最大生成树 点和点之间所有路径最小值的最大值
     链接:https://ac.nowcoder.com/acm/problem/16527来源:牛客网题目描述A国有n座城市,编号从1到n,城市之间有m条双向道路。每一条道路对车......
  • P1966 [NOIP2013 提高组] 火柴排队
    有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同。其中\(a_i\)表示第一列火柴中第\(i\)个火柴的高......
  • P1967 [NOIP2013 提高组] 货车运输
    给定一张图,\(q\)组询问从\(s_i\)到\(t_i\)路径上最大边权的最小值。\(n<10^4\),\(m<5\times10^4\),\(q<3\times10^4\)。首先,所有询问的答案均在原图的最小生......
  • P1967 [NOIP2013 提高组] 货车运输 题解
    题目描述A国有\(n\)座城市,编号从\(1\)到\(n\),城市之间有\(m\)条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有\(q\)辆货车在运输货物,司机们想知道......
  • [NOIP2013 提高组] 积木大赛
    试题分析:题目虽然可以用递归,但最优方法还是用贪心,每次输入进去,如果比前一个数小,那么减前一个数时就可以顺便把他减掉,如果大于则还得自己减。代码: ......