2017.3.31 洞穴勘测 思考记录
lct
这题给我的感觉就是:指针真nm难调
第一次写真蛋疼
码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 500000
using namespace std;int n,m,x,y;char ss[99];
struct tree
{tree *ch[2],*fu;int rev;bool isrt();void down();int getwh(){return fu->ch[0]==this?0:1;}void set(int wh,tree *child);}lct[maxn];
void tree::down()
{if (rev){rev=0;swap(ch[0],ch[1]);ch[0]->rev^=1;ch[1]->rev^=1;}
}void tree::set(int wh,tree *child){ch[wh]=child;if(child!=lct)child->fu=this; down();}bool tree::isrt() //这段坑死了
{ if (fu==lct) {return 1;}return (fu->ch[0]!=this&&fu->ch[1]!=this);
}void rotate(tree *now)
{tree *fu=now->fu,*ye=now->fu->fu;if (!(fu->isrt())) ye->down();//旋转的标记要提前下放 fu->down();now->down();//有序下放 int wh=now->getwh();fu->set(wh,now->ch[wh^1]);now->set(wh^1,fu);now->fu=ye;if(!ye->isrt())ye->ch[ye->ch[0]==fu?0:1]=now;
}
void splay(tree *now)
{
if(now->isrt()) return; for (;!(now->isrt());rotate(now))if(!(now->fu->isrt()))now->getwh()==now->fu->getwh()?rotate(now->fu):rotate(now);
}
tree *access(tree *now)
{tree *y=lct;for(;now!=lct;y=now,now=now->fu)splay(now),now->down(),now->set(1,y);//建一路路径右儿子为重 return y;
}
void huan(tree *a)
{access(a)->rev^=1;//根打标记 splay(a);//在子splay里面氚标记,做根
}void link(tree *a,tree *b)
{huan(a);//a换到根 a->fu=b;//把b放上去,相当于新建一棵splay access(a);//a重新为根
}
void cut(tree *a,tree *b)
{ huan(a); //换为根 access(b); //b放到a右边,a在第二层 splay(a); a->ch[1]=b->fu=lct;
}
tree *zhao(tree *a)
{access(a);splay(a);tree *y=a;while(y->ch[0]!=lct)y=y->ch[0];return y;
}
int main()
{
int i;scanf("%d%d",&n,&m);lct->ch[0]=lct;lct->ch[1]=lct;lct->fu=lct;lct->rev=0;for (i=1;i<=n;i++){(lct+i)->fu=(lct+i)->ch[0]=(lct+i)->ch[1]=lct;(lct+i)->rev=0;}for (i=1;i<=m;i++){scanf("%s",ss);scanf("%d%d",&x,&y);if(ss[0]=='C')link(lct+x,lct+y);if(ss[0]=='D'){cut(lct+x,lct+y);//cout<<(lct+x)->ch[0]; }if(ss[0]=='Q'){if(zhao(lct+x)==zhao(lct+y))printf("Yes\n");else printf("No\n");}}
}
2017.3.31 洞穴勘测 思考记录相关推荐
- 2017.3.24 分裂游戏 思考记录
事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了.. 感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.9.28 约数研究 思考记录
这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...
- 2017.5.11 道路修建 思考记录
这个线段树一眼秒了(主要是有前面的思考经验) 就是维护两个列对应线段上的形态.,比较好想的 但数据结构题有个特点--使你知道结构也不会做----会做也会很大概率爆零.... 所以数据结构题必须 小数据 ...
- 2017.5.9 积木大赛 思考记录
为什么要把这个题放上来?因为这个题还是很有代表性的 首先必须要跳出模拟的思考: 可以忽视每一步具体的操作,直接看目标,这样就会总结出一些规律: 连续上升或连续下降的序列次数一定是最大值,因为每次都可以 ...
- 2017.4.25 解方程 思考记录
这个题好乱啊..n*m就会炸,每个数还都可能是10^10000..这n*ai tm读进去都要10^6效率 . 一般这种似乎没有任何数论定理的东西范围还这么变态只能考虑随机化算法了.. 似乎可以用取模 ...
- 2017.3.29 报表统计 思考记录
有生之年第一道浙江省选题(虽然历史久远并且很水) 记录每个位置数列的左端点和右端点 维护两颗splay 一颗维护全局最小差值,一颗维护相邻最小差值 对于全局splay:每次插入时记录路径取差值mi ...
- 2017.3.6 地精部落 思考记录
其实这个题第一眼是没有任何思路的 强行无视题解,经过漫长的找规律,终于推出了一个可行的方法: f[i][0/1]i表示最高位的数字,0表示开始是上升,1表示开始是下降. 为什么会推出这个? 1.因为所 ...
最新文章
- 【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
- 广播等风暴的解决办法
- html方框中能放置图片么,html中的img标签你不知道的那些细节!
- CODEVS 1408 最长公共子序列
- Unable to execute dex: Multiple dex files define的解决办法
- 团队开发冲刺第二阶段8
- MATLAB 句柄函数记录——多变量
- UI设计干货素材|网页设计巧妙使用背景纹理
- Windows 下修改 MySQL 编码为 utf8
- 用python语言实现反恐精英基础版-案例
- 网站 测试服务器配置,安装调试、软件测试、网站测试 配置维护环境配置、安全维护、安全运维等与服务器相关业务...
- 找出随Windows自启动程序的『十大藏身之处』
- 42. netcat
- bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: 的解决方法
- adb手机无法识别 vivo_vivo安卓adb工具
- HL7 v2.5 入门
- wishbone bus
- 以太网 VLAN数据帧格式、交换机接口类型介绍、u和t的区别和作用
- STK10与MATLAB2014a的连接经验
- 3D立体游戏的起源和目前的发展
热门文章
- Android笔记 theme主题
- Android笔记 检测网络状态
- ParaView绘制gprMax正演模拟的波场快照方法(1)
- 最小生成树 Kruskal算法 Prim算法
- 写给小白的WordPress详细安装步骤
- c#写图像tif gdal_Gdal系列 (二)读取图像基本操作b + 简单波段合成
- php mysql 地图 矩形_PHP+Mysql+jQuery中国地图区域数据统计实例讲解
- mysql yum安装与配置文件_MySQL 8.0 yum安装和配置
- 【Django】毕设学习笔记(六)
- 18_python基础—面向对象-多态