CodeForces - 13E(分块)
Little Petya likes to play a lot. Most of all he likes to play a game «Holes». This is a game for one person with following rules:
There are N holes located in a single row and numbered from left to right with numbers from 1 to N. Each hole has it's own power (hole number i has the power ai). If you throw a ball into hole i it will immediately jump to hole i + ai, then it will jump out of it and so on. If there is no hole with such number, the ball will just jump out of the row. On each of the M moves the player can perform one of two actions:
- Set the power of the hole a to value b.
- Throw a ball into the hole a and count the number of jumps of a ball before it jump out of the row and also write down the number of the hole from which it jumped out just before leaving the row.
Petya is not good at math, so, as you have already guessed, you are to perform all computations.
Input
The first line contains two integers N and M (1 ≤ N ≤ 105, 1 ≤ M ≤ 105) — the number of holes in a row and the number of moves. The second line contains N positive integers not exceeding N — initial values of holes power. The following M lines describe moves made by Petya. Each of these line can be one of the two types:
- 0 a b
- 1 a
Type 0 means that it is required to set the power of hole a to b, and type 1 means that it is required to throw a ball into the a-th hole. Numbers a and b are positive integers do not exceeding N.
Output
For each move of the type 1 output two space-separated numbers on a separate line — the number of the last hole the ball visited before leaving the row and the number of jumps it made.
Example
8 5
1 1 1 1 1 2 8 2
1 1
0 1 3
1 1
0 3 4
1 2
8 7
8 5
7 3
第一次遇到分块,还好这题不太难懂,总算学会了。
分块就是把整个数组,分成若干个小块,用来减少查询与修改的次数。
一般都是分成sqrt(n)块,这样总时间复杂度就是o(m*logn)。
分块思路:
当需要求和的时候,需要记录跳到当前块的位置,在这个块里的总跳跃数。这个可以预处理。
当需要修改的时候,就直接按照预处理的做法暴力修改该块。
附ac代码:
1 #include <algorithm>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <cstdlib>
6 using namespace std;
7 const int maxn = 1e5+10;
8 typedef long long LL;
9 int nexf[maxn];//下个块的第一个
10 int cnt[maxn];//一个块里面走多少步
11 int las[maxn];//这个块的最后一个
12 int nu[maxn];
13 int n,m;
14 int bk=sqrt(maxn);
15 void updat(int x,int y) //三种情况
16 {
17 if(y>n)//下一次跳跃超出n
18 {
19 nexf[x]=maxn;
20 cnt[x]=1;
21 las[x]=x;
22 }
23 else if(x/bk*bk==y/bk*bk)//下次跳跃仍在块内
24 {
25 nexf[x]=nexf[y];
26 cnt[x]=cnt[y]+1;
27 las[x]=las[y];
28 }
29 else//下次跳跃进入另一个块
30 {
31 nexf[x]=y;
32 cnt[x]=1;
33 las[x]=y;
34 }
35 }
36 int cal(int x)//计算所有的跳跃数
37 {
38 int ans=0,temp=0;
39 while(x!=maxn)
40 {
41 temp=las[x];
42 ans+=cnt[x];
43 x=nexf[x];
44 }
45 printf("%d %d\n",temp,ans);
46 }
47 int main()
48 {
49
50 scanf("%d%d",&n,&m);
51 for(int i=1;i<=n;++i)
52 scanf("%d",&nu[i]);
53 for(int i=n;i>=1;--i)
54 updat(i,i+nu[i]);
55 for(int i=0;i<m;++i)
56 {
57 int op,a,b;
58 scanf("%d",&op);
59 if(op)
60 {
61 scanf("%d",&a);
62 cal(a);
63 }
64 else//暴力修改
65 {
66 scanf("%d%d",&a,&b);
67 nu[a]=b;
68 int l=a/bk*bk;
69 for(int i=a;i>=l;--i)
70 updat(i,i+nu[i]);
71 }
72 }
73
74 return 0;
75 }
参考博客:http://blog.csdn.net/zmx354/article/details/40582125
CodeForces - 13E(分块)的更多相关文章
- CodeForces 13E 分块
题目链接:http://codeforces.com/problemset/problem/13/E 题意:给定n个弹簧和每个弹簧初始的弹力a[].当球落在第i个位置.则球会被弹到i+a[i]的位置. ...
- CodeForces 13E. Holes 分块处理
正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多.. 分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...
- (分块)Holes CodeForces - 13E
题意 n(n≤105)个洞排成一条直线,第ii个洞有力量值ai,当一个球掉进洞ii时就会被立刻弹到i+ai,直到超出n.进行m(m≤105)次操作: ·修改第i个洞的力量值ai. ·在洞xx上放一个球 ...
- codeforces 13E . Holes 分块
题目链接 nextt数组表示这个位置的下一个位置. cnt数组表示这个位置 i 到nextt[i]可以弹几次. end[i] 表示在从 i 弹出去的情况下, 最后一个位置是哪里. 然后就看代码吧. # ...
- CodeForces 444C 分块
题目链接:http://codeforces.com/problemset/problem/444/C 题意:给定一个长度为n的序列a[].起初a[i]=i,然后还有一个色度的序列b[],起初b[i] ...
- CodeForces 455D 分块
题目链接:http://codeforces.com/problemset/problem/455/D 题意:给定一个长度为n的序列a[]. m次操作.共有两种操作 1 l r:将序列的a[l].a[ ...
- CodeForces 551E 分块
题目链接:http://codeforces.com/problemset/problem/551/E 题意:给定一个长度为N的序列. 有2个操作 1 l r v:序列第l项到第r项加v(区间加), ...
- CodeForces 103D 分块处理
题目链接:http://codeforces.com/problemset/problem/103/D 题意:给定一个长度为n的序列.然后q个询问.每个询问为(a,b),表示从序列第a项开始每b项的加 ...
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 828E) - 分块
Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A ...
随机推荐
- 基于HBuilderX+UniApp+ColorUi+UniCloud 优宝库 开发实战(一)
1. 优宝库介绍 优宝库是基于阿里妈妈.淘宝联盟 淘宝商品Api,前端使用HBuilderX + UniApp + ColorUi,后端采用UniClound 精选淘宝商品进行推荐的App程序.下 ...
- 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。
目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...
- mysql(连接查询和数据库设计)
--创建学生表 create table students ( id int unsigned not null auto_increment primary key, name varchar(20 ...
- 前端中的script标签
script标签中的重要属性! . 浏览器解析行内脚本的方式决定了它在看到字符串时,会将其当成结束的 标签.想避免这个问题,只需要转义字符"\" ①即可: 要包含外部文件中的 Ja ...
- (15)-Python3之--configparser模块
1.模块简介 configparser模块是python用来读取配置文件的模块,置文件的格式跟windows下的ini或conf配置文件相似,可以包含一个或多个节(section), 每个节可以有多个 ...
- Property attribute.
class property(object): """ Property attribute. fget function to be used for getting ...
- spring restTemplate 进行http请求的工具类封装
本文为博主原创,未经允许不得转载: 1.对常用调用的方法进行封装: import org.springframework.http.HttpHeaders; import com.alibaba.fa ...
- centos 7.6安装WeADMIN ITOSS步骤
0.升级系统并安装必要的软件 yum -y update yum -y install wget unzip nmap 1.下载JDK jdk下载地址:http://www.oracle.com/te ...
- 学生信息管理系统总结——student数据库中表关系分析
说到关系,那就不得不提两个东西: 1.E-R图,也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型 2.关系模 ...
- HTML复习day01
1. 常见的浏览器内核 1 IE Trident 2 firefox Gecko 3 Safari webkit (安卓 苹果 大部分国产) 4 chrome Chromlum/blink 2. we ...