BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树

 

2588: Spoj 10628. Count on a tree

Time Limit: 1 Sec  

Memory Limit: 256 MB

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=2588

Description

给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。

Input

第一行两个整数N,M。
第二行有N个整数,其中第i个整数表示点i的权值。
后面N-1行每行两个整数(x,y),表示点x到点y有一条边。
最后M行每行两个整数(u,v,k),表示一组询问。
 

Output

M行,表示每个询问的答案。

Sample Input

8 5
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5 1
0 5 2
10 5 3
11 5 4
110 8 2

Sample Output

2
8
9
105
7

HINT

HINT:

N,M<=100000

暴力自重。。。

题意

 

题解:

树上跑主席树

这类题都是这样搞……

代码来自hzwer:

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 2000005
#define eps 1e-9
int Num;
//const int inf=0x7fffffff;   //§&szlig;§é§à§é¨f§3
const int inf=0x3f3f3f3f;
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
//**************************************************************************************
#define N 100005
#define M 2000005
int n,m,tot,sz,cnt,ind,last;
int num[N],pos[N];
int v[N],tmp[N],hash[N],root[N];
int ls[M],rs[M],sum[M];
int deep[N],fa[N][17];
struct data{int to,next;}e[200005];int head[N];
void ins(int u,int v)
{e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;}
void insert(int u,int v)
{ins(u,v);ins(v,u);}
int find(int x)//二分
{int l=1,r=tot;while(l<=r){int mid=(l+r)>>1;if(hash[mid]<x)l=mid+1;else if(hash[mid]==x)return mid;else r=mid-1;}
}
void dfs(int x)//lca预处理
{ind++;num[ind]=x;pos[x]=ind;for(int i=1;i<=16;i++)if((1<<i)<=deep[x])fa[x][i]=fa[fa[x][i-1]][i-1];else break;for(int i=head[x];i;i=e[i].next)if(fa[x][0]!=e[i].to){deep[e[i].to]=deep[x]+1;fa[e[i].to][0]=x;dfs(e[i].to);}
}
int lca(int x,int y)//lca
{if(deep[x]<deep[y])swap(x,y);int t=deep[x]-deep[y];for(int i=0;i<=16;i++)if((1<<i)&t)x=fa[x][i];for(int i=16;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];if(x==y)return x;return fa[x][0];
}
void update(int l,int r,int x,int &y,int num)//更新
{y=++sz;sum[y]=sum[x]+1;if(l==r)return;ls[y]=ls[x];rs[y]=rs[x];int mid=(l+r)>>1;if(num<=mid)update(l,mid,ls[x],ls[y],num);else update(mid+1,r,rs[x],rs[y],num);
}
int que(int x,int y,int rk)
{int a=x,b=y,c=lca(x,y),d=fa[c][0];a=root[pos[a]],b=root[pos[b]],c=root[pos[c]],d=root[pos[d]];int l=1,r=tot;while(l<r){int mid=(l+r)>>1;int tmp=sum[ls[a]]+sum[ls[b]]-sum[ls[c]]-sum[ls[d]];if(tmp>=rk)r=mid,a=ls[a],b=ls[b],c=ls[c],d=ls[d];else rk-=tmp,l=mid+1,a=rs[a],b=rs[b],c=rs[c],d=rs[d];}return hash[l];
}
int main()
{//freopen("test.txt","r",stdin);n=read(),m=read();for(int i=1;i<=n;i++)v[i]=read(),tmp[i]=v[i];sort(tmp+1,tmp+n+1);hash[++tot]=tmp[1];for(int i=2;i<=n;i++)if(tmp[i]!=tmp[i-1])hash[++tot]=tmp[i];for(int i=1;i<=n;i++)v[i]=find(v[i]);for(int i=1;i<n;i++){int u=read(),v=read();insert(u,v);}dfs(1);for(int i=1;i<=n;i++){int t=num[i];update(1,tot,root[pos[fa[t][0]]],root[i],v[t]);}for(int i=1;i<=m;i++){int x=read(),y=read(),rk=read();x^=last;last=que(x,y,rk);printf("%d",last);if(i!=m)printf("\n");}return 0;
}

 

转载于:https://www.cnblogs.com/qscqesze/p/4785256.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

session多服务器共享的方案梳理

因方便自己学习以此记录本文转自&#xff1a;http://www.cnblogs.com/wangtao_20/p/3395518.html#2846008session的存储了解以前是怎么做的&#xff0c;搞清楚了来龙去脉&#xff0c;才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚)&#xff1a;为…

4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2

1. 前言上一篇文章我们了解了bombardier&#xff0c;并知道了bombardier.yml与开源项目bombardier的关系&#xff0c;接下来的文章我们了解一下wrk、wrk2&#xff0c;并对比一下它们与bombardier的关系2. 认识wrkwrk是一种现代 HTTP 基准测试工具&#xff0c;能够在单个多核 CP…

王道408数据结构——第三章 栈和队列

一、栈 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或删除操作的线性表。 栈顶&#xff1a;线性表允许插入删除的那一端 栈底&#xff1a;固定的、不允许进行插入删除的另一端 栈的操作特性可以概括为后进先出&#xff08;LIFO&#xff09; n个不同的元素进栈&…

C和指针之const、#define、volatile

1、const 定义const 只读变量,具有不可变形 const int a = 100; 编译器通常不为普通Const只读变量分配存储空间, 而是将它们保存在符号表中, 这使得它成为一个编译期间的值,没有了存储与读内存操作,使用效率很高 #define M3 //宏常量const int N = 5; //此时并没有将…

dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分

1. dispatchTouchEvent 是处理触摸事件分发,执行super.dispatchTouchEvent(ev)&#xff0c;事件向下分发。 2. onInterceptTouchEvent是ViewGroup提供的方法&#xff0c;默认返回false&#xff0c;返回true表示拦截。 3. onTouchEvent是View中提供的方法&#xff0c;ViewGroup也…

Avalonia跨平台入门第二十篇之语音播放问题

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放;今晚加个班来解决…

递归算法浅谈

递归算法 程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。   一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题类似的规模较小的问题来求解&#xff0c;递归策略仅仅需少量…

C和指针之实现strlen函数

1、问题 求字符串长度,实现strlen函数。 2、代码实现 #include <stdio.h> #include <assert.h>int get_strlen(char *str) {assert(NULL != str);return *str == \0 ? 0 : (1 + get_strlen(++str)); }int main() {char *str = "chenyu";char…

王道408数据结构——第四章 串(KMP算法)

一、串的定义和实现 字符串简称串&#xff0c;是由零个或多个字符组成的有限序列&#xff0c;一般记为S′a1a2⋅⋅⋅an′Sa_1a_2a_nS′a1​a2​⋅⋅⋅an′​&#xff0c;n称为串的长度。 串中任意多个连续字符组成的子序列称为该串的子串&#xff0c;相应的该串称为主串。某个…

ThoughtWorks技术雷达专区

作为一家服务于全球不同类型的IT专业服务公司&#xff0c;ThoughtWorks从未停止过对卓越技术的追求&#xff0c;为此&#xff0c;ThoughtWorks的全球技术委员会(TAB)会定期讨论技术战略&#xff0c;并将其绘制成一份能够体现技术趋势的雷达图&#xff0c;它相当于当下技术领域的…

腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略

深圳今天开始&#xff0c;暂停了所有公共交通&#xff0c;小区开始封闭管理&#xff0c;大家都居家办公&#xff0c;腾讯官方今天给深圳地区用户免费发放7天腾讯视频VIP会员&#xff0c;居家期间&#xff0c;可以追剧了&#xff01;这是腾讯官方给深圳地区的抗疫福利&#xff0…

编译器与解释器

什么是编译器&#xff1f;什么事解释器&#xff1f; 编译器是女儿&#xff0c;解释器是儿子。为什么这么说呢&#xff1f; 引用文章 http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html 大概总结就是&#xff1a;妈给儿子和女儿打电话说&#xff1a;你们的老爸不…

SQL Server 权限的分类

SQL Server 的权限可以分三类 第一类 server 层面上的&#xff1a; select * from sys.fn_builtin_permissions(default) where class_desc like server; 第二类 database 层面&#xff1a; select * from sys.fn_builtin_permissions(default)    where class_desc like d…

C和指针之部分理解和编码总结

1、在C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向成一个指向其首元素首地址的指针 这也就是为什么数组int a[10],a不能a++操作,而把a传递给函数的时候,可以作为指针a++操作的原因。 2、内存为0的地址处,也就是NULL地址处,一般定义指针变量的同时…

王道408数据结构——第五章 树与二叉树

文章目录一、树的基本概念树的性质二、二叉树满二叉树完全二叉树二叉排序树平衡二叉树二叉树的性质完全二叉树的性质三、二叉树的储存结构顺序储存链式存储四、树的储存方式双亲表示法孩子表示法孩子兄弟表示法&#xff08;二叉树表示法&#xff09;五、二叉树的遍历先序遍历&a…

Redis集群监控RedisClusterManager

Redis集群监控RedisClusterManagerRedisClusterManager监控Redis集群1234环境要求&#xff1a;Java8jdk配置这里略过RedisClusterManager 下载地址&#xff1a;https://git.oschina.net/yanfanVIP/RedisClusterManager/releases1234567891011121314151617181920212223242526272…

Visual Studio怎么使用中文帮助文档

今天给大家带来vs中怎么使用帮助文档&#xff1f;事情起因是这样的&#xff0c;上周有个哥们问我问题&#xff0c;字符串怎么分割啊&#xff0c;我当时有点忙&#xff0c;我就说你去看看帮助文档。然后过了三十秒 我看见他打开了百度。。。。。。我郁闷了 &#xff0c;我说你直…

C和指针之函数之在数组中找特定元素并返回指向该位置的指针

1、问题 在数组中找特定元素并返回指向该位置的指针2、代码实现 #include <stdio.h> #include <stdlib.h>//数组中找特定元素并返回指向该位置的指针 int *find_int(int key, int array[], int array_len) {int i;for (i 0; i < array_len; i){if (array[i] k…

逻辑推理题

25匹马找前3名或者前5名&#xff0c;最少用几次&#xff1f; 火车站集合&#xff0c;最后一个人几点到&#xff1f;转载于:https://www.cnblogs.com/kira2will/p/4058223.html

sublime快捷键收藏

快速查找&#xff08;ctrl P&#xff09;输入函数名可以快速找到函数。输入#文本可以快速进行文件内文本匹配。3. 多行游标功能&#xff08;ctrl D&#xff0c;非常实用&#xff09;如何将文件中的某个单词更改为另一个&#xff1f;方法一&#xff1a;利用查找替换功能&#…