CF 498D 线段树

大意是有n段路,每一段路有个值a,通过每一端路需要1s,如果通过这一段路时刻t为a的倍数,则需要等待1s再走,也就是需要2s通过。

比较头疼的就是相邻两个数之间会因为数字不同制约,一开始想a的范围是2-6,处理这几个数字互相之间的关系,还是想岔了。

正解应当是开60个线段树,因为2-6的LCM是60,也就是所有数字模2-6,结果的循环节长度为60。所以如果从i到j,开始时刻如果为0,则答案一定与开始时刻为60相同。

第x个线段树某个节点范围如果是i和j,维护的便是开始时刻模60为x的情况下,从i到j+1需要的时间。

写的时候按照这个处理节点信息合并与查询即可。

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <cmath>
 8 #include <cstdlib>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set>
13
14 using namespace std;
15
16 const int N=1e5+10;
17 const int M=60;
18 int v[N<<2][M];
19
20 void up(int rt) {
21     for (int i=0;i<M;i++) {
22         v[rt][i]=v[rt<<1][i]+v[rt<<1|1][(i+v[rt<<1][i])%M];
23     }
24 }
25 void build(int l,int r,int rt) {
26     if (l==r) {
27         int a;
28         scanf("%d",&a);
29         for (int i=0;i<M;i++)
30             v[rt][i]=1+(i%a==0);
31         return;
32     }
33     int m=(l+r)>>1;
34     build(l,m,rt<<1);
35     build(m+1,r,rt<<1|1);
36     up(rt);
37 }
38 void update(int p,int a,int l,int r,int rt) {
39     if (l==r) {
40         for (int i=0;i<M;i++)
41             v[rt][i]=1+(i%a==0);
42         return;
43     }
44     int m=(l+r)>>1;
45     if (p<=m)
46         update(p,a,l,m,rt<<1);
47     else
48         update(p,a,m+1,r,rt<<1|1);
49     up(rt);
50 }
51 int ask(int L,int R,int l,int r,int rt,int p) {
52     if (L<=l&&r<=R) {
53         return v[rt][p];
54     }
55     int ret=0;
56     int m=(l+r)>>1;
57     if (L<=m) ret+=ask(L,R,l,m,rt<<1,p);
58     if (R>m) ret+=ask(L,R,m+1,r,rt<<1|1,(p+ret)%M);
59     return ret;
60 }
61 int main () {
62     int n;
63     scanf("%d",&n);
64     build(1,n,1);
65     int Q;
66     scanf("%d",&Q);
67     while (Q--) {
68         char s[5];
69         int x,y;
70         scanf("%s %d %d",s,&x,&y);
71         if (s[0]==‘C‘)
72             update(x,y,1,n,1);
73         else
74             printf("%d\n",ask(x,y-1,1,n,1,0));
75     }
76     return 0;
77 }
时间: 2024-10-20 02:31:59

CF 498D 线段树的相关文章

CF 338E, 线段树

这道题真是太伤节奏了,做完之后好几天没动弹了. 题目大意:给你两个数组a.b,a长b短,对于以a每个位置开头与b等长的连续子序列,我们询问是否有这样一个匹配方式让子序列每个数和b中每个数一一对应相加且和大于给定的常数h. 解:没有想明白,去看官解没弄懂出题人是怎么分块瞎搞的.搜了一下题解,发现有一个更巧妙的解法,首先我们对b排序不会影响到结果,然后对于某个数,他在排序后的b里的合法匹配方案一定是连续的一段,这样就转化成了线段问题.对于Bn(从小到大排序的B数组),我们可知必须子序列里有n个数和他

CF 633G 线段树+bitset

大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的质数. 第一种操作非常熟悉了,把每个节点dfs过程中的pre和post做出来,对序列做线段树.维护取模也不是问题.第二种操作,可以利用bitset记录质数出现情况.所以整个线段树需要维护bitset的信息. 对于某一个bitset x,如果子树所有值需要加y,则x=(x<<y)|(x>>(m-y)) 一开始写挂了几次,有一点没注意到,因为我bitset直接全都是1000,而不是m,所以上

CF 446C 线段树

CF446C题意: 给你一个数列\(a_i\),有两种操作:区间求和:\(\sum_{i=l}^{r}(a[i]+=fib[i-l+1])\).\(fib\)是斐波那契数列. 思路 (一) \(fib[n] = \frac{\sqrt5}{5}\times [(\frac{1+\sqrt5}{2})^n-(\frac{1-\sqrt5}{2})^n]\) 有关取模.同余.逆元的一些东西: \(p = 1e9 + 9\) \(383008016^2 ≡ 5 (mod\;p)\) \(3830080

CF19D 线段树+STL各种应用

http://codeforces.com/problemset/problem/19/D Description Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coordinate system on it as follows: point (0,?0) is located in the bottom-left corner, Ox axis

【线段树】【树状数组】【CF 121E】幸运数列

1922. [CF 121E]幸运数列 ★★★ 输入文件:cf121e.in 输出文件:cf121e.out 简单对比 时间限制:3 s 内存限制:256 MB [题目描述] 对于欧洲人来说,"幸运数"是指那些十进制只由4或7组成的数.财务员Petya需要维护一个支持如下操作的整数数列: add l r d - 表示将[l, r]区间内的所有数加上一个正整数d(). count l r - 统计[l, r]区间内有多少个"幸运数".() 请你帮助Petya实现它.

CF#52 C Circular RMQ (线段树区间更新)

Description You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segment [lf,?rg] (inclusively) by v; rmq(lf,?rg) - this operation returns minimal v

CF(438D) The Child and Sequence(线段树)

题意:对数列有三种操作: Print operation l,?r. Picks should write down the value of . Modulo operation l,?r,?x. Picks should perform assignment a[i]?=?a[i] mod x for each i (l?≤?i?≤?r). Set operation k,?x. Picks should set the value of a[k] to x (in other words

(困难) CF 484E Sign on Fence,整体二分+线段树

Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence of n panels of 1 meter width and of arbitrary height. The i-th panel's height is hi meters. The adjacent planks follow without a gap between them. Afte

Cf 444C DZY Loves Colors(线段树)

DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorful ribbon, which consists of n units (they are numbered from 1 to n from left to right). The color of thei-th unit of the ribbon is i at first. It is colorful enough, but w