BZOJ 1180 / 2843 LCT模板题_双倍经验
一大早上到机房想先拍一下模板,热热身.
结果....对照着染色敲的 LCT 竟然死活也调不过去(你说我抄都能抄错)
干脆自己重新敲了一遍,10min就敲完了.......
还是要相信自己
Code:
- #include <bits/stdc++.h>
- #define setIO(s) freopen(s".in","r",stdin)
- using namespace std;
- #define maxn 40000
- struct LCT
- {
- #define lson ch[x][0]
- #define rson ch[x][1]
- int tag[maxn],val[maxn],sumv[maxn],ch[maxn][2],f[maxn],sta[maxn];
- int isRoot(int x)
- {
- return !(ch[f[x]][1] == x || ch[f[x]][0] == x);
- }
- int get(int x)
- {
- return ch[f[x]][1] == x;
- }
- void mark(int x)
- {
- if(!x) return ;
- swap(lson, rson), tag[x] ^= 1;
- }
- void pushdown(int x)
- {
- if(!x) return ;
- if(tag[x])
- {
- mark(lson), mark(rson), tag[x] ^=1 ;
- }
- }
- void pushup(int x)
- {
- sumv[x] = sumv[lson] + sumv[rson] + val[x];
- }
- void rotate(int x)
- {
- int old = f[x], fold = f[old], which = get(x);
- if(!isRoot(old)) ch[fold][ch[fold][1] == old] = x;
- ch[old][which] = ch[x][which ^ 1], f[ch[old][which]] = old;
- ch[x][which ^ 1 ] = old, f[old] = x, f[x] = fold;
- pushup(old),pushup(x);
- }
- void splay(int x)
- {
- int u = x, v = 0;
- sta[++v] = u;
- while(!isRoot(u)) sta[++v] = f[u], u = f[u];
- while(v) pushdown(sta[v--]);
- u = f[u];
- for(int fa; (fa = f[x]) != u; rotate(x))
- if(f[fa] != u) rotate(get(fa) == get(x) ? fa: x);
- }
- void Access(int x)
- {
- for(int y = 0; x ; y = x,x = f[x])
- {
- splay(x), rson = y, pushup(x);
- }
- }
- void makeRoot(int x)
- {
- Access(x), splay(x), mark(x);
- }
- void link(int a,int b)
- {
- makeRoot(a), f[a] = b;
- }
- void split(int a,int b)
- {
- makeRoot(a), Access(b), splay(b);
- }
- }T;
- struct Union_Find
- {
- int p[maxn];
- void init()
- {
- for(int i = 0;i < maxn ;++i) p[i] = i;
- }
- int find(int x)
- {
- return p[x] == x ? x : p[x] = find(p[x]);
- }
- int merge(int a,int b)
- {
- int x = find(a), y = find(b);
- if(x == y) return 0;
- p[x] = y;
- return 1;
- }
- }U;
- char str[20];
- int main()
- {
- // setIO("input");
- U.init();
- int n;
- scanf("%d",&n);
- for(int i = 1;i <= n; ++i) scanf("%d",&T.val[i]), T.sumv[i] = T.val[i];
- int q,a,b,c;
- scanf("%d",&q);
- while(q --)
- {
- scanf("%s",str);
- if(str[0] == 'b')
- {
- scanf("%d%d",&a,&b);
- if(!U.merge(a,b))
- printf("no\n");
- else
- {
- T.link(a, b);
- printf("yes\n");
- }
- }
- if(str[0] == 'p' )
- {
- scanf("%d%d",&a,&b);
- T.makeRoot(a),T.val[a] = b, T.pushup(a);
- }
- if(str[0] == 'e')
- {
- scanf("%d%d",&a,&b);
- if(U.find(a) == U.find(b))
- {
- T.split(a,b);
- printf("%d\n",T.sumv[b]);
- }else printf("impossible\n");
- }
- }
- return 0;
- }
BZOJ 1180 / 2843 LCT模板题_双倍经验的更多相关文章
- 高手过愚人节 Manancher模板题_双倍经验
Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...
- bzoj2049-洞穴勘测(动态树lct模板题)
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- BZOJ 2724 蒲公英 | 分块模板题
题意 给出一个序列,在线询问区间众数.如果众数有多个,输出最小的那个. 题解 这是一道分块模板题. 一个询问的区间的众数,可能是中间"整块"区间的众数,也可能是左右两侧零散的数中的 ...
- 【BZOJ2049,2631,3282,1180】LCT模板四连A
好吧我并不想讲LCT 只是贴4个代码~ [BZOJ2049][Sdoi2008]Cave 洞穴勘测 #include <cstdio> #include <cstring> # ...
- BZOJ 2982: combination Lucas模板题
Code: #include<bits/stdc++.h> #define ll long long #define maxn 1000003 using namespace std; c ...
- BZOJ 1180: [CROATIAN2009]OTOCI
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 989 Solved: 611[Submit][S ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)
emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...
- 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题
2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...
随机推荐
- asp.net--WebService知识点
开头是这样的 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = Wsi ...
- ubuntu中安装hadoop集群
hadoop是由java 语言编写的主从结构分布式计算存储架构 准备工作: 操作系统: Ubuntu16.04 软件安装包:jdk-8u171-linux-x64.tar.gz : hadoop-2. ...
- [Cypress] Stub Network Requests in a Cypress Test
To keep our tests fast and easily repeatable, it makes sense to create many integration tests and fe ...
- POJ 3280 Cheapest Palindrome DP题解
看到Palindrome的题目.首先想到的应该是中心问题,然后从中心出发,思考怎样解决. DP问题通常是从更加小的问题转化到更加大的问题.然后是从地往上 bottom up地计算答案的. 能得出状态转 ...
- D3D triangle list(三角形列) 小样例
画三角形列的样例程序 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.li ...
- leetcode_num179_Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- UVA - 10061 How many zero's and how many digits ?
n!=x*b^y, 当x为正整数时,最大的y就是n!末尾0的个数了, 把n,b分别拆成素因子相乘的形式: 比如, n=5,b=16 n=5,b=2^4, 非常明显,末尾0的个数为0 10进制时,n!= ...
- Java基础:异常捕获顺序
转载请注明出处:jiq•钦's technical Blog public voidtestException(){ int a[] = {1,2,3};int q = 0; try{ for(int ...
- SAP WEBSERVICE Soap中RPC-style和Document-style
RPC是以方法调用的方式描写叙述WebSerivce的,也就是说,你要说清楚调用的那个方法,以及各个參数的名称和值.要描写叙述这些东东.SOAP消息就要有一个统一的规范,指出那一部分是方法名.哪个部分 ...
- DDos攻击篇
DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 1.1. SY ...