当前位置: 首页 > article >正文

Codeforces Round 974 (Div. 3)D题解析

前三道太水了,第三道一眼二分,就是需要注意要超过一半人就行,我因为检查了好久

D. Robert Hood and Mrs Hood

 

抱歉,我是蒟蒻,我看到区间问题就想到了线段树,我们只需要用线段树去维护每个点药经历多少任务即可

我们用线段树去维护,每个点会覆盖几个任务点即可,我们一个任务,假设开始时间为L,结束时间为R ,因此我们什么时候来能够赶上这个任务呢?很明显是从L-d+1~R这个时间来都能碰到这个任务,因此,我们就需要给这个区间+1

然后最后去查每个点的权值即可,时间复杂度为O(logn)

#include<bits/stdc++.h>  
using namespace std;  
#define int long long
int t;  
int n,d,k;  
int l,r;  
struct node  
{  
    int l;  
    int r;  
    long long sum; 
    long long lz;  
}tree[1000006*4];  

void push_down(int i)  
{  
    if(tree[i].lz != 0)  
    {  
        tree[i*2].lz += tree[i].lz;  
        tree[i*2].sum += tree[i].lz * (tree[i*2].r - tree[i*2].l + 1);  
        tree[i*2+1].lz += tree[i].lz;  
        tree[i*2+1].sum += tree[i].lz * (tree[i*2+1].r - tree[i*2+1].l + 1); 
        tree[i].lz = 0; 
    }   
}  

void build(int i,int l,int r)  
{  
    tree[i].lz = 0;  
    tree[i].l = l;  
    tree[i].r = r;  
    
    if(l == r)  
    {  
        tree[i].sum = 0; 
        return;  
    }  
    
    int mid = (l + r) / 2;  
    build(i*2, l, mid);  
    build(i*2+1, mid + 1, r);  
    tree[i].sum = tree[i*2].sum + tree[i*2+1].sum; 
}  

void add(int i,int l,int r,int k)  
{  
    if(l <= tree[i].l && tree[i].r <= r)  
    {  
        tree[i].sum += k * (tree[i].r - tree[i].l + 1);  
        tree[i].lz += k;
        return;  
    }  
    
    push_down(i);  
    int mid = (tree[i].l + tree[i].r) / 2;  
    
    if(l <= mid)  
        add(i*2, l, r, k);  
    if(r > mid)  
        add(i*2+1, l, r, k);  
    
    tree[i].sum = tree[i*2].sum + tree[i*2+1].sum; 
}  

long long find(int i,int l,int r)  
{  
    if(tree[i].l >= l && tree[i].r <= r)  
    {  
        return tree[i].sum;  
    }  

    push_down(i);  
    long long ans = 0;  
    int mid = (tree[i].l + tree[i].r) / 2;  
    
    if(l <= mid)  
        ans += find(i*2, l, r);  
    if(r > mid)  
        ans += find(i*2+1, l, r);  
    
    return ans;  
}  

void solve()  
{  
    cin >> n >> d >> k;  
    build(1, 1, n);  
    
    for(int i = 1; i <= k; i++)  
    {  
        cin >> l >> r;  
        add(1, max(1, l-d+1), r, 1);  
    }  
    
    int minn = 1, maxn = 1;  
    long long minnz = find(1, 1, 1);   
    long long maxnz = find(1, 1, 1);  
    
    for(int i = 1; i <= n - d + 1; i++)  
    {  
        long long cnt = find(1, i, i);  
        if(cnt < minnz)  
        {  
            minnz = cnt;  
            minn = i;  
        }  
        else if(cnt > maxnz)  
        {  
            maxnz = cnt;  
            maxn = i;  
        }  
    }  
    
    cout << maxn << " " << minn << '\n';  
}  

signed main()  
{  
    ios_base::sync_with_stdio(0);  
    cin.tie(0);  
    cout.tie(0);  
    
    cin >> t;  
    while(t--)  
    {  
        solve();  
    }  
    return 0;  
}


http://www.kler.cn/news/315937.html

相关文章:

  • 集群服务器主机实现主机名与IP绑定
  • Linux下操作文件时提示:Operation not permitted
  • 基于软件项目开发流程的软件综合实训室解决方案
  • Windows10安装cuda11.3.0+cudnn8.5.0,以及创建conda虚拟环境(pytorch)
  • sklearn特征选取之RFE
  • Django高级特性和最佳实践
  • SpringBoot 配置⽂件
  • 【数据结构与算法】LeetCode:二分查找
  • MATLAB给一段数据加宽频噪声的方法(随机噪声+带通滤波器)
  • 【Go】Go 环境下载与安装教程(Windows系统)
  • 九、成功版--windows上安装artifactory配置postgressql
  • [Redis][环境配置]详细讲解
  • Spark-累加器源码分析
  • JS执行机制(同步和异步)
  • 深度学习入门:探索神经网络、感知器与损失函数
  • html实现TAB选项卡切换
  • LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略
  • Python之一些列表的练习题
  • Spring Boot入门:构建你的首个Spring Boot应用
  • Mybatis-plus进阶篇(二)
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)
  • 数据结构 ——— 常见的时间复杂度计算例题(最终篇)
  • Linux驱动开发 ——架构体系
  • 求最大公约数
  • CSS 布局三大样式简单学习
  • 【解密 Kotlin 扩展函数】命名参数和默认值(十三)
  • 【深入Java枚举类:不仅仅是常量的容器】
  • 数据结构——串的模式匹配算法(BF算法和KMP算法)
  • 设计模式-装饰者模式
  • VMware虚拟机经常性卡死,打开运行一段时间后卡死,CPU占比增至100%