COJ983 WZJ的数据结构(负十七)
显然是动态树裸题:O(mlogn)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
inline int read()
{
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
int sumv[maxn],val[maxn],pre[maxn],fa[maxn],ch[maxn][],flip[maxn];
void maintain(int x) {sumv[x]=sumv[ch[x][]]+sumv[ch[x][]]+val[x];}
void pushdown(int x)
{
if(!flip[x]) return;
flip[ch[x][]]^=;flip[ch[x][]]^=;
swap(ch[x][],ch[x][]);flip[x]=;
}
void rotate(int x,int d)
{
pushdown(x);int y=pre[x],z=pre[y];
pre[ch[x][d]]=y;ch[y][d^]=ch[x][d];
pre[x]=z;ch[z][ch[z][]==y]=x;
pre[y]=x;ch[x][d]=y;maintain(y);
}
void splay(int x)
{
int rt=x;while(pre[rt]) rt=pre[rt];
if(rt!=x)
{
fa[x]=fa[rt];fa[rt]=;
while(pre[x]) pushdown(pre[x]),rotate(x,ch[pre[x]][]==x);
maintain(x);
}
else pushdown(x);
}
void access(int x)
{
for(int y=;x;x=fa[x])
{
splay(x);pre[ch[x][]]=;fa[ch[x][]]=x;
ch[x][]=y;pre[y]=x;fa[y]=;
maintain(x);y=x;
}
}
int findrt(int x)
{
access(x);splay(x);
while(ch[x][]) x=ch[x][];return x;
}
void makeroot(int x) {access(x);splay(x);flip[x]^=;}
void link(int x,int y) {makeroot(x);fa[x]=y;}
void query(int x,int y) {makeroot(x);access(y);splay(y);printf("%d\n",sumv[y]);}
int main()
{
int n=read();
for(int i=;i<=n;i++) val[i]=read();
int m=read();
while(m--)
{
char cmd=getchar();while(!isalpha(cmd)) cmd=getchar();
int x=read(),y=read();
if(cmd=='e')
{
if(findrt(x)==findrt(y)) query(x,y);
else puts("impossible");
}
else
{
if(findrt(x)==findrt(y)) puts("no");
else link(x,y),puts("yes");
}
}
return ;
}
可以写个启发式合并O(mlog^2n)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
inline int read()
{
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
int first[maxn],next[maxn*],to[maxn*],e;
void AddEdge(int u,int v)
{
to[++e]=v;next[e]=first[u];first[u]=e;
to[++e]=u;next[e]=first[v];first[v]=e;
}
int val[maxn],pa[maxn],s[maxn];
inline int findset(int x) {return pa[x]==x?x:pa[x]=findset(pa[x]);}
int fa[maxn][],sum[maxn],dep[maxn];
void dfs(int x)
{
sum[x]=sum[fa[x][]]+val[x];dep[x]=dep[fa[x][]]+;
for(int i=;i<;i++) fa[x][i]=fa[fa[x][i-]][i-];
for(int i=first[x];i;i=next[i]) if(to[i]!=fa[x][]) fa[to[i]][]=x,dfs(to[i]);
}
void query(int x,int y)
{
int ret=sum[x]+sum[y],lca;
if(dep[x]<dep[y]) swap(x,y);
for(int i=;i>=;i--) if((<<i)<=dep[x]-dep[y]) x=fa[x][i];
for(int i=;i>=;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
lca=(x==y)?x:fa[x][];
printf("%d\n",ret-sum[lca]-sum[fa[lca][]]);
}
int main()
{
int n=read();
for(int i=;i<=n;i++) sum[i]=val[i]=read(),pa[i]=i,s[i]=;
int m=read();
while(m--)
{
char cmd=getchar();while(!isalpha(cmd)) cmd=getchar();
int x=read(),y=read();
if(cmd=='e')
{
int p1=findset(x),p2=findset(y);
if(x==y) printf("%d\n",val[x]);
else if(p1==p2) query(x,y);
else puts("impossible");
}
else if(cmd=='b')
{
int p1=findset(x),p2=findset(y);
if(p1==p2) {puts("no");continue;}puts("yes");
if(s[p1]>s[p2]) swap(p1,p2),swap(x,y);
pa[p1]=p2;s[p2]+=s[p1];fa[x][]=y;AddEdge(x,y);
dfs(x);
}
}
return ;
}
COJ983 WZJ的数据结构(负十七)的更多相关文章
- [COJ0985]WZJ的数据结构(负十五)
[COJ0985]WZJ的数据结构(负十五) 试题描述 CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R- ...
- [COJ0988]WZJ的数据结构(负十二)
[COJ0988]WZJ的数据结构(负十二) 试题描述 输入 见题目,注意本题不能用文件输入输出 输出 见题目,注意本题不能用文件输入输出 输入示例 输出示例 数据规模及约定 1≤N≤1500,M≤N ...
- [COJ0989]WZJ的数据结构(负十一)
[COJ0989]WZJ的数据结构(负十一) 试题描述 给出以下定义: 1.若子序列[L,R]的极差(最大值-最小值)<=M,则子序列[L,R]为一个均匀序列. 2.均匀序列[L,R]的权值为S ...
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- COJ967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:C: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
- COJ970 WZJ的数据结构(负三十)
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
- COJ968 WZJ的数据结构(负三十二)
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...
- COJ969 WZJ的数据结构(负三十一)
WZJ的数据结构(负三十一) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 A国有两个主基站,供给全国的资源.定义一个主基站 ...
- COJ986 WZJ的数据结构(负十四)
WZJ的数据结构(负十四) 难度级别:D: 运行时间限制:6000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小 ...
随机推荐
- C#模拟POST登录cnblogs并发布文章
用到的工具FireFox的Firebugs插件 打开网络功能进行抓包 数据如下 可以得知POST的数据为: __EVENTTARGET=&__EVENTARGUMENT=&__VIEW ...
- linux下复制一个文件的内容到另一个文件
cat path/to/file/filename1 >> path/to/file/filename2 例如: cat id_rsa.pub >> ~/.ssh/author ...
- 【Spring】Spring系列2之bean的配置
2.bean的配置 2.1.IOC概述 2.2.bean的获取 2.3.依赖注入方式 2.4.属性注入细节 内部bean,不需要ID,ID无效,外部不能引用: 2.5.集合属性注入 2.6.使用p命名 ...
- codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...
- 项目总结(五)--- 界面调试工具Reveal
在开发中,我们也许会碰到以下需求:对于一些动态复杂的交互界面,手码去制定界面是常有的事情,然而我们在开发中想修改过一些参数后想看下实时效果,只能重新运行项目,进入到对应的页面来进行修改,是不是有点麻烦 ...
- Tomcat 解决The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
解法: 修改tomcat下的web.xml, 搜索:JspServlet, 增加: <init-param> <param-name>mappedfile</pa ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 滚屏加载--jQuery+PHP实现浏览更多内容
滚屏加载技术,就是使用Javascript监视滚动条的位置,每次当滚动条到达浏览器窗口底部时,触发一个Ajax请求后台PHP程序,返回相应的数据,并将返回的数据追加到页面底部,从而实现了动态加载,其实 ...
- sql server存儲過程語法
-- 变量的声明,sql里面声明变量时必须在变量前加@符号 DECLARE @I INT -- 变量的赋值,变量赋值时变量前必须加set SET @I = 30 -- 声明多个变量 ...