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),一些司机使用以下策略。
最初驾驶员在城市x,当前时间t等于0。在驾驶员抵达城市之前,他会采取以下行动:
1.如果当前时间t是ax的倍数,那么高速公路号x的段现在有交通问题,驾驶员在当前城市停留一个单位时间(当前t = t + 1)。
2.如果当前时间t不是ax的倍数,那么高速公路号x的段现在是畅通的,驾驶员使用一个单位时间移动到城市x + 1(当前t = t + 1且x = x + 1)。
你正在开发一个新的交通控制系统。您要连续处理两种类型的q查询:
A:我们应用上面描述的策略,确定从城市x到城市y(x <y)之后的时间t的最终值。请注意,对于每个查询t初始值为0。
C:用值y替换出现在段号x上的堵塞时段(令ax = y)。
10
2 5 3 2 3 5 3 4 2 4
10
C 10 6
A 2 6
A 1 3
C 3 4
A 3 11
A 4 9
A 5 6
C 7 3
A 8 10
A 2 5
5
3
14
6
2
4
4
这道题还是不是那么好想的……
我们需要发现一个性质:对于0s和60s来说,我们只要走相同的路得到的时间%60都是一样的。
(原因很简单,2-6最小公倍数为60)
所以我们开线段树tree[i][j]表示i区间从js(0<=j<60)开始从头走到尾的最终时间。
build的时候公式如下:
tree[a][i]=tree[a*2+1][tree[a*2][i]%tmax]+tree[a*2][i]/tmax*tmax;
gai的时候和build差不多。
询问的话……看代码吧。
(祝贺60棵线段树AC第一道CF题)
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
inline int read(){
int X=,w=; char ch=;
while(ch<''||ch>'') {if(ch=='-') w=-;ch=getchar();}
while(ch>=''&&ch<='') X=(X<<)+(X<<)+ch-'',ch=getchar();
return X*w;
}
const int tmax=;
int tree[][tmax];
int b[];
void build(int a,int l,int r){
if(l==r){
for(int i=;i<tmax;i++){
if(i%b[l])tree[a][i]=i+;
else tree[a][i]=i+;
}
return;
}
int mid=(l+r)>>;
build(a*,l,mid);
build(a*+,mid+,r);
for(int i=;i<tmax;i++){
tree[a][i]=tree[a*+][tree[a*][i]%tmax]+tree[a*][i]/tmax*tmax;
}
return;
}
int check(int a,int l,int r,int l1,int r1,int t){
if(l>r1||r<l1)return t;
if(l1<=l&&r<=r1){
return tree[a][t%tmax]+t/tmax*tmax;
}
int mid=(l+r)>>;
int k1=check(a*,l,mid,l1,r1,t);
int k2=check(a*+,mid+,r,l1,r1,k1);
return k2;
}
void gai(int a,int l,int r,int x,int y){
if(x<l||r<x)return;
if(l==x&&x==r){
b[l]=y;
for(int i=;i<tmax;i++){
if(i%b[l])tree[a][i]=i+;
else tree[a][i]=i+;
}
return;
}
int mid=(l+r)>>;
gai(a*,l,mid,x,y);
gai(a*+,mid+,r,x,y);
for(int i=;i<tmax;i++){
tree[a][i]=tree[a*+][tree[a*][i]%tmax]+tree[a*][i]/tmax*tmax;
}
return;
}
int main(){
int n=read();
for(int i=;i<=n;i++){
b[i]=read();
}
build(,,n);
int q=read();
for(int i=;i<=q;i++){
char c;
cin>>c;
int x=read();
int y=read();
if(c=='A'){
printf("%d\n",check(,,n,x,y-,));
}else{
gai(,,n,x,y);
}
}
return ;
}
CF498D:Traffic Jams in the Land——题解的更多相关文章
- CF498D Traffic Jams in the Land
嘟嘟嘟 题面:有n条公路一次连接着n + 1个城市,每一条公路有一个堵塞时刻a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟:否则需要1分钟. 现给出n条公路的a[i],以及m次操作 ...
- Codeforces 498D Traffic Jams in the Land | 线段树
题目大意: 给坐标轴1~n的点,每个点有一个权值,从一个点走到下一个点需要1s,如果当前时间是权值的倍数就要多花1s 给出q组操作,C表示单点修改权值,A表示询问0时刻x出发到y的时间 题解:因为权值 ...
- CF #284 div1 D. Traffic Jams in the Land 线段树
大意是有n段路,每一段路有个值a,通过每一端路需要1s,如果通过这一段路时刻t为a的倍数,则需要等待1s再走,也就是需要2s通过. 比较头疼的就是相邻两个数之间会因为数字不同制约,一开始想a的范围是2 ...
- [codeforces] 498D Traffic Jams in th Land
原题 简单的线段树问题. 对于题目中,a[i]的范围是2~6,我们仔细思考可以得出第0秒和第60秒是一样的(因为2~6的最小公倍数是60,),然后我们可以建一个线段树,里面记录0~59秒时刻开始通过这 ...
- HDU3686 Traffic Real Time Query System 题解
题目 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, t ...
- UVALive-4839 HDU-3686 Traffic Real Time Query System 题解
题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- Codeforces Round #284 (Div. 1)
A. Crazy Town 这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1.用叉积判断即可. ...
- Gym 100507I Traffic Jam in Flower Town (模拟)
Traffic Jam in Flower Town 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/I Description ...
随机推荐
- Awesome Flask
Awesome Flask A curated list of awesome Flask resources and plugins Awesome Flask Framework Admin i ...
- 怎样安装JMeter
JMeter有图形界面, 而且支持中文! JMeter官网地址: http://jmeter.apache.org/ 点击左上角的下载: 点击下面的.zip后缀的压缩包: 解压到本地: JMeter目 ...
- MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)
关于MATLAB实现连续信号的频谱分析,以正余弦波信号频谱分析为例分析如下: 1.含有频率f ,2f和3f的正弦波叠加信号,即: 其中,f =500Hz.试采用Matlab仿真软件对该信号进行频谱分析 ...
- linux学习总结----redis总结
安装 下载:打开redis官方网站,推荐下载稳定版本(stable) 解压 tar zxvf redis-3.2.5.tar.gz 复制:推荐放到usr/local目录下 sudo mv -r ...
- leetcode-电话号码的字母组合
电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" ...
- Java学习 · 初识 多线程
多线程 1. 基础概念 a) 程序 Program i. 静态代码,指令集,应用程序执行的蓝本 b) 进程 Process i. 动态概念,正在运 ...
- 【CQOI 2007】 余数求和
题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 ...
- Firefox-css-hack
先记下:之后研究.试了一下,新版本FF-32.0效果不错,低版本还没测试. @-moz-document url-prefix() { .container { ... }}
- yun rpm
RPM:RedHat Package Manager的简称,是一种数据库记录的方式的管理机制.当需要安装的软件的依赖软件都已经安装,则继续安装,否则不予安装. 特点:1.已经编译并打包完成2.软件的信 ...
- 基于MTCNN多任务级联卷积神经网络进行的人脸识别 世纪晟人脸检测
神经网络和深度学习目前为处理图像识别的许多问题提供了最佳解决方案,而基于MTCNN(多任务级联卷积神经网络)的人脸检测算法也解决了传统算法对环境要求高.人脸要求高.检测耗时高的弊端. 基于MTCNN多 ...