[BZOJ2002] Bounce 弹飞绵羊(分块)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define fr first
 4 #define sc second
 5 #define cl clear
 6 #define BUG puts("here!!!")
 7 #define W(a) while(a--)
 8 #define pb(a) push_back(a)
 9 #define Rint(a) scanf("%d", &a)
10 #define Rll(a) scanf("%lld", &a)
11 #define Rs(a) scanf("%s", a)
12 #define Cin(a) cin >> a
13 #define FRead() freopen("in", "r", stdin)
14 #define FWrite() freopen("out", "w", stdout)
15 #define Rep(i, len) for(int i = 0; i < (len); i++)
16 #define For(i, a, len) for(int i = (a); i < (len); i++)
17 #define Cls(a) memset((a), 0, sizeof(a))
18 #define Clr(a, in) memset((a), (in), sizeof(a))
19 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
20 #define lrt rt << 1
21 #define rrt rt << 1 | 1
22 #define pi 3.14159265359
23 #define RT return
24 #define lowbit(in) in & (-in)
25 #define onenum(in) __builtin_popcount(in)
26 typedef long long LL;
27 typedef long double LD;
28 typedef unsigned long long ULL;
29 typedef pair<int, int> pii;
30 typedef pair<string, int> psi;
31 typedef pair<LL, LL> pll;
32 typedef map<string, int> msi;
33 typedef vector<int> vi;
34 typedef vector<LL> vl;
35 typedef vector<vl> vvl;
36 typedef vector<bool> vb;
37
38 const int maxn = 200200;
39 int n, q, sz, cmd;
40 int st[maxn], to[maxn], k[maxn], be[maxn];
41
42 void update(int pos, int val) {
43     k[pos] = val;
44     for(int i = pos; i >= be[pos] * sz; i--) {
45         if(i + k[i] > n - 1) {
46             st[i] = 1;
47             to[i] = -1;
48         }
49         else {
50             if(be[i] == be[i+k[i]]) {
51                 st[i] = st[i+k[i]] + 1;
52                 to[i] = to[i+k[i]];
53             }
54             else {
55                 st[i] = 1;
56                 to[i] = i + k[i];
57             }
58         }
59     }
60 }
61
62 int query(int pos) {
63     int ret = 0;
64     while(pos != -1) {
65         ret += st[pos];
66         pos = to[pos];
67     }
68     return ret;
69 }
70
71 signed main() {
72     // FRead();
73     int x, y;
74     while(~Rint(n)) {
75         sz = sqrt(n);
76         Cls(st); Cls(to);
77         Rep(i, n) {
78             Rint(k[i]);
79             be[i] = i / sz;
80         }
81         for(int i = n - 1; i >= 0; i--) update(i, k[i]);
82         Rint(q);
83         W(q) {
84             Rint(cmd);
85             if(cmd == 1) {
86                 Rint(x);
87                 printf("%d\n", query(x));
88             }
89             else {
90                 Rint(x); Rint(y);
91                 update(x, y);
92             }
93         }
94     }
95     RT 0;
96 }
时间: 2024-10-09 20:52:03

[BZOJ2002] Bounce 弹飞绵羊(分块)的相关文章

【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Los

BZOJ 2002 Bounce 弹飞绵羊(分块|暴力|)(困难)

Bounce 弹飞绵羊 Time Limit:10000MS     Memory Limit:265216KB     64bit IO Format:%lld & %llu Submit Status Practice HYSBZ 2002 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后

【codevs2333】&amp;【BZOJ2002】弹飞绵羊[分块]

我其实是在codevs上看到它的题号后才去做这道题的...2333... 题目传送门:codevs:http://codevs.cn/problem/2333/ bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意已经说的很清晰了,蓝鹅--我不会做. 看题解有两种写法:分块和link-cut tree.但是lct我不会,只能用分块了. 但是怎么分块呢? 我们想一下有什么暴力写法.一种是记录每个反弹装置能往后弹多长距离,这样效率是

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数. Input 第一行

bzoj-2002 Bounce 弹飞绵羊

题意: 直线上有一排n个弹力装置,每个弹力装置会将绵羊弹到下ki个弹力装置处: 如果没有了则绵羊被弹飞.. 问每个绵羊被弹了几次弹飞: 可能会修改弹力装置的k值: n<=200000,m<=100000: 题解: 裸的LCT吧: 所以下面的启发式合并Splay是啥鬼: 有人说这题边有向,和无向边不一样: 然而有个卵区别,把终点作为根不就有向了吗! 反正切了上一题这一题也不难吧: 维护个size之后,把终点作为根再access(x): 这时的Splay就是x弹飞的路线啦,Splay(x)之后x的

B2002 [Hnoi2010]Bounce 弹飞绵羊 分块

原来做过,看大家都做这道题都热情高涨,沈爷爷debug这道题4天,作为告诉他这个题的人,我还有点不好意思...我自己也就做了一个小时. 其实这个题思路还好,就是维护每个点的出块次数和跳出块的位置,然后访问的时候直接调用块. 这个题还有一个比较坑的地方,就是每个绵羊只有到队尾的时候才会被弹飞,所以不用担心在中间停止的情况. 题干: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿

BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

http://www.lydsy.com/JudgeOnline/problem.php?id=2002 维护cnt[i]表示第i个节点,跳出他所属于的块的最小步数, to[i]表示第i个节点,跳出他所属的块的时候,去到那一个位置. 那么, 查询:复杂度O(sqrt(n)),不断   ans += cnt[i]   然后   i  = to[i]即可. 更新:分块这种东西,跟新都是块内更新的,块间都是独立的. 更新第id个东西,可以知道是不影响后面的.而且如果我知道第id个跳去了那个块,步数也可

【bzoj2002】弹飞绵羊——分块

这道题是很简单的分块吧,统计每个块里要中转的次数(即st数组),最后输出即可. 如果修改某个弹力装置的弹力系数,那么要从这个装置开始往回走到这一块的最左端(即l[belong[b]]),修改相对应的st数组和pt数组,它前面的块和后面的块都不受影响(因为st统计的是走到这一步到走出这一个装置所属的块所需的步数). 具体实现细节看代码: #include<cstdio> #include<cstring> #include<cmath> #include<iostr

bzoj2002【HNOI2010】Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 7467  Solved: 3934 [Submit][Status][Discuss] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹