hdu6601 Keen On Everything But Triangle【主席树】【2019 Multi-University Training Contest 2】

题意:

给你n个数字,q次查询,每次查询区间l,r之间可以组成三角形的最大周长是多少,没有就输出-1

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6601

题解:

直接求区间第1大和第2大和第3大,不行组成就往下递推,最差情况就是成斐波那契数列,最多推49次

AC_code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 100010;
const int maxm = maxn*30;
int q, n, m, tot;
int a[maxn], t[maxn];
int rt[maxn], lson[maxm], rson[maxm], c[maxm];
void init_hash() {
    for(int i = 1; i <= n; i++) {
        t[i] = a[i];
    }
    sort(t+1, t+1+n);
    m = unique(t+1, t+1+n)-t-1;
}
int build(int l, int r) {
    int root = tot++;
    c[root] = 0;
    if(l != r) {
        int mid = (l+r)>>1;
        lson[root] = build(l, mid);
        rson[root] = build(mid+1, r);
    }

    return root;
}
int hashs(ll x) {
    return lower_bound(t+1, t+1+m, x) - t;
}
int update(int root, int pos, int val) {
    int newroot = tot++, tmp = newroot;
    c[newroot] = c[root] + val;
    int l = 1, r = m;
    while(l < r) {
        int mid = (l + r)>>1;
        if(pos <= mid) {
            lson[newroot] = tot++;
            rson[newroot] = rson[root];
            newroot = lson[newroot];
            root = lson[root];
            r = mid;
        } else {
            rson[newroot] = tot++;
            lson[newroot] = lson[root];
            newroot = rson[newroot];
            root = rson[root];
            l = mid + 1;
        }
        c[newroot] = c[root] + val;
    }
    return tmp;
}
int query(int left_root, int right_root, int k) {
    int l = 1, r = m;
    while(l < r) {
        int mid = (l+r)>>1;
        if(c[lson[left_root]] - c[lson[right_root]] >= k) {
            r = mid;
            left_root = lson[left_root];
            right_root = lson[right_root];
        } else {
            l = mid + 1;
            k -= c[lson[left_root]] - c[lson[right_root]];
            left_root = rson[left_root];
            right_root = rson[right_root];
        }
    }
    return l;
}
ll num[55];
int main() {
    while(~scanf("%d %d", &n, &q)) {
        tot = 0;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        }
        init_hash();
        rt[n+1] = build(1, m);//建空树
        for(int i = n; i; i--) {
            int pos = hashs(a[i]);
            rt[i] = update(rt[i+1], pos, 1);
        }
        while(q--) {
            int l, r;
            scanf("%d %d", &l, &r);
            int len = (r - l + 1);
            ll ans = -1;
            while (len >= 3) {
                ll x1 = t[query(rt[l], rt[r + 1], len)];
                ll x2 = t[query(rt[l], rt[r + 1], len - 1)];
                ll x3 = t[query(rt[l], rt[r + 1], len - 2)];
                if (x1 < x2 + x3) {
                    ans = 1LL * x1 + 1LL * x2 + 1LL * x3;
                    break;
                }
                len--;
            }
            printf("%lld\n", ans);

    }



    return 0;
}

 

全部评论

相关推荐

1.&nbsp;事件概述3月10日下午,华为在“心声社区”发布长达6500字通报,曝光72名正式员工及19名非雇员在非雇员招聘中存在徇私舞弊行为,多人出卖公司信息资产获利,引发热议。-&nbsp;“非雇员”一般指华为OD员工,与人力服务公司签劳动合同,以派遣方式到华为工作,薪资待遇与华为内部员工基本一致,可通过考核转正。2.&nbsp;相关传言与真相华为相关人士称暂无官方回应,很多传言细节不准确。&nbsp;华为成都研究所员工透露,此次通报主要涉及成都研究所的数据存储部门,整个数据存储业务约100余人,此次明文通报除名辞退或通报批评的有62名,“很多部门基本全开除”&nbsp;。网传任正非亲赴成都、封楼抓人等消息不实。早在2024年年中,就有...
七安有出处嘛:省流:任正非亲赴成都等消息不实,2024 年年中就有人举报了;涉及36名违规当事人,其中有13人被除名;10人有主动申报情节或情节较严重的,予以辞退处理;另有13人被劝退、个人职级降3等。另外还有26名相关管理责任人作为直接或间接管理者,被处以个人职级降6等,冻结个人涨薪、职级晋升、干部向上任命,冻结期6—12个月不等;若下属违规偶发,则仅通报批评。并没有释放100HC😂😂😂
点赞 评论 收藏
分享
01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务