ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dls的数据结构_习题1

2022-04-27 13:34:23  阅读:131  来源: 互联网

标签:Node minn int res tr dls que 习题 数据结构


将(i, a[i])当作点,对a[i]这个维度扫描,在i这个维度上面建立扫描线
#include<bits/stdc++.h>

using namespace std;
const int N = 2e5+10;

array<int, 4> que[N];
array<int, 2> a[N];
// 线段树维护树链剖剖分的dfs序
struct Node{
    int l, r;
    int minn;
}tr[4*N];


void pushup(Node &F, Node L, Node R){
    F.minn = min(L.minn, R.minn);
}

void pushup(int u){
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r){
    if(l == r){
        // 这里注意要加个id,获得序列上l位置的点的是那个点,然后获得他的权值
        tr[u] = {l, r, 0x3f3f3f3f};
    }
    else{
        tr[u] = {l, r, 0x3f3f3f3f};
        int mid = l + r >> 1;
        build(u<<1, l, mid), build(u<<1|1, mid+1, r);
        pushup(u);
    }
}

void modify(int u, int x, int v){
    
    if(tr[u].l >= x && tr[u].r <= x) {
        tr[u].minn = v;
    }
    else{
        int mid = tr[u].l + tr[u].r >> 1;
        if(x <= mid) modify(u<<1, x, v);
        else if(x > mid) modify(u<<1|1, x, v);
        pushup(u);
    }
}

Node query(int u, int l, int r){
    if(tr[u].l >= l && tr[u].r <= r) return tr[u];
    else{
        int mid = tr[u].l + tr[u].r >> 1;
        if(l > mid) return query(u<<1|1, l, r);
        else if(r <= mid) return query(u<<1, l, r);
        else{
            Node res;
            Node L = query(u << 1, l, r), R = query(u << 1 | 1, l, r);
            pushup(res, L, R);
            return res;
        }
    }
}

int res[N];
int main(){
    int n, m; cin >> n >> m;
    memset(res, 0x3f, sizeof res);
    for(int i = 1; i <= n; i ++){
        int x; scanf("%d", &x);
        a[i] = {x, i};
    }
    for(int i = 1; i <= m; i ++){
        int l, r, x; scanf("%d %d %d", &l, &r, &x);
        que[i] = {x, l, r, i};
    }
    sort(a + 1, a + 1 + n);
    reverse(a + 1, a + 1 + n);
    sort(que + 1, que + 1 + m);
    reverse(que + 1, que + 1 + m);
    build(1, 1, n);
    int i, j;
    for(i = 1, j = 1; i <= m + 1; i ++){
        while(j <= n && que[j][0] > a[i][0]){
            res[que[j][3]]  = query(1, que[j][1], que[j][2]).minn;
            j ++;
        }        
        if(i == m + 1) break;
        modify(1, a[i][1], a[i][0]);
    }  

    for(int i = 1; i <= m; i ++){
        if(res[i] != 0x3f3f3f3f) printf("%d\n", res[i]);
        else printf("-1\n");
    }

}

标签:Node,minn,int,res,tr,dls,que,习题,数据结构
来源: https://www.cnblogs.com/njw1123/p/16198520.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有