[bzoj3545][ONTAK2010]Peaks

3545: [ONTAK2010]Peaks

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2621 Solved: 722
[Submit][Status][Discuss]
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有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。

Output

对于每组询问,输出一个整数表示答案。

Sample Input

10 11 4

1 2 3 4 5 6 7 8 9 10

1 4 4

2 5 3

9 8 2

7 8 10

7 1 4

6 7 1

6 4 8

2 1 5

10 8 10

3 4 7

3 4 6

1 5 2

1 5 6

1 5 8

8 9 2

Sample Output

6

1

-1

8

HINT

【数据范围】

N<=10^5, M,Q<=5*10^5,h_i,c,x<=10^9。

Source

By Sbullet

sol:
我们愉快的来做在线版本吧
因为要求权值小于等于某个值,那么思路显然有两种,一种是二分权值,但是发现这样想不太对啊。还有一种思路就是考虑顺序加边。
这题我们考虑从大到小加边,那么两个点显然会把两个联通块连接起来,并且当前加的边肯定是大联通块中最小的边。
因为要求k大数,所以我们在每个 联通块中都维护一个权值线段树。然后接下来又有两种做法,显然是要用并查集和权值线段树的,为了在线回答,所以我们把这两个东西都可持久化了就能做了(滑稽)。还有一种就是kr重构树了。
我们把两个点x,y并起来的时候,新建一个点z使得z的权值为xy边权,且z为xy的父亲,然后线段树合并。
新图有一些很好的性质/属性
1、二叉树
2、叶节点才是原图的点
3、对于一个点x,x子树中的某个叶节点到达x子树中其他叶节点经过的边权就是经过的点权中的最值

#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
int n,m,len,q;
inline int read()
{
    char c;
    int res,flag=0;
    while((c=getchar())>'9'||c<'0') if(c=='-')flag=1;
    res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=(res<<3)+(res<<1)+c-'0';
    return flag?-res:res;
}
const int N=210010;
const int M=4000000;
int tot,fa[19][N],father[N],val[N],p;
int sum[M],son[M][2];
inline int merge(int x,int y,int l,int r)
{
    if(!x) return y;
    if(!y) return x;
    int now=++tot;
    sum[now]=sum[x]+sum[y];
    if(l==r) return now;
    int mid=l+r>>1;
    son[now][0]=merge(son[x][0],son[y][0],l,mid);
    son[now][1]=merge(son[x][1],son[y][1],mid+1,r);
    return now;
}
int Ma[19][N];
inline int lca(int x,int Max)
{
    for(int j=18;j>=0;--j)
    if(fa[j][x]&&Ma[j][x]<=Max)
    x=fa[j][x];
    return x;
}
int b[N],h[N];
inline int query(int k,int l,int r,int num)
{
    if(sum[k]<num) return -1;
    if(l==r) return b[l]; 
    int mid=l+r>>1;
    if(sum[son[k][1]]>=num) return query(son[k][1],mid+1,r,num);
    else return query(son[k][0],l,mid,num-sum[son[k][1]]);
}
struct cc
{
    int x,y,z;
    inline bool friend operator <(const cc &a,const cc &b)
    {
        return a.z<b.z;
    }
}a[510000];
inline int find(int x)
{
    return father[x]==x?x:father[x]=find(father[x]);
}
inline void insert(int &k,int l,int r,int x)
{
    k=++tot;
    sum[k]++;
    if(l==r) return;
    int mid=l+r>>1;
    if(mid>=x) insert(son[k][0],l,mid,x);
    else insert(son[k][1],mid+1,r,x);
}
int rt[N];
int p_n;
int main()
{
//  freopen("3545.in","r",stdin);
//  freopen("3545.out","w",stdout);
    n=read();
    m=read();
    q=read();
    p_n=n;
    for(int i=1;i<=n;++i) h[i]=b[i]=read();
    sort(b+1,b+1+n);
    len=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;++i) h[i]=lower_bound(b+1,b+1+len,h[i])-b;
    int x,y,z;
    for(int i=1;i<=m;++i)
    {
        a[i].x=read();
        a[i].y=read();
        a[i].z=read();
    }
    for(int i=1;i<=n;++i)
    insert(rt[i],1,len,h[i]);
    for(int i=1;i<=n;++i) father[i]=i;
    sort(a+1,a+1+m);
    int cnt=0;
    for(int i=1;i<=m;++i)
    {
        int fx=find(a[i].x),fy=find(a[i].y);
        if(fx!=fy)
        {
            fa[0][fx]=fa[0][fy]=father[fx]=father[fy]=++p_n;
            father[p_n]=p_n;
            val[p_n]=a[i].z;
            Ma[0][fx]=val[p_n];
            Ma[0][fy]=val[p_n];
            rt[p_n]=merge(rt[fx],rt[fy],1,len);
            ++cnt;
            if(cnt==n-1)
                break;
        }
    }
    for(int j=1;j<=18;++j)
    for(int i=1;i<=p_n;++i)
    {
        fa[j][i]=fa[j-1][fa[j-1][i]];
        Ma[j][i]=max(Ma[j-1][i],Ma[j-1][fa[j-1][i]]);
    }
    int v,k;
    int last=0;
    while(q--)
    {
        v=read();
        x=read();
        k=read();
        y=lca(v,x);
        printf("%d\n",last=query(rt[y],1,len,k));
        if(last==-1) last=0;
    }
}
基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值