• Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)


    题目链接:D. Frets On Fire

    思路:明明可以离散化+二分写,思路硬是歪到了线段树上,自闭了,真实弟弟,怪不得其他人过得那么快

    只和查询的区间长度有关系,排完序如果相邻的两个点的差值小于等于查询的区间长度,那么给结果带来的变化就会新增差值个数,如果大于区间长度那么就会新增区间长度个数

    维护的话,线段树和二分都可以,二分需要离散化处理,再给差值排个序,每次找到第一个大于当前区间长度的差值位置就好了,(没实现,但是理论上应该没问题)

    线段树直接动态开点可以不用离散化。。

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define mid ll m = (l + r) /2
    const ll M = 1e5+10;
    #define ROF(i,a,b) for(ll i=a;i>=b;i--)
    ll sum[M*40],num[M*40];
    ll ls[M*40],rs[M*40];
    ll idx;
    void update(ll p,ll c,ll l,ll r,ll &rt){
        if(!rt) rt = ++idx;
        sum[rt] += c;
        num[rt] += 1;
        if(l == r){
            return ;
        }
        mid;
        if(p <= m) update(p,c,l,m,ls[rt]);
        else update(p,c,m+1,r,rs[rt]);
    }
    
    ll query(ll L,ll R,ll l,ll r,ll rt){
        if(L <= l&&R >= r){
            return sum[rt];
        }
        mid;
        ll ret = 0;
        if(L <= m) ret += query(L,R,l,m,ls[rt]);
        if(R > m) ret += query(L,R,m+1,r,rs[rt]);
        return ret;
    }
    
    ll ask(ll L,ll R,ll l,ll r,int rt){
        if(L <= l&&R >= r){
            return num[rt];
        }
        mid;
        ll ret = 0;
        if(L <= m) ret += ask(L,R,l,m,ls[rt]);
        if(R > m) ret += ask(L,R,m+1,r,rs[rt]);
        return ret;
    }
    ll a[2*M];
    int main()
    {
        ll n,m,x,y,rt = 0;
        scanf("%lld",&n);
        for(ll i = 1;i <= n;i ++){
            scanf("%lld",&a[i]);
        }
        sort(a+1,a+1+n);
        for(ll i = 2;i <= n;i ++){
            ll num = a[i] - a[i-1];
            update(num,num,1,1e18,rt);
        }
        scanf("%lld",&m);
        for(ll i = 1;i <= m;i ++){
            scanf("%lld%lld",&x,&y);
            ll num = y-x+1;
            ll ans = num;
            ans += query(1,num,1,1e18,rt);
            //cout<<ans<<" ";
            ans += ask(num+1,1e18,1,1e18,rt)*num;
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    思岚 激光雷达 A3 使用官方sdk读取数据
    思岚激光雷达 开箱使用
    ubuntu 更新软件失败
    ubuntu 安装tftp
    Ubuntu 安装Telnet服务
    【博客搬至CSDN】
    【RabbitMQ】一文带你搞定springboot整合RabbitMQ涉及消息的发送确认,消息的消费确认机制,延时队列的实现
    基于JVisualVM的可视化监控
    LCN解决分布式事务原理解析+项目实战(原创精华版)
    springboot 用监听器统计在线人数案例分析
  • 原文地址:https://www.cnblogs.com/kls123/p/10663399.html
Copyright © 2020-2023  润新知