Description

click me

Solution

根据从每个点所能跳到的点连边,若被弹出,则连到一个新建节点 n+1 n+1,对于弹力系数的更改用LCT实现,每次询问时使该节点成为根,再 access(n+1) access(n + 1),然后 splay(x) splay(x),求 size[x] size[x]即可。

Code

/*****************
Au: Hany01
Date: Dec 31th, 2017
Prob: bzoj2002 & hnoi2010 bounce
Email: hany01@foxmail.com
*****************/#include<bits/stdc++.h>using namespace std;typedef long long ll;
typedef pair<int, int> PII;
typedef vector<int> VI;
#define rep(i , j) for (int i = 0 , i##_end_ = j; i < i##_end_ ; ++ i)
#define For(i , j , k) for (int i = (j) , i##_end_ = (k) ; i <= i##_end_ ; ++ i)
#define Fordown(i , j , k) for (int i = (j) , i##_end_ = (k) ; i >= i##_end_ ; -- i)
#define Set(a , b) memset(a , b , sizeof(a))
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#ifdef hany01
#define debug(...) fprintf(stderr , __VA_ARGS__)
#else
#define debug(...)
#endif#define judge(x) ((x) > n ? (n + 1) : (x))inline void File()
{
#ifdef hany01 freopen("bzoj2002.in" , "r" , stdin);freopen("bzoj2002.out" , "w" , stdout);
#endif
}template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }char c_; int _ , __;
inline int read()
{for (_ = 0 , __ = 1 , c_ = getchar() ; !isdigit(c_) ; c_ = getchar()) if (c_ == '-')  __ = -1;for ( ; isdigit(c_) ; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}const int maxn = 200005;#define dir(x) (*ch[fa[x]] != x)
#define isrt(x) (*ch[fa[x]] != (x) && ch[fa[x]][1] != x)int n, k[maxn];struct LCT
{int fa[maxn], ch[maxn][2], sz[maxn], rev[maxn];inline void maintain(int o) { sz[o] = sz[ch[o][0]] + sz[ch[o][1]] + 1; }inline void pushdown(int o){if (rev[o]) {rev[ch[o][0]] ^= 1; rev[ch[o][1]] ^= 1;rev[o] = 0; swap(ch[o][0], ch[o][1]);}}inline void rotate(int o){register int f = fa[o], gf = fa[f], d = dir(o);fa[ch[f][d] = ch[o][d ^ 1]] = f;fa[o] = gf;if (!isrt(f)) ch[gf][dir(f)] = o;ch[fa[f] = o][d ^ 1] = f;maintain(f); maintain(o);}int top, stk[maxn];inline void splay(int o){stk[top = 1] = o;for (register int t = o; !isrt(t); t = fa[t]) stk[++ top] = fa[t];while (top) pushdown(stk[top --]);for ( ; !isrt(o); rotate(o)) if (!isrt(fa[o])) rotate(dir(o) == dir(fa[o]) ? fa[o] : o);}inline void access(int o) { for (register int t = 0; o; t = o, o = fa[o]) splay(o), ch[o][1] = t, maintain(o); }inline void makeroot(int o) { access(o); splay(o); rev[o] ^= 1; }inline void link(int x, int y) { makeroot(x), fa[x] = y; }inline void cut(int x, int y) { makeroot(x); access(y); splay(y); ch[y][0] = 0; fa[x] = 0; }}lct;inline void Init()
{n = read();lct.sz[n + 1] = 1;For(i, 1, n) lct.sz[i] = 1, k[i] = read();For(i, 1, n) lct.link(i, judge(i + k[i]));
}inline void Solve()
{for (register int m = read(); m --; ) {register int op = read(), x = read() + 1;if (op == 1) {lct.makeroot(x); lct.access(n + 1); lct.splay(x);printf("%d\n", lct.sz[x] - 1);} else {lct.cut(x, judge(x + k[x]));k[x] = read();lct.link(x, judge(x + k[x]));}}
}int main()
{File();Init();Solve();return 0;
}
//醉别西楼醒不记。春梦秋云,聚散真容易。
//    -- 晏几道《蝶恋花·醉别西楼醒不记》

【BZOJ2002】【HNOI2010】弹飞绵羊(LCT)相关推荐

  1. HNOI2010——弹飞绵羊(lct)

    某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...

  2. BZOJ2002 [HNOI2010] 弹飞绵羊

    LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...

  3. P3203 [HNOI2010]弹飞绵羊

    P3203 [HNOI2010]弹飞绵羊 题目描述 详见:P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题. 但是我并不想用LCT解决此题(In fact 是不会LCT ...

  4. [HNOI2010]弹飞绵羊

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  5. 【codevs2333】【BZOJ2002】弹飞绵羊,第一次的LCT

    传送门1 传送门2 写在前面:开始种树 思路:分块 or LCT,主要结合了黄学长的模版,同时感谢char哥.Yveh.Shallwe的帮助,做法什么的建议大家还是去网上找,有很多神犇讲解得不错,蒟蒻 ...

  6. luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )

    整理的算法模板合集: ACM模板 已知:暴力 + 暴力 + 10510^5105 = 分块 设 need[i] 表示从 i 开始,跳出所在块的步数:ver[i] 表示跳出当前所在的块后到了哪里: 罗老 ...

  7. BZOJ 2002 HNOI2010 弹飞绵羊 分块

    题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹簧分 ...

  8. 【动态树】[BZOJ2002] Bounce 弹飞绵羊

    实际上就是动态树的模版加上一个维护每一条链的size这样就可以吧一次弹射看成一条路径,然后统计这个路径上的size实际上就是经过了多少个节点然后没什么了.. #include <bits/std ...

  9. BZOJ P2002 [HNOI2010] 弹飞绵羊【分块】

    这道题就很优秀了.考试的时候完全没想到正解,最后写了一个暴力20分- 直接讲分块吧.我们预处理两个数组 S t e p [ ] , G e t [ ] Step[],Get[] Step[],Get[ ...

  10. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

最新文章

  1. python数据分析要学什么_python数据分析学什么?python数据分析入门
  2. 5添加一块盘_win系统,Linux系统,重装系统后,添加盘简易教程
  3. webbrowser 百度列表点击_前嗅ForeSpider采集教程:关键词的「检索列表」采集「检索结果」...
  4. linux一直用户身份验证失败,linux – chsh:PAM身份验证失败
  5. 企业战略咨询方法:学习SWOT分析
  6. 之前写的 JSX 的条件语句竟然存在那么多 Bug?
  7. PHP7 网络编程(四)signal信号【待】
  8. python字典(dict)合并的操作
  9. hdu 4974 贪心
  10. android 增删改查错误,安卓中使用HttpURLConnection进行增删改查操作(包括后端讲解)(一)...
  11. 魔兽争霸3冰封王座,打不开,提示“此版本之魔兽争霸3需要特定语言版本之windows“
  12. E盾网络验证企业版个人版离线版易语言源码加密对接好的自绘界面1
  13. linux 设置色彩深度,wayland显示服务器,怎么把色彩深度设置成24位
  14. 计算RPS指标 Python实现
  15. word2010 2003公式编辑器 格式设置
  16. 一篇文章教你搞懂日志采集利器 Filebeat
  17. 4.React Native项目开发如何配置调试
  18. 日系插画学习笔记(二):结构与透视
  19. 如何解决html文档无法复制,职场必备技能:网页文档无法复制,3招教你轻松搞定...
  20. 运放的输入共模区间及解决VICMR问题

热门文章

  1. HTTP(一)HTTP响应的过程
  2. 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现?
  3. 2022北京最新八大员之(安全员)考试试题题库及答案
  4. 后退一步 小程序_微信小程序返回上一级页面的实现代码
  5. Kotlin 协程与flow
  6. 2019年12月 视觉顶会论文收集
  7. A Game of Thrones(11)
  8. 木兰天池全新景观2013闪亮登场
  9. Libgdx之国际化 中英文菜单切换
  10. 4. DFT进阶——ATPG