Codeforces13E - Holes

2024-03-19 18:08
文章标签 holes codeforces13e

本文主要是介绍Codeforces13E - Holes,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Portal

Description

\(n(n\leq10^5)\)个洞排成一条直线,第\(i\)个洞有力量值\(a_i\),当一个球掉进洞\(i\)时就会被立刻弹到\(i+a_i\),直到超出\(n\)。进行\(m(m\leq10^5)\)次操作:

  • 修改第\(i\)个洞的力量值\(a_i\)
  • 在洞\(x\)上放一个球,问该球几次后被哪个洞弹飞出界。

Solution

\(n\)个洞分成大小为\(\sqrt n\)\(\sqrt n\)个块。
\(c[i]\)记录\(i\)要跳出所在的块需要多少次,\(nxt[i]\)记录跳出到哪个点。
修改时,从后到前重构该块内所有点的\(c[i]\)\(nxt[i]\),其他块不受影响。
查询时,由\(i\)跳到\(nxt[i]\)并累加\(c[i]\),在即将出界\((nxt[i]>n)\)前一步一步跳来得知是哪个洞将它弹出界的。

时间复杂度\(O(m\sqrt n)\)

Code

//Holes
#include <cstdio>
#include <cmath>
inline char gc()
{static char now[1<<16],*S,*T;if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}return *S++;
}
inline int read()
{int x=0,f=1; char ch=gc();while(ch<'0'||'9'<ch) {if(ch=='-') f=-1; ch=gc();}while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int const N=1e5+10;
int n,m,n0;
int p[N],nxt[N],c[N];
void update(int t)
{int fr=t*n0,to=fr+n0-1; if(to>n) to=n;for(int i=to;i>=fr;i--)if(i+p[i]>to) nxt[i]=i+p[i],c[i]=1;else nxt[i]=nxt[i+p[i]],c[i]=1+c[i+p[i]];
}
int main()
{n=read(),m=read(); n0=sqrt(n);for(int i=1;i<=n;i++) p[i]=read(),nxt[i]=i,c[i]=0;for(int t=0;t<=n/n0;t++) update(t);for(int i=1;i<=m;i++){int opt=read();if(opt==0){int x=read(),y=read();p[x]=y; update(x/n0);}else{int res=0,pre;for(int x=read();x<=n;x=nxt[x]) pre=x,res+=c[x];while(pre+p[pre]<=n) pre+=p[pre];printf("%d %d\n",pre,res);}}return 0;
}

P.S.

双倍经验[Hnoi2010]Bounce 弹飞绵羊。

转载于:https://www.cnblogs.com/VisJiao/p/8490839.html

这篇关于Codeforces13E - Holes的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826836

相关文章

CF 797F Mice and Holes(单调队列优化dp)

F. Mice and Holes 先给老鼠和洞排序,然后dp解之dp[i][j]表示前i个洞进了j个老鼠的最小cost,很容易想到 O(n∗n∗m)

Halcon计算封闭区域(孔洞)的面积area_holes

Halcon计算封闭区域(孔洞)的面积 除了可以用area_center 算子计算区域的面积以外,在Halcon中还可以使用area_holes算子计算图像中封闭区域(孔洞)的面积。该面积指的是区域中孔洞部分包含的像素数。一个区域中可能不只包含一个孔洞区域,因此该算子将返回所有孔洞区域的面积之和。 图(a)为输入的彩色图像,图(b)为经阀值分割并输出了孔洞面积的图像,其中深色 部分为提取的孔洞区

Gym - 100623H Holes

题意:有个老打字机,打印数字,打印4,6,9有3个孔,打印8有两个孔,给你一个数字n,问你打出n个孔的最小数字是多少。 题目中给的6,9根本就没有什么用处,就是帮助你理解题意的。 既然最小的肯定4开头,或着8开头,偶数的话,全是8即可,奇数的话打出来一个4,然后补满8。 不说了,代码. 这个是我第一次碰到需要使用 freopen("holes.in","r",stdin);fre