【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,,
但是当时没写(懒)
现在来填坑
= =日常调半天lca(考虑以后背板)
主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分没出问题)
#include <cstdio>
#include <algorithm>
using namespace std;
struct lis{ int x,id;} li[];
struct nod{ int num,ls,rs;} t[];
int n,m,x,y,z,sum=,N=,lastans=;
int to[],nex[],list[];
int a[],h[],fir[],root[],f[],pos[];
int log[],near[],rmq[][];
bool operator<(lis a,lis b){ return a.x<b.x;}
void add(int x,int y,int z){ to[z]=y;nex[z]=fir[x];fir[x]=z;}
inline int lca(int x,int y){ if(x>y) swap(x,y);
return (h[rmq[log[y-x+]][x]]<h[rmq[log[y-x+]][y-near[y-x+]+]])?
rmq[log[y-x+]][x]:rmq[log[y-x+]][y-near[y-x+]+];}
void build(int now,int fa)
{
f[now]=fa;root[now]=++sum;
int com=root[fa],cha=root[now],l=,r=n;
while(l<r)
if(a[now]>(l+r)/)
l=(l+r)/+,t[cha]=(nod){t[com].num+,t[com].ls,++sum},cha=sum,com=t[com].rs;
else
r=(l+r)/,t[cha]=(nod){t[com].num+,++sum,t[com].rs},cha=sum,com=t[com].ls;
list[++N]=now;pos[now]=N;t[cha]=(nod){t[com].num+,,};h[now]=h[fa]+;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fa)
build(to[i],now),list[++N]=now;
}
void que(int x,int y,int z)
{
int l=,r=n,lc=lca(pos[x],pos[y]),lcc=f[lc];
x=root[x],y=root[y],lc=root[lc],lcc=root[lcc];
while(l<r)
if(t[t[x].ls].num+t[t[y].ls].num-t[t[lc].ls].num-t[t[lcc].ls].num<z)
l=(l+r)/+,z-=t[t[x].ls].num+t[t[y].ls].num-t[t[lc].ls].num-t[t[lcc].ls].num,
x=t[x].rs,y=t[y].rs,lc=t[lc].rs,lcc=t[lcc].rs;
else
r=(l+r)/,x=t[x].ls,y=t[y].ls,lc=t[lc].ls,lcc=t[lcc].ls;
lastans=li[l].x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&li[i].x),li[i].id=i;
sort(li+,li+n+);
for(int i=;i<=n;i++)
a[li[i].id]=i;
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add(x,y,i),add(y,x,i+n);
build(,);
for(int i=;i<=N;i++)
rmq[][i]=list[i];
for(int i=,j=,k=;i<=N;log[i]=j,near[i]=k,i++)
if(i>k*) j++,k*=;
for(int i=,k=;k<=N;i++,k*=)
for(int j=;j<=N-k+;j++)
rmq[i][j]=(h[rmq[i-][j]]<h[rmq[i-][j+k/]])?rmq[i-][j]:rmq[i-][j+k/];
for(int i=;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),que(/*lastans^*/x,y,z),printf(i<m?"%d\n":"%d",lastans);
return ;
} //lastans^加上以后就是强在,bzoj上的题;不加就是不强在,spoj上的题
顺便吐槽:spoj上内存限制1.5G实在太6,,,
导致我乱开数组,交bzoj的时候MLE了很多发
【填坑向】spoj COT/bzoj2588 Count on a tree的更多相关文章
- 洛谷P2633/bzoj2588 Count on a tree (主席树)
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...
- 【BZOJ】【2588】COT(Count On a Tree)
可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 19 ...
- BZOJ2588 Count on a tree 【树上主席树】
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7577 Solved: 185 ...
- 主席树+dfs SPOJ BZOJ2588 Count on a tree
这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...
- 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)
http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- bzoj2588 Count on a tree
题意:给定一棵树,有点权,不带修改,询问路径点权第K大,强制在线. 这道题建主席树的方法好机智.按照BFS/DFS序建树,对于每个点,建出"这个点到根节点的路径上的点"组成的权值线 ...
- bzoj2589【 Spoj 10707】 Count on a tree II
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初始为0,即第一 ...
- BZOJ2588:Count on a tree(主席树)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
随机推荐
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- visio二次开发——图纸解析之线段
多写博客,其实还是蛮好的习惯的,当初大学的时候导师就叫我写,但是就是懒,大学的时候,谁不是魔兽或者LOL呢,是吧,哈哈哈. 好了,接着上一篇visio二次开发——图纸解析,我继续写. 摘要: (转发请 ...
- jsp动作元素之forward指令
forward指令用于将页面响应转发到另外的页面.既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet. forward指令格式如下: <jsp:for ...
- Chrome 及其 插件“个性化设置”备份
Chrome版本发布时间表 2016.10.13 v54.0.2840.59 主题颜色由 蓝色 变为 灰色 2016.11.17 重新使用 Chrome 浏览器(v54.0.2840.99),并设置 ...
- PHP如何将session保存到memcached中?如何分布式保存PHP session
session_set_save_handler无关的memcached保存session的方法 在memcached服务器上 1)下载memcached #wget http://memcached ...
- 多种JSON格式及遍历方式
/*数组*/ var arr = [["name", "value"], ["name1", "value1"]]; v ...
- BitMap算法应用:Redis队列滤重优化
工作中有用到Redis滤重队列. 原来的方法如下: 方法一 为了保证操作原子性,使用Redis执行Lua脚本. 在脚本中的逻辑是,如果队列不超过某个数值,进行一次lrem操作(队列使用list结构), ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- 2.mongoDB add user in v3.0 问题的解决(Property 'addUser' of object admin is not a func)
问题:创建mongodb帐户时,出错 > db.addUser('jyu', 'aerohive') 2015-08-05T20:03:02.767+0800 E QUERY TypeE ...
- mysql存储过程学习
一.存储过程的创建 语法: CREATE PROCEDURE sp_name (参数)合法的SQL语句 mysql> delimiter // mysql> CREATE PROCEDUR ...