「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊
题目描述
某天,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。
输出格式:
对于每个i=1的情况,你都要输出一个需要的步数,占一行。
输入输出样例
输入样例#1:
4
1 2 1 1
3
1 1
2 1 1
1 1
输出样例#1:
2
3
说明
对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000
思路
我们运用分块思想,把序列分成\(\sqrt{n}\)块,每个点\(i\)计录两个值\(c[i],s[i]\),表示再弹\(s[i]\)次第一次落到该块外,且落到\(c[i]\)的位置。预处理是\(O(N)\)的,每次修改、查询都是\(O(\sqrt N)\)的,所以复杂度是正确的(虽然8e7有点悬)。具体看代码。
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
int N, M;
int a[MAXN], b[MAXN], n;
int c[MAXN], s[MAXN];
int main(){
	scanf( "%d", &N ); n = (int)sqrt(N);
	for ( int i = 1; i <= N; ++i ) scanf( "%d", &a[i] ), b[i] = ( i - 1 ) / n + 1;//记录每个点所属的块
	for ( int i = N; i >= 1; ){//倒序复杂度是O(N),正序是O(n^1.5)
		int t(b[i]), j(i);
		while( b[j] == t ){
			if ( j + a[j] > i ) c[j] = j + a[j], s[j] = 1;//一次就弹出该块
			else c[j] = c[j + a[j]], s[j] = s[j + a[j]] + 1;//递推思想
			j--;
		}
		i = j;
	}
	int op, x, y; scanf( "%d", &M );
	while ( M-- ){
		scanf( "%d%d", &op, &x ); x++;
		if ( op & 1 ){
			int ans(0);
			for ( int i = x; i <= N; ) ans += s[i], i = c[i];//只要一直弹即可。每次弹都会经过一整个块,因此每次复杂度为O(N^0.5)
			printf( "%d\n", ans );
		}else{
			scanf( "%d", &y );
			a[x] = y; int t(b[x]), j(x);
			while( b[j] == t ){//只要修改该块内即可,复杂度也为O(N^0.5)
				if ( j + a[j] > x ) c[j] = j + a[j], s[j] = 1;
				else c[j] = c[j + a[j]], s[j] = s[j + a[j]] + 1;
				j--;
			}
		}
	}
	return 0;
}
「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告的更多相关文章
- 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告
		P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ... 
- 【洛谷 P3203】 [HNOI2010]弹飞绵羊(LCT)
		题目链接 把每个点和能跳到的点连边,于是就构成了一个森林. 查询操作就是该点到根的路径长度,修改操作就相当于删边再重新连边. 显然是\(LCT\)的强项. 查询时\(access(x),splay(x ... 
- 「区间DP」「洛谷P1043」数字游戏
		「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ... 
- [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)
		题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ... 
- P3203 [HNOI2010]弹飞绵羊(LCT)
		P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ... 
- [HNOI2010] 弹飞绵羊 (分块)
		[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ... 
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
		[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ... 
- 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]
		题目传送门 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ... 
- P3203 [HNOI2010]弹飞绵羊  ——  懒标记?分块?LCT?...FAQ  orz
		好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ... 
随机推荐
- Redis源码解析:01简单动态字符串SDS
			Redis没有直接使用C字符串(以'\0'结尾的字符数组),而是构建了一种名为简单动态字符串( simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默认字符 ... 
- hdu 2473 Junk-Mail Filter (暴力并查集)
			Problem - 2473 为什么标题写的是暴力并查集?因为我的解法跟网上的有所不同,方法暴力很多. 先解释题意,这是一个模拟处理垃圾邮件的问题.垃圾邮件要根据它们的性质进行分类.对于10w个邮件, ... 
- 云数据库 MySQL 8.0 重磅发布,更适合企业使用场景的RDS数据库
			点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 云数据库MySQL 8.0 升级发布会 2019年5月29日15时,阿里云云数据 ... 
- Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)
			1. 异常: [console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.Defaul ... 
- oracle  识别’低效执行’的SQL语句
			用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ... 
- Fragment开发实战(二)
			由于在Android的实现机制中Fragment和Activity会被分别实例化为两个不相干的对象,他们之间的联系由Activity的一个成员对象Fragmentmanager来维护.Fragment ... 
- python中使用指定GPU
			import os os.environ["CUDA_VISIBLE_DEVICES"] = "2" # 或 os.environ["CUDA_VIS ... 
- 模板——BigInteger
			#include <iostream> #include <cstring> #include <string> #include <vector> # ... 
- 2018-8-10-win10-uwp-slider-隐藏显示数值
			title author date CreateTime categories win10 uwp slider 隐藏显示数值 lindexi 2018-08-10 19:17:19 +0800 20 ... 
- P1011 圆柱体的表面积
			题目描述 输入底面半径 \(r\) 和高 \(h\) ,输出圆柱体的表面积,保留 \(3\) 位小数. 输入格式 输入包含两个实数 \(r,h(1 \le r,h \le 1000)\) 且保证输入的 ... 
