CodeForces 13E. Holes 分块处理
正解是动态树,太难了,仅仅好分块处理水之。看了看status大概慢了一倍之多。。
分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复杂度为o(m*sqrt(n))。
分块的大体思想就是将整段区间分成sqrt(n),每次改动影响所在段内的sqrt(n)个点。每次查询遍历sqrt(n)段,然后搞出一些事情。
对于此题,首先说明几个数组的含义:
cnt[i]的意义为从i点開始跳出其所在段所须要的步数。
goal[i]的意义为从i点開始所经历的最后一个点。
jmp[i]的意义为从i点開始跳出所在段之后第一个到达点。
明确了这几个意义之后看代码就好了,文字太无力。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <ctime>
#include <iomanip> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-6)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define INF 0x3f3f3f3f
#define Mod 1000000007 using namespace std; const int MAXN = 100010,BLOCK = sqrt(100010); int jmp[MAXN],cnt[MAXN],goal[MAXN],val[MAXN]; void Updata(int x,int y,int n)
{
if(y > n)
{
jmp[x] = MAXN;
cnt[x] = 1;
goal[x] = x;
}
else if(x/BLOCK*BLOCK == y/BLOCK*BLOCK)
{
jmp[x] = jmp[y];
cnt[x] = cnt[y]+1;
goal[x] = goal[y];
}
else
{
jmp[x] = y;
cnt[x] = 1;
goal[x] = y;
}
} void Cal(int x)
{
int ans = 0,f; while(x != MAXN)
{
f = goal[x];
ans += cnt[x];
x = jmp[x];
} printf("%d %d\n",f,ans); } int main()
{
int i,j,u,v,n,m,ord,L; scanf("%d %d",&n,&m); for(i = 1;i <= n; ++i)
scanf("%d",&val[i]); for(i = n;i >= 1; --i)
Updata(i,i+val[i],n); while(m--)
{
scanf("%d",&ord); if(ord)
{
scanf("%d",&u);
Cal(u);
}
else
{
scanf("%d %d",&u,&v);
val[u] = v;
L = u/BLOCK*BLOCK;
for(i = u;i >= L; --i)
Updata(i,i+val[i],n);
}
} return 0;
}
CodeForces 13E. Holes 分块处理的更多相关文章
- codeforces 13E . Holes 分块
题目链接 nextt数组表示这个位置的下一个位置. cnt数组表示这个位置 i 到nextt[i]可以弹几次. end[i] 表示在从 i 弹出去的情况下, 最后一个位置是哪里. 然后就看代码吧. # ...
- codeforces 13EE. Holes(分块&动态树)
E. Holes time limit per test 1 second memory limit per test 64 megabytes input standard input output ...
- CodeForces - 13E(分块)
Little Petya likes to play a lot. Most of all he likes to play a game «Holes». This is a game for on ...
- CF 13E. Holes 分块数组
题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...
- (分块)Holes CodeForces - 13E
题意 n(n≤105)个洞排成一条直线,第ii个洞有力量值ai,当一个球掉进洞ii时就会被立刻弹到i+ai,直到超出n.进行m(m≤105)次操作: ·修改第i个洞的力量值ai. ·在洞xx上放一个球 ...
- Codeforces Beta Round #13 E. Holes 分块暴力
E. Holes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/13/problem/E Des ...
- CodeForces 13E 分块
题目链接:http://codeforces.com/problemset/problem/13/E 题意:给定n个弹簧和每个弹簧初始的弹力a[].当球落在第i个位置.则球会被弹到i+a[i]的位置. ...
- CF 13E Holes
Holes 题意:现在有一排洞,每个洞有一个弹力,能弹到ai之后的洞,球会弹到这个排的外面,现在有2个操作,0 a b 将第a个洞的弹力设为b, 1 a 将球放入第a个洞,求输出进洞的次数 和 弹出这 ...
- CodeForces - 13E
Little Petya likes to play a lot. Most of all he likes to play a game «Holes». This is a game for on ...
随机推荐
- HEVC码率控制浅析——HM代码阅读之一
HM的码率控制提案主要参考如下三篇:K0103,M0036,M0257.本文及后续文章将基于HM12.0进行讨论,且首先仅讨论K0103对应的代码,之后再陆续补充M0036,M0257对应的代码分析, ...
- hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )
题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...
- Android layoutInflate.inflate 方法具体解释,removeView()错误解决
错误: The specified child already has a parent. You must call removeView(). 解答: 这个错误非常直白,就是你viewGroup. ...
- 线程知识-ThreadLocal使用详解
最近在看Spring的时候回顾了一下ThreadLocal,下面是ThreadLocal的使用说明. 概述 首先,谈到ThreadLocal的使用,我们先来了解一下ThreadLocal是什么?Thr ...
- C#面向对象2 静态类、静态成员的理解
理解:静态成员属于类所有,为各个类的实例所公用,与实例无关,需要全局共享的属性或者方法定义成静态的 C#静态成员: 1.静态成员属于类所有,故用类名调用,非静态成员属于类的实例所有,用实例名调用 ...
- 为什么函数式编程在Java中很危险?
摘要:函数式编程这个不温不火的语言由来已久.有人说,这一年它会很火,尽管它很难,这也正是你需要学习的理由.那么,为什么函数式编程在Java中很危险呢?也许这个疑问普遍存在于很多程序员的脑中,作者Ell ...
- 关于mysql运行效率优化注意事项及要点
1. SQL优化的原则是:将一次操作须要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量. 调整不良SQL通常能够从下面几点切入: ? 检查不良的SQL,考虑其写法是否还有可优化内容 ? ...
- HDU1257 最小拦截系统 【贪婪】
最小拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- google2013校园招聘笔试题(全国)
google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...
- 用Delphi进行word开发
使用以CreateOleObjects方式调用Word 实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码.------------ ...