c++之路进阶——codevs2333(弹飞绵羊)

时间:2022-09-04 21:15:50

2333 弹飞绵羊

2010年省队选拔赛湖南

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 Description

Lostmonkey发明了一种超级反弹装置。为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿一条直线摆放 n个反弹装置,并按从前往后的方式将反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当绵羊落到第 i 个反弹装置上时,它将被往后弹出 ki 步,即落到第 i+ki 个反弹装置上,若不存在第i+ki个反弹装置,则绵羊被弹飞。绵羊想知道: 从第i个反弹装置开始, 它被弹出几次 (含被弹飞的那次)后会被弹飞。为使游戏更有趣,Lostmonkey 还可以修改某个反弹装置的弹力系数,但任何时候弹力系数均为正整数。

输入描述 Input Description

输入文件第一行是一个整数n,表示地上摆放n个反弹装置,输入文件第二行是用空格隔开的n个正整数k0,k1,…,kn-1,分别表示n个反弹装置的初始弹力系数。输入文件第三行是一个正整数m,表示后面还有m行输入数据。接下来的m行,每行至少有用空格隔开的两个整数i和j,若i=1,则你要输出从第j个反弹装置开始,被弹出几次后会被弹飞;若i=2,则该行有用空格隔开的三个整数i,j和k,表示第j个反弹装置的弹力系数被修改为k。

输出描述 Output Description

包含的行数等于输入文件最后m行中i=1的行数。第h行输出一个整数,表示对输入中给出的第h个求弹出次数的问题,基于n个反弹装置当时的弹力系数,求出的弹出次数。

样例输入 Sample Input


1 2 1 1

1 1 
2 1 1 
1 1

样例输出 Sample Output


3

数据范围及提示 Data Size & Hint

输入的数据保证20%的数据满足n,m≤10000。100%的数据满足n≤200000,m≤100000

题解

块状链表,

维护跳出该块的步数(bushu),所到达的点(finish),对同一块中进行压缩路径(虽然有点不像,但我是这样理解的)。

 #include<cstdio>
#include<iostream>
#include<cmath>
#define maxn 200010 using namespace std; int sqrp,n,m,a[maxn],l[],r[],bushu[maxn],finish[maxn],belong[maxn],gs; int find(int x)
{
int ans=;
for(;;)
{
ans+=bushu[x];
if (!finish[x]) return ans;
x=finish[x];
}
} int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
sqrp=sqrt(n);
if (n%sqrp) gs=n/sqrp+;
else gs=n/sqrp;
for (int i=;i<=gs;i++)
l[i]=(i-)*sqrp+,r[i]=i*sqrp;
r[gs]=n;
for (int i=;i<=n;i++)
belong[i]=(i-)/sqrp+;
for (int i=n;i>;i--)
{
if(i+a[i]>n)bushu[i]=;
else if(belong[i]==belong[i+a[i]])
bushu[i]=bushu[i+a[i]]+,finish[i]=finish[i+a[i]];
else bushu[i]=,finish[i]=i+a[i];
}
scanf("%d",&m);
for (int i=;i<=m;i++)
{
int aa,bb,cc;
scanf("%d",&aa);
if (aa==)
scanf("%d",&bb),printf("%d\n",find(bb+));
else
{
scanf("%d%d",&bb,&cc);
a[bb+]=cc;
for(int i=bb+;i>=l[belong[bb+]];i--)
if(belong[i]==belong[i+a[i]])
bushu[i]=bushu[i+a[i]]+,finish[i]=finish[i+a[i]];
else bushu[i]=,finish[i]=i+a[i];
}
}
return ;
}

c++之路进阶——codevs2333(弹飞绵羊)的更多相关文章

  1. 【Hnoi2010】Bzoj2002 Bounce &amp&semi; Codevs2333 弹飞绵羊

    Position: http://www.lydsy.com/JudgeOnline/problem.php?id=3143 http://codevs.cn/problem/2333/ Descri ...

  2. 【codevs2333】&amp&semi;【BZOJ2002】弹飞绵羊&lbrack;HNOI2010&rsqb;(分块)

    我其实是在codevs上看到它的题号后才去做这道题的...2333... 题目传送门:codevs:http://codevs.cn/problem/2333/ bzoj:http://www.lyd ...

  3. BZOJ 2002&colon; &lbrack;Hnoi2010&rsqb;Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9071  Solved: 4652[Submi ...

  4. 【bzoj2002】&lbrack;Hnoi2010&rsqb;Bounce 弹飞绵羊 link-cut-tree

    2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...

  5. 【BZOJ 2002】【Hnoi 2010】弹飞绵羊 分块&vert;&vert;Link Cut Tree 两种方法

    ShallWe,Yveh,hmy,DaD3zZ,四人吃冰糕从SLYZ超市出来后在马路上一字排开,,,吃完后发现冰糕棍上写着:“向狮子座表白:愿做你的小绵羊”,,, 好吧在这道题里我们要弹飞绵羊,有分块 ...

  6. BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...

  7. 【bzoj2002】&lbrack;Hnoi2010&rsqb;Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

  8. BZOJ 2002&colon; &lbrack;Hnoi2010&rsqb;Bounce 弹飞绵羊 分块

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  9. BZOJ 2002&colon; &lbrack;Hnoi2010&rsqb;Bounce 弹飞绵羊 LCT

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

随机推荐

  1. Android 手机卫士2--home页面

    1,自定义获取焦点的TextView FocusTextView.java package com.itheima.mobilesafe74.view; import android.content. ...

  2. collectionView

    // /* UICollectionView 类是iOS6 新引进的API,用于展示集合视图, 布局更加灵活,可实现多列布局,用法类似于UITableView类. - 更新视图: [collectio ...

  3. Python 脚本之获取CPU信息

    #!/usr/bin/env Python from __future__ import print_function from collections import OrderedDict impo ...

  4. jQuery学习笔记&lpar;3&rpar;

    children():只考虑子元素而不考虑其他后代元素 <html xmlns="http://www.w3.org/1999/xhtml"> <head run ...

  5. Codeforces Round &num;352 &lpar;Div&period; 2&rpar; C&period; Recycling Bottles 暴力&plus;贪心

    题目链接: http://codeforces.com/contest/672/problem/C 题意: 公园里有两个人一个垃圾桶和n个瓶子,现在这两个人需要把所有的瓶子扔进垃圾桶,给出人,垃圾桶, ...

  6. (转)ie浏览器判断

    常用的 JavaScript 检测浏览器为 IE 是哪个版本的代码,包括是否是最人极端厌恶的 ie6 识别与检测. var isIE=!!window.ActiveXObject; var isIE6 ...

  7. mysql alter使用

    修改表名: ALTER  TABLE Table_name_A RENAME TO Table_name_B; //增加主键 alter table tabelname add new_field_i ...

  8. 编程从入门到提高,然后放弃再跑路(Java)

    1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利用p ...

  9. 【AIM Tech Round 4 &lpar;Div&period; 2&rpar; D Prob】

    ·题目:D. Interactive LowerBound ·英文题,述大意:       有一个长度为n(n<=50000)的单链表,里面的元素是递增的.链表存储在一个数组里面,给出长度n.表 ...

  10. 2&period;第一个python 程序

    第一个python程序 一..python程序的编写步骤 1.创建  xxx.py文件(文件名不要中文) 文件名要以py为扩展名,因为导入的时候其他扩展名会报错.如果不导入的情况可以不限制扩展名. 2 ...