BZOJ3551 [ONTAK2010]Peaks加强版


Solution

Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解.

然后就可以了.

如果数组开的不好,容易在BZOJ编译超时(虽然不建议darkbzoj)

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
int two[20];
int n,m,Q,cnt,top,tot,nodes,lastans;
int H[100005],h[100005];
int f[200005],val[200005],st[200005],ed[200005];
int q[300005],rt[300005];
int ls[5000005],rs[5000005],sum[5000005];
int dep[200005],fa[200005][17],mx[200005][17];
bool vis[200005];
struct node{int u,v,w;}e[500005];
int to[200005],nxt[200005],front[200005];
bool operator<(node a,node b){
    return a.w<b.w;
}
inline void Add(int u,int v){
    to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt;
}
inline int find(int x){
    if(f[x]!=x)f[x]=find(f[x]);
    return f[x];
}
inline int Find(int x,int val){
    for(int i=17;~i;i--)
        if(dep[x]>=two[i] && mx[x][i]<=val)x=fa[x][i];
    return x;
}
inline void insert(int l,int r,int &x,int f,int val){
    x=++tot;
    sum[x]=sum[f]+1;
    if(l==r)return;
    ls[x]=ls[f];rs[x]=rs[f];
    int mid=(l+r)>>1;
    if(val<=mid)insert(l,mid,ls[x],ls[f],val);
    else insert(mid+1,r,rs[x],rs[f],val);
}
inline int query(int l,int r,int x,int y,int rank){
    if(l==r)return l;
    int mid=(l+r)>>1;
    if(sum[ls[y]]-sum[ls[x]]>=rank)return query(l,mid,ls[x],ls[y],rank);
    else return query(mid+1,r,rs[x],rs[y],rank-sum[ls[y]]+sum[ls[x]]);
}
inline void dfs(int u){
    vis[u]=1;q[++top]=u;
    for(int i=1;i<=16;i++)
        if(dep[u]>=two[i]){
            fa[u][i]=fa[fa[u][i-1]][i-1];
            mx[u][i]=max(mx[u][i-1],mx[fa[u][i-1]][i-1]);
        }
        else break;
    for(int i=front[u];i;i=nxt[i]){
        int v=to[i];
        dep[v]=dep[u]+1;
        mx[v][0]=val[u];
        fa[v][0]=u;
        dfs(v);
    }
    if(u>n)q[++top]=u;
}
inline void solve(){
    for(re int i=1;i<=Q;i++){
        re int v=gi(),x=gi(),k=gi();
        if(lastans!=-1)v^=lastans,x^=lastans,k^=lastans;
        re int t=Find(v,x);
        re int a=rt[st[t]],b=rt[ed[t]];
        if(sum[b]-sum[a]<k)lastans=-1;
        else lastans=H[query(1,n,a,b,sum[b]-sum[a]-k+1)];
        printf("%d\n",lastans);
    }
}
int main()
{
    two[0]=1;
    for(re int i=1;i<20;i++)two[i]=two[i-1]<<1;
    n=gi();m=gi();Q=gi();
    for(re int i=1;i<=n;i++)h[i]=gi(),H[i]=h[i];
    sort(H+1,H+n+1);
    for(re int i=1;i<=n;i++)h[i]=lower_bound(H+1,H+n+1,h[i])-H;
    for(re int i=1;i<=n+n;i++)f[i]=i;
    for(re int i=1;i<=m;i++)
        e[i].u=gi(),e[i].v=gi(),e[i].w=gi();
    sort(e+1,e+m+1);
    nodes=n;
    for(re int i=1;i<=m;i++){
        re int u=find(e[i].u),v=find(e[i].v);
        if(u!=v){
            nodes++;
            f[u]=f[v]=nodes;
            val[nodes]=e[i].w;
            Add(nodes,u);Add(nodes,v);
            if(nodes==2*n-1)break;
        }
    }
    for(re int i=1;i<=n;i++)
        if(!vis[i])dfs(find(i));
    for(re int i=1;i<=top;i++){
        re int t=q[i];
        if(t<=n)insert(1,n,rt[i],rt[i-1],h[t]);
        else{
            rt[i]=rt[i-1];
            if(!st[t])st[t]=i;
            else ed[t]=i;
        }
    }
    solve();
    return 0;
}

【BZOJ3551】 [ONTAK2010]Peaks加强版的更多相关文章

  1. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  2. BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

  3. bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版

    题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...

  4. BZOJ3551 : [ONTAK2010]Peaks加强版

    首先强制在线的话,肯定是不能再离线排序+平衡树启发式合并了. 这回要用的是线段树合并,每次把两棵线段树合并,总复杂度为$O(n\log n)$ 预处理: 把边按权值从小到大排序,依次加边, 对于边(x ...

  5. BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】

    重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...

  6. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  7. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

  8. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  9. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

随机推荐

  1. socket.io的connect连接时不断的进行自动连接,并产生错误net::ERR_EMPTY_RESPONSE

    socket = io.connect('http://192.168.1.200:9043?uuid=333'); 执行上面的语句时,产生下面的错误: 后来经过排查,是由于项目的jdk版本过低引起的 ...

  2. codeforces C. Functions again

    题意:给定了一个公式,让你找到一对(l,r),求解出公式给定的F值. 当时没有想到,我把(-1)^(i-l)看成(-1)^i,然后思路就完全错了.其实这道题是个简单的dp+最长连续子序列. O(n)求 ...

  3. centos 7 禁止root登录及更改ssh端口号

    vim /etc/ssh/sshd_config PermitRootLogin yes => PermitRootLogin no systemctl restart sshd.service ...

  4. 透过摩拜和ofo,看产品从0到1时如何取舍需求(转)

    大纲 背景介绍 从0至1,我们成功的关键是什么? 从0到1,我们为什么选择做?又为什么选择不做? 从0到1,我们面临什么选择?我们作出了什么选择? 从0到1,我们为什么作出了这种选择? 背景 在资本注 ...

  5. Codeforces Round #542(Div. 2) CDE 思维场

    C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...

  6. SVD(6.5.1定理证明观察3)

  7. linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]

    http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  8. mysql order by 中文 排序

    mysql order by 中文 排序 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都 ...

  9. centos6上安装jenkins

    一.安装jdk 1.下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  10. Java潜在的坑持续总结

    1.Java里如果有if (foo == 0),如果foo是null这里居然是会抛NPE异常而不是返回false: 2.Java里整形数值不能用==来比较,因为只有区间是[-128,127]的才能这么 ...