BZOJ 3551 Peaks加强版
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3551
题意:给出一个图,n个点,m条边。边有权值点也有权值。若干询问,(v,x,k),问从v点开始经过边权不大于x的所有边到达的所有点中权值第K大的权值。强制在线。
思路:首先不在最小生成树上的边没用。将边权按照升序排序,并查集每次合并两个集合(x,y)时,新增一个点u,u的权值为这条边的权值,连有向边<u,x><u,y>。那么最后的这棵树是一个二叉树,从下到上权值增大。那么每次倍增求出最上的点r,那么以r为根的子树包含的所有点就是通过不大于x的所有边到达的点。因此dfs序+主席树(按照键值大小),那么每次查询r管辖的区间即可。
const int N=200005;
int n,h[N],b[N];
pair<int,pair<int,int> > E[N*3];
int m,Q;
int S[N];
int M;
int get(int x)
{
if(S[x]!=x) S[x]=get(S[x]);
return S[x];
}
vector<int> g[N];
int mp[N<<1],id;
int visit[N];
int st[N],ed[N];
int f[N][20],Max[N][20];
int eLen[N];
void DFS(int u)
{
visit[u]=1;
mp[++id]=u;
int i;
for(i=0;i<SZ(g[u]);i++)
{
int v=g[u][i];
f[v][0]=u;
Max[v][0]=eLen[u];
DFS(v);
}
if(u>n) mp[++id]=u;
}
struct node
{
int lson,rson,sum;
};
node a[N*25];
int e;
int root[N<<1];
int build(int L,int R)
{
int t=++e;
a[t].lson=a[t].rson=-1;
a[t].sum=0;
if(L==R) return t;
int M=(L+R)>>1;
a[t].lson=build(L,M);
a[t].rson=build(M+1,R);
return t;
}
void insert(int &t1,int t,int L,int R,int h)
{
t1=++e;
a[t1]=a[t];
a[t1].sum++;
if(L==R) return;
int M=(L+R)>>1;
if(h<=M) insert(a[t1].lson,a[t].lson,L,M,h);
else insert(a[t1].rson,a[t].rson,M+1,R,h);
}
int get(int u,int x)
{
int i;
for(i=19;i>=0;i--) if(f[u][i]&&Max[u][i]<=x)
{
u=f[u][i];
}
return u;
}
int query(int rt1,int rt2,int L,int R,int k)
{
if(L==R) return L;
int tmp=a[a[rt2].lson].sum-a[a[rt1].lson].sum;
int M=(L+R)>>1;
if(tmp>=k) return query(a[rt1].lson,a[rt2].lson,L,M,k);
else return query(a[rt1].rson,a[rt2].rson,M+1,R,k-tmp);
}
int main()
{
n=getInt();
m=getInt();
Q=getInt();
int i;
for(i=1;i<=n;i++) h[i]=b[i]=getInt();
sort(b+1,b+n+1);
M=unique(b+1,b+n+1)-(b+1);
for(i=1;i<=n;i++) h[i]=lower_bound(b+1,b+M+1,h[i])-b;
for(i=1;i<=n+n;i++) S[i]=i;
for(i=1;i<=m;i++)
{
int u=getInt();
int v=getInt();
int w=getInt();
E[i]=MP(w,MP(u,v));
}
sort(E+1,E+m+1);
int cur=n;
for(i=1;i<=m;i++)
{
int u=E[i].second.first;
int v=E[i].second.second;
int w=E[i].first;
if(get(u)==get(v)) continue;
u=get(u);
v=get(v);
cur++;
S[get(u)]=S[get(v)]=cur;
g[cur].pb(u);
g[cur].pb(v);
eLen[cur]=w;
}
for(i=1;i<=n;i++) if(!visit[i]) DFS(get(i));
int j;
for(i=1;(1<<i)<=cur;i++) for(j=1;j<=cur;j++)
{
f[j][i]=f[f[j][i-1]][i-1];
Max[j][i]=max(Max[j][i-1],Max[f[j][i-1]][i-1]);
}
clr(root,-1);
root[0]=build(1,M);
for(i=1;i<=id;i++)
{
int u=mp[i];
if(u<=n) insert(root[i],root[i-1],1,M,h[u]);
else
{
root[i]=root[i-1];
if(st[u]==0) st[u]=i;
else ed[u]=i;
}
}
int ans=0;
while(Q--)
{
int v=getInt();
int x=getInt();
int k=getInt();
if(-1!=ans) v^=ans,x^=ans,k^=ans;
int t=get(v,x);
int L=st[t],R=ed[t];
int cnt=a[root[R]].sum-a[root[L]].sum;
if(cnt<k) ans=-1;
else ans=b[query(root[L],root[R],1,M,cnt+1-k)];
printf("%d\n",ans);
}
}
BZOJ 3551 Peaks加强版的更多相关文章
- Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551
Peaks [问题描述] 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问 ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- 3551: [ONTAK2010]Peaks加强版
3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 + 倍增 ...
- 【BZOJ3551】 [ONTAK2010]Peaks加强版
BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...
- 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)
[BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
随机推荐
- oracle随机取数据
select * from (select rownum,KEYWORD, CATEGORY,CREATE_DATE,UPDATE_DATE from (select * from knet_keyw ...
- 夺命雷公狗---DEDECMS----25dedecms导航条首页的跳转
我们的导航条首页一直没写跳转,现在我们看看dede自带模版的首页是怎么写的: 他也是封装了一个{dede:global.cfg_cmsurl/}/内置标签来实现的,那么我们来改下我们的head.htm ...
- z/os上的tar和gzip
在*nix平台上玩过的人都知道,tar和gzip基本上是每天都要使用的,而且非常之好用.而Mainframer则比较痛苦,没有这么好用的东西,尤其是当需要通过网络传大批量的文件的时候很不方便. 不过总 ...
- 出现“不能执行已释放的Script代码”错误的原因及解决办法
很多web开发者或许都遇到过这样的问题,程序莫名奇怪出现“不能执行已释放Script的代码”,错误行1,列1.对于这种消息描述不着边,行列描述更是让人迷茫的js错误,相信是所有调试js程序的朋友们最郁 ...
- Ceph的状态错误
使用命令检查ceph集群的监控状态,得到 [root@node1 ~]# ceph -s cluster c4898b1c-7ac1-406d-bb5d-d3c7980de438 health HEA ...
- lamp环境编译(apache2.4.7 php5.4.25 mysql 5.5.23)
环境要求 gcc.gcc-c++.cmake.bison(可能)支持 1.yum install gcc gcc-c++ cmake bison 2.修改yum配置,达到搜索本地设置 移走或改名/et ...
- 【python】__future__模块
转自:http://www.jb51.net/article/65030.htm Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运 ...
- Creater中选择一行的方法
1. 在表布局中增加一单选钮列,给单选钮的属性name任意设定一个值.2. 选择单选钮对应列,将其selectID设为单选钮的ID;将onclick设为setTimeout('initAllRow ...
- https笔记
TCP提供了可靠的,面向连接的字节流服务. 1)应用数据分割成TCP认为适合发送的数据块,通过MSS(最大数据包长度)来控制. 2)重传机制 3)对首部和数据进行校验 4)TCP对收到的数据进行排序, ...
- webservice cxf error:org.apache.cxf.interceptor.Fault: Unmarshalling Error: 意外的元素 (uri:"", local:"ca
服务器端webservice接口 需要定义@WebParam,如: public ReturnDTO cardBatchSyn(@WebParam(name = "cardBatchSynM ...