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

题目描述:

bzoj3545luogu

bzoj3551

题解:

重构树+线段树合并。

可以算是板子了吧。

代码(强制在线):

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100050;
const int M = 5*N;
template<typename T>
inline void read(T&x)
{
    T f = 1,c = 0;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){c=c*10+ch-‘0‘;ch=getchar();}
    x = f*c;
}
int n,m,q,to[N],h[N];
struct Pair
{
    int x,y;
}p[N];
bool cmp(Pair a,Pair b){return a.x<b.x;}
struct Edge
{
    int x,y,w;
    void rd(){read(x),read(y),read(w);}
}d[M];
bool emp(Edge a,Edge b){return a.w<b.w;}
int ff[N<<1],fa[N<<1][22],wg[N<<1],ch[N<<1][2];
int findff(int u){return u==ff[u]?u:ff[u]=findff(ff[u]);}
void kru()
{
    wg[0] = 0x3f3f3f3f;
    for(int i=1;i<=(n<<1);i++)ff[i] = i;
    int tot = n,sum = 0;
    for(int i=1;i<=m&&sum<n-1;i++)
    {
        int x = findff(d[i].x),y = findff(d[i].y);
        if(x!=y)
        {
            ff[x]=ff[y]=fa[x][0]=fa[y][0]=++tot;
            wg[tot]=d[i].w;
            sum++;
            ch[tot][0]=x,ch[tot][1]=y;
        }
    }
}
void init()
{
    for(int k=1;(1<<k)<=(n<<1);k++)
        for(int i=1;i<(n<<1);i++)
            fa[i][k]=fa[fa[i][k-1]][k-1];
}
int rt[N<<1];
struct segtree
{
    int siz[70*N],ls[70*N],rs[70*N],tot;
    void insert(int l,int r,int&u,int qx)
    {
        if(!u)u=++tot;siz[u]++;
        if(l==r)return ;
        int mid = (l+r)>>1;
        if(qx<=mid)insert(l,mid,ls[u],qx);
        else insert(mid+1,r,rs[u],qx);
    }
    int merge(int x,int y)
    {
        if(!(x*y))return x+y;
        int z = ++tot;
        siz[z] = siz[x]+siz[y];
        ls[z] = merge(ls[x],ls[y]);
        rs[z] = merge(rs[x],rs[y]);
        return z;
    }
    int query(int l,int r,int u,int qk)
    {
        if(l==r)return l;
        int tmp = siz[rs[u]],mid = (l+r)>>1;
        if(qk<=tmp)return query(mid+1,r,rs[u],qk);
        else return query(l,mid,ls[u],qk-tmp);
    }
}tr;
int main()
{
//    freopen("tt.in","r",stdin);
    read(n),read(m),read(q);
    for(int i=1;i<=n;i++)read(p[i].x),p[i].y=i;
    sort(p+1,p+1+n,cmp);
    for(int las=0x3f3f3f3f,k=0,i=1;i<=n;i++)
    {
        if(las!=p[i].x)
        {
            las = p[i].x;
            to[++k] = las;
        }
        h[p[i].y] = k;
    }
    for(int i=1;i<=m;i++)d[i].rd();
    sort(d+1,d+1+m,emp);
    kru();init();
    for(int i=1;i<=n;i++)tr.insert(1,n,rt[i],h[i]);
    for(int i=n+1;i<(n<<1);i++)rt[i]=tr.merge(rt[ch[i][0]],rt[ch[i][1]]);
    for(int u,w,k,i=1;i<=q;i++)
    {
        read(u),read(w),read(k);
        for(int j=20;j>=0;j--)if(wg[fa[u][j]]<=w)u=fa[u][j];
        if(tr.siz[rt[u]]<k)puts("-1");
        else printf("%d\n",to[tr.query(1,n,rt[u],k)]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10825678.html

时间: 2024-10-10 23:41:58

bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版的相关文章

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

传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达

bzoj3551 [ONTAK2010]Peaks加强版

Description //[题目描述]同3545 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表

[您有新的未分配科技点]可,可,可持久化!?------可持久化线段树普及版讲解

最近跑来打数据结构,于是我决定搞一发可持久化,然后发现--一发不可收啊-- 对于可持久化数据结构,其最大的特征是"历史版本查询",即可以回到某一次修改之前的状态,并继续操作:而这种"历史版本查询"会衍生出其他一些强大的操作. 今天,我们主要讲解可持久化线段树.其实,它的另外一个名字"主席树"似乎更加为人所知(主席%%%). 主席树与普通的线段树相比,多出来的操作是在修改时复制修改的一条链,这个操作的过程大概长下面这样. 至于为什么要这样做-- 对

纯MATLAB版本 SIFT代码

先贴几个链接: http://blog.csdn.net/abcjennifer/article/details/7639681  Rachel-Zhang的 http://blog.csdn.net/manji_lee/article/details/8922474 David G. Lowe的两篇标志性的文章分别叫 Object recognition from local scale-invariant features 和 Distinctive Image Features from

Matlab随笔(1)之画图函数总结

MATLAB函数画图 MATLAB不但擅长於矩阵相关的数值运算,也适合用在各种科学目视表示(Scientific visualization).本节将介绍MATLAB基本xy平面及xyz空间的各项绘图命令,包含一维曲线及二维曲面的绘制.列印及存档. 基本XY平面绘图命令 Plot 是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y座标.下例可画出一条正弦曲线: close all; %linspace(5,100,20)和5:5:100的区别在于前者已知元素总个数而不

bzoj3545 [ONTAK2010]Peaks

3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 572  Solved: 164[Submit][Status] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. I

bzoj 3545&amp;&amp;3551: [ONTAK2010]Peaks &amp;&amp;加强版 平衡树&amp;&amp;并查集合并树&amp;&amp;主席树

3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Status] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. I

【bzoj3545】[ONTAK2010]Peaks 线段树合并

[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,M,Q.第二行N个数,第i个数为h_i接下来M行,每行3个数a b c,表示从a到b有一条困难

bzoj 3551: [ONTAK2010]Peaks加强版

Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor lastans,x=x xor lastans,k=k xor lastans.如果lastans=-1则不变. Output 同3545 Sample Input Sample Output HINT [数据范围]同3545 Source