当前位置: 首页 > news >正文

bzoj 2002 弹飞绵羊 lct裸题

上一次用分块过了, 今天换了一种lct(link-cut tree)的写法。

学lct之前要先学过splay。

lct 简单的来说就是 一颗树, 然后每次起作用的都是其中的某一条链

所以每次如果需要用到一条链, 就要先 access 一下某个位置, 到root, 将其他的非法的东西抠掉。

并且 一个很大的特点就是  假设现在有u,v2个节点, 存在一条边 u -> v, 那么 u 的 父亲指向 v 但是 v 不一定存在 儿子节点指向 u , 也就是说很多时候是单向边。

然后对于整个lct来说, 他由很多个splay组成的。

代码:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
  4 #define LL long long
  5 #define ULL unsigned LL
  6 #define fi first
  7 #define se second
  8 #define pb push_back
  9 #define lson l,m,rt<<1
 10 #define rson m+1,r,rt<<1|1
 11 #define lch tr[x].son[0]
 12 #define rch tr[x].son[1]
 13 #define max3(a,b,c) max(a,max(b,c))
 14 #define min3(a,b,c) min(a,min(b,c))
 15 typedef pair<int,int> pll;
 16 const int inf = 0x3f3f3f3f;
 17 const LL INF = 0x3f3f3f3f3f3f3f3f;
 18 const LL mod =  (int)1e9+7;
 19 const int N = 2e5 + 100;
 20 int n, t;
 21 struct Node{
 22     int son[2], pre;
 23     int sz, is_root;
 24     inline void init() {
 25         son[1] = son[0] = pre = 0;
 26         sz = is_root =1;
 27     }
 28 }tr[N];
 29 void Push_Up(int x){
 30     if(!x) return ;
 31     tr[x].sz = tr[lch].sz + tr[rch].sz + 1;
 32 }
 33 void rotate(int x){
 34     if(tr[x].is_root) return ;
 35     int y = tr[x].pre, z = tr[y].pre;
 36     int k = x == tr[y].son[1];
 37     tr[y].son[k] = tr[x].son[k^1];
 38     tr[tr[y].son[k]].pre = y;
 39     tr[x].son[k^1] = y;
 40     tr[y].pre = x;
 41     tr[x].pre = z;
 42     if(tr[y].is_root) tr[x].is_root = 1, tr[y].is_root = 0;
 43     else tr[z].son[ tr[z].son[1] == y] = x;
 44     Push_Up(y);
 45     
 46 }
 47 void Splay(int x){
 48     while(!tr[x].is_root){
 49         int y = tr[x].pre, z = tr[y].pre;
 50         if(!tr[y].is_root){
 51             if((y == tr[z].son[1]) != ( x == tr[y].son[1])) rotate(y);
 52             else rotate(x);
 53         }
 54         rotate(x);
 55     }
 56     Push_Up(x);
 57 }
 58 void access(int x){
 59     int y = 0;
 60     do{
 61         Splay(x);
 62         tr[rch].is_root = 1;
 63         rch = y;
 64         tr[rch].is_root = 0;
 65         Push_Up(x);
 66         y = x;
 67         x = tr[x].pre;
 68     }while(x);
 69 }
 70 inline void link(int u, int v){
 71     if(v > n) v = 0;
 72     tr[u].pre = v;
 73 }
 74 inline void cut(int x){
 75     access(x);
 76     Splay(x);
 77     tr[lch].is_root = 1;
 78     tr[lch].pre = 0;
 79     lch = 0;
 80     Push_Up(x);
 81 }
 82 inline int Query(int x){
 83     access(x);
 84     Splay(x);
 85     return tr[lch].sz + 1;
 86 }
 87 int main(){
 88     scanf("%d", &n);
 89     for(int i = 1; i <= n; i++) tr[i].init();
 90     for(int i = 1; i <= n; i++){
 91         scanf("%d", &t);
 92         link(i, t+i);
 93     }
 94     int m, op, x, k;
 95     scanf("%d", &m);
 96     while(m--){
 97         scanf("%d", &op);
 98         if(op == 1) {
 99             scanf("%d", &x);
100             printf("%d\n", Query(x+1));
101         }
102         else {
103             scanf("%d%d", &x, &k);
104             cut(x+1);
105             link(x+1, x+k+1);
106         }
107     }
108     return 0;
109 }
View Code

 

转载于:https://www.cnblogs.com/MingSD/p/9475455.html

相关文章:

  • 【c学习-3】
  • BZOJ 4589 Hard Nim
  • MongoDB学习笔记Day3
  • teamview被限制使用的解决办法
  • 随机数据构造-Faker
  • mybaits出现错误
  • 如何恢复u盘误删文件,看完就不会觉得自己很菜了
  • ubuntu 查看apt-get有哪些软件
  • 用Visual Studio开发以太坊智能合约
  • 搭载AI引擎,腾讯云云镜开启全面防护模式
  • 学习日记0821组合 多态 封装
  • 基于名字自动发布之数据库(4)
  • 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
  • 关于Nginx负载均衡的6种策略
  • 阿里云和腾讯云搭建hadoop
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Koa2 之文件上传下载
  • LeetCode18.四数之和 JavaScript
  • Linux快速复制或删除大量小文件
  • markdown编辑器简评
  • vue:响应原理
  • Web设计流程优化:网页效果图设计新思路
  • 算法---两个栈实现一个队列
  • 用jquery写贪吃蛇
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 正则表达式-基础知识Review
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一一四)第九章编程练习
  • (正则)提取页面里的img标签
  • (转)jdk与jre的区别
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core引入性能分析引导优化
  • .NET Core中的去虚
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net多线程总结
  • .NET基础篇——反射的奥妙
  • /proc/stat文件详解(翻译)
  • [Angularjs]ng-select和ng-options
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [git] windows系统安装git教程和配置
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析
  • [ICCV2017]Neural Person Search Machines
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [javaee基础] 常见的javaweb笔试选择题含答案