数据结构(块状链表):COGS 1689. [HNOI2010]Bounce 弹飞绵羊
时间限制:1 s
内存限制:259 MB
【题目描述】
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿
着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,
则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何
时候弹力系数均为正整数。
【输入格式】
第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,
接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成
k。对于10%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000
【输出格式】
对于每个i=1的情况,你都要输出一个需要的步数,占一行。
【样例输入】
- 4
- 1 2 1 1
- 3
- 1 1
- 2 1 1
- 1 1
【样例输出】
- 2
- 3
由于修改操作很多,可以将复杂度摊给询问操作。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- using namespace std;
- const int maxn=;
- int a[maxn],bel[maxn],sum[maxn],to[maxn];
- int n,m,K,Q;
- int Query(int x){
- int ret=;
- while(x!=-){
- ret+=sum[x];
- x=to[x];
- }
- return ret;
- }
- int main(){
- freopen("bzoj_2002.in","r",stdin);
- freopen("bzoj_2002.out","w",stdout);
- scanf("%d",&n);
- m=sqrt(n+0.5);
- for(int i=;i<=n;i++){
- if((i-)%m==)K++;
- bel[i]=K;
- scanf("%d",&a[i]);
- }
- for(int i=n;i>=;i--){
- if(i+a[i]>n){
- to[i]=-;
- sum[i]=;
- }
- else{
- if(bel[i]==bel[i+a[i]]){
- to[i]=to[i+a[i]];
- sum[i]=sum[i+a[i]]+;
- }
- else{
- to[i]=i+a[i];
- sum[i]=;
- }
- }
- }
- scanf("%d",&Q);
- while(Q--){
- int op,x,y;
- scanf("%d",&op);
- if(op==){
- scanf("%d",&x);x++;
- printf("%d\n",Query(x));
- }
- else{
- scanf("%d%d",&x,&y);x++;
- a[x]=y;
- if(x+y>n){
- sum[x]=;
- to[x]=-;
- }
- else{
- if(bel[x]==bel[x+y]){
- to[x]=to[x+y];
- sum[x]=sum[x+y]+;
- }
- else{
- to[x]=x+y;
- sum[x]=;
- }
- }
- for(int p=x-;bel[p]==bel[x];p--)
- if(bel[p]==bel[p+a[p]])
- sum[p]=sum[p+a[p]]+,to[p]=to[p+a[p]];
- }
- }
- return ;
- }
数据结构(块状链表):COGS 1689. [HNOI2010]Bounce 弹飞绵羊的更多相关文章
- COGS.1689.[HNOI2010]Bounce 弹飞绵羊(分块)
题目链接 /* 分块,维护从某位置跳到下一个块需要多少步 */ #include<cmath> #include<cstdio> #include<cctype> ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree
2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4055 Solved: 2172[Submi ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊
BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...
随机推荐
- CTE在Oracle和Sqlserver中使用的差异
CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...
- PHP面向对象的基本写法(区别于java)
<?php /** * 这是一个人的对象 */ class ClassName { public $name; public $age; public $sex; public static $ ...
- MVC ViewEngine视图引擎解读及autofac的IOC运用实践
MVC 三大特色 Model.View.Control ,这次咱们讲视图引擎ViewEngine 1.首先看看IViewEngine接口的定义 namespace System.Web.Mvc { ...
- Spring MVC返回json数据给Android端
原先做Android项目时,服务端接口一直是别人写的,自己拿来调用一下,但下个项目,接口也要自己搞定了,我想用Spring MVC框架来提供接口,这两天便抽空浅学了一下该框架以及该框架如何返回json ...
- C# 如何创建接口以及使用接口的简单Demo(转载!)
//No:1 首先,我们要封装一个接口,接口中不要实现具体的方法(说白了这就是一个架子而已!) using System;using System.Collections.Generic;using ...
- C语言中,如何通过socket得到对端IP地址
struct sockaddr_in clientaddr1; memset(&clientaddr1, 0x00, sizeof(clientaddr1)); socklen_t nl=si ...
- .NET 4.6
http://referencesource.microsoft.com/ DownLoad 下载原代码
- Redis Admin UI
https://github.com/ServiceStackApps/RedisAdminUI 最近的v4版本不能用,需要下载v3版本,下载地址 https://github.com/Service ...
- tableView嵌套collectionView
首先是自定义collectionView填充的tableViewCell import UIKit // 定义一个collectionView,重写初始化大小和布局方法 class TrendsDet ...
- c#wiform中KeyDown事件
当首次按下键盘上某个键时发生事件. 例如 private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Ke ...