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)。

Input
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
Output
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——题解的更多相关文章

  1. CF498D Traffic Jams in the Land

    嘟嘟嘟 题面:有n条公路一次连接着n + 1个城市,每一条公路有一个堵塞时刻a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟:否则需要1分钟. 现给出n条公路的a[i],以及m次操作 ...

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

    题目大意: 给坐标轴1~n的点,每个点有一个权值,从一个点走到下一个点需要1s,如果当前时间是权值的倍数就要多花1s 给出q组操作,C表示单点修改权值,A表示询问0时刻x出发到y的时间 题解:因为权值 ...

  3. CF #284 div1 D. Traffic Jams in the Land 线段树

    大意是有n段路,每一段路有个值a,通过每一端路需要1s,如果通过这一段路时刻t为a的倍数,则需要等待1s再走,也就是需要2s通过. 比较头疼的就是相邻两个数之间会因为数字不同制约,一开始想a的范围是2 ...

  4. [codeforces] 498D Traffic Jams in th Land

    原题 简单的线段树问题. 对于题目中,a[i]的范围是2~6,我们仔细思考可以得出第0秒和第60秒是一样的(因为2~6的最小公倍数是60,),然后我们可以建一个线段树,里面记录0~59秒时刻开始通过这 ...

  5. 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 ...

  6. UVALive-4839 HDU-3686 Traffic Real Time Query System 题解

    题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...

  7. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  8. Codeforces Round #284 (Div. 1)

    A. Crazy Town 这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1.用叉积判断即可. ...

  9. Gym 100507I Traffic Jam in Flower Town (模拟)

    Traffic Jam in Flower Town 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/I Description ...

随机推荐

  1. unity3d 角色头顶信息3D&2D遮挡解决方案(二)

    在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际 ...

  2. JMeter自学笔记2-图形界面介绍

    一.写在前面的话: 上篇我们已经学会了如何安装JMeter和打开JMeter,那么这篇我们将对JMeter的图形界面做一个简单的介绍.大家只要简单的了解即可,无需死记硬背,在今后的学习和使用中慢慢熟悉 ...

  3. Android intel X86 图像渲染

    最近几天有个项目需要在intel 芯片的系统上集成我们的视频通话软件.之前只是在ARM平台上使用,对于intel 没测试过,直接运行apk后,本端渲染的图像出错,渲染出的图像很像I420被作为RGB5 ...

  4. Shader-水流效果

    效果图:(贴图类似于泥石流) 代码: Shader "CookbookShaders/Chapter02/ScrollingUVs" { Properties { _MainTin ...

  5. Java异常处理介绍(Java知识的重点内容)

    Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你 ...

  6. 剑指offer-字符串的排列26

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  7. Word Ladder Problem (DFS + BFS)

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

  8. qwe

    这次作业我负责的部分是把爬取完的聊天记录经行数据挖掘以及经行各种普通过滤高级过滤等. 运行截图如下: 数据分为四部分:账户名.qq/邮箱.包含关键词的发言次数.包含关键词的发言字数. 遇到的困难及解决 ...

  9. unity 学习记录

    世界第九条约定 缘起 嗯,其实一开始我知道unity是个弄游戏的,也知道好像神庙逃亡,炉石都是出自unity,然后舍友都报了,我也觉得这个东西挺高大上的,所以忍不住自己的双手,报了名,确实,这能学到很 ...

  10. iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤

    1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...