CF498D Traffic Jams in the Land

嘟嘟嘟

题面:有n条公路一次连接着n + 1个城市,每一条公路有一个堵塞时刻a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟;否则需要1分钟。

现给出n条公路的a[i],以及m次操作。每一次操作:1.C x d:将第x条的堵塞时刻改为d。2.A x y:询问从城市x到城市y的所需时间。

这能想到是一个线段树的题,虽然做过好多道线段树的题,但遇到这种思路比较新奇的题,独立的想出来还是有一点困难。

于是稍微参照了一下题解。

我们观察一下a[i],2 <= a[i] <= 6,很小,而且这些数的最小公倍数最大只有60,那么对于每一个节点,我们开一个tim[60]的数组,tim[j]维护在时刻 j ,通过这段区间需要的时间。

那么区间合并的时候就是 j 从0~59枚举,这个区间的第 j 个时刻花费的时间等于左区间的从 j 时刻花费的时间x,加上右区间从j + x时刻花费的时间。于是这题就完事啦。

时间复杂度O(mlogn * 60)。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cctype>
  8 #include<vector>
  9 #include<stack>
 10 #include<queue>
 11 using namespace std;
 12 #define enter puts("")
 13 #define space putchar(‘ ‘)
 14 #define Mem(a, x) memset(a, x, sizeof(a))
 15 #define rg register
 16 typedef long long ll;
 17 typedef double db;
 18 const int INF = 0x3f3f3f3f;
 19 const db eps = 1e-8;
 20 const int maxn = 1e5 + 5;
 21 inline ll read()
 22 {
 23   ll ans = 0;
 24   char ch = getchar(), last = ‘ ‘;
 25   while(!isdigit(ch)) {last = ch; ch = getchar();}
 26   while(isdigit(ch)) {ans = ans * 10 + ch - ‘0‘; ch = getchar();}
 27   if(last == ‘-‘) ans = -ans;
 28   return ans;
 29 }
 30 inline void write(ll x)
 31 {
 32   if(x < 0) x = -x, putchar(‘-‘);
 33   if(x >= 10) write(x / 10);
 34   putchar(x % 10 + ‘0‘);
 35 }
 36
 37 int n, m;
 38 char s[2];
 39
 40 struct Tree
 41 {
 42     int l, r;
 43     int tim[65];
 44 }t[maxn << 2];
 45 void pushup(int now)
 46 {
 47     for(int i = 0; i < 60; ++i)
 48         t[now].tim[i] = t[now << 1].tim[i] + t[now << 1 | 1].tim[(i + t[now << 1].tim[i]) % 60];
 49 }
 50 void build(int L, int R, int now)
 51 {
 52     t[now].l = L; t[now].r = R;
 53     if(L == R)
 54     {
 55         int x = read();
 56         for(int i = 0; i < 60; ++i)
 57             if(!(i % x)) t[now].tim[i] = 2;
 58             else t[now].tim[i] = 1;
 59         return;
 60     }
 61     int mid = (L + R) >> 1;
 62     build(L, mid, now << 1);
 63     build(mid + 1, R, now << 1 | 1);
 64     pushup(now);
 65 }
 66 void update(int idx, int d, int now)
 67 {
 68     if(t[now].l == t[now].r)
 69     {
 70         for(int i = 0; i < 60; ++i)
 71             if(!(i % d)) t[now].tim[i] = 2;
 72             else t[now].tim[i] = 1;
 73         return;
 74     }
 75     int mid = (t[now].l + t[now].r) >> 1;
 76     if(idx <= mid) update(idx, d, now << 1);
 77     else update(idx, d, now << 1 | 1);
 78     pushup(now);
 79 }
 80 int query(int L, int R, int now, int Tim)
 81 {
 82     if(t[now].l == L && t[now].r == R) return t[now].tim[Tim % 60];
 83     int mid = (t[now].l + t[now].r) >> 1;
 84     if(R <= mid) return query(L, R, now << 1, Tim);
 85     else if(L > mid) return query(L, R, now << 1 | 1, Tim);
 86     else
 87     {
 88         int ret = query(L, mid, now << 1, Tim);
 89         ret += query(mid + 1, R, now << 1 | 1, (Tim + ret) % 60);
 90         return ret;
 91     }
 92 }
 93
 94 int main()
 95 {
 96     n = read();
 97     build(1, n, 1);
 98     m = read();
 99     for(int i = 1; i <= m; ++i)
100     {
101         scanf("%s", s);
102           if(s[0] == ‘C‘)
103         {
104               int x = read(), d = read();
105               update(x, d, 1);
106         }
107           else
108         {
109               int L = read(), R = read();
110               write(query(L, R - 1, 1, 0)); enter;    //别忘 R - 1
111         }
112     }
113   return 0;
114 }

原文地址:https://www.cnblogs.com/mrclr/p/9784569.html

时间: 2024-11-04 15:40:41

CF498D Traffic Jams in the Land的相关文章

Traffic Jams in the Land(线段树好题)

Traffic Jams in the Land CodeForces - 498D Some country consists of (n?+?1) cities, located along a straight highway. Let's number the cities with consecutive integers from 1 to n?+?1 in the order they occur along the highway. Thus, the cities are co

CF498D:Traffic Jams in the Land——题解

https://vjudge.net/problem/CodeForces-498D http://codeforces.com/problemset/problem/498/D 题面描述: 一些国家由(n + 1)个城市组成,位于一条直路上.我们用连续的整数从1到n + 1按照高速公路上出现的顺序对城市进行编号.因此,城市由高速公路的n段连接起来,第i段连接城市i和i + 1.高速公路的每一段都与一个正整数ai相关联 - 表示何时交通拥堵期出现在该段上. 为了从城市x到城市y(x <y),一些

Codeforces 498D Traffic Jams in the Land | 线段树

题目大意: 给坐标轴1~n的点,每个点有一个权值,从一个点走到下一个点需要1s,如果当前时间是权值的倍数就要多花1s 给出q组操作,C表示单点修改权值,A表示询问0时刻x出发到y的时间 题解:因为权值只有2,3,4,5,6,所以60是一个周期,我们维护一颗线段树,维护0到59时刻出发从l到r+1用的时间 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define N 100010 5 us

[codeforces] 498D Traffic Jams in th Land

原题 简单的线段树问题. 对于题目中,a[i]的范围是2~6,我们仔细思考可以得出第0秒和第60秒是一样的(因为2~6的最小公倍数是60,),然后我们可以建一个线段树,里面记录0~59秒时刻开始通过这段所需要的时间.(如果一定要说这是60棵线段树也不是不可以--) #include<cstdio> #define N 100010 using namespace std; int n,a[N],q,x,y; char j; struct hhh { int l,r,dt[65]; }tre[N

Codeforces Round #284 (Div. 1)

A. Crazy Town 这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1.用叉积判断即可. 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<string> 5 #include<map> 6 #define N 100010 7 #def

ural 2020 Traffic Jam in Flower Town

2020. Traffic Jam in Flower Town Time limit: 1.0 secondMemory limit: 64 MB Having returned from Sun City, Dunno told all his friends that every shorty may have a personal automobile. Immediately after that so many citizens took a fancy of becoming ro

新概念英语第三册51-60课(转)

Lesson 51  Predicting the future 预测未来 1.预测世界的未来Predicting the future是众所周知的困难.is notoriously difficult. 众所周知预测未来很困难.Predicting the future is notoriously difficult. 众所周知预测未来很困难. 2.谁过去能够曾经想象过, Who could have imagined, 在20世纪70年代中叶,in the mid 1970s, 例如,fo

python推荐淘宝物美价廉商品 2.0

改动: 新增功能 :可选择只看天猫或淘宝 代码模块化封装,参数配置或输入单独在一个py文件管理,主函数功能只留出参数传入在setting配置的py文件里. main.py代码: 1 # -*- coding: utf-8 -*- 2 import urllib 3 import urllib2 4 import re 5 import time 6 import random 7 import os 8 from math import log 9 from math import log10

URAL 2005. Taxi for Programmers (最短路 数学啊)

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2005 2005. Taxi for Programmers Time limit: 0.5 second Memory limit: 64 MB The clock shows 11:30 PM. The sports programmers of the institute of maths and computer science have just finished their trai