首页 > 其他分享 >Codeforces Round 974 (Div. 3) - D题

Codeforces Round 974 (Div. 3) - D题

时间:2024-10-01 17:00:22浏览次数:1  
标签:974 重叠 最少 ll 段时间 Codeforces 工作 这道题 Div

这道题题意就是你有k个工作,每个工作都有一个时间区间左边界l和右边界r,妈妈和哥哥要来看你,时长为d,题目要求求出 1.哥哥看你的这段时间工作时间段重叠最多是多少?2.妈妈看你的这段时间工作时间段重叠最少是多少?
这道题如果硬做的话可能就是线段树了(蒟蒻暂时没有想到其他的做法),但如果反正来想,不找重叠最多,而是找不重叠最少,不找重叠最少,而是找不重叠最多,这样就简单多了(大概...) 具体来说就是在来看你的这段时间d,如果重叠的工作最多,那么在这段时间的“两边”的“独立”的工作最少,反之如果重叠的工作最少,那么在这段时间的“两边”的“独立”的工作最多。除此之外,这道题还有一个非常有趣的点是对于工作时间的处理,将原本的区间形状的时间变化为点状的时间(大家可以体会一下,我不太会描述,这点我当时比较困惑,琢磨了一段时间),这样更方便进行操作,非常非常的精妙。下面放代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

void slove(){
    ll n, d, k;
    cin >> n >> d >> k;
    vector <ll> a(n + 1, 0), b(n + 1, 0);
    for(ll i = 1; i <= k; i ++){
        ll l, r;
        cin >> l >> r;
        l --;
        a[l] ++, b[r] ++;
    }
    //右边界
    for(ll i = 1; i <= n; i ++){
        b[i] += b[i - 1];
    }
    //左边界
    for(ll i = n - 1; i >= 0; i --){
        a[i] += a[i + 1];
    }
    ll mx = -1, mn = n + 1, idmx, idmn;
    n -= d;
    for(ll i = 0; i <= n; i ++){
        ll num = b[i] + a[i + d];
        // cout << num << endl;
        if(num > mx){
            mx = num;
            idmx = i + 1;
        }
        if(num < mn){
            mn = num;
            idmn = i + 1;
        }
    }
    // cout << "ans:";
    cout << idmn << " " << idmx << endl;
    return ;
}
int main(){
    ll t;
    cin >> t;
    while(t --){
        slove();
    }
    return 0;
}

对于这道题我起初的思路是用树状数组来维护,但处理的时候时间复杂度会出问题,又想到了线段树,但写起来麻烦,就没有继续进行,一直没想到什么巧妙的想法,直到看了哥哥的视频,起初也没看懂,后来恍然大悟,琢磨半天终于懂了,哥哥吴迪啊啊啊!!!
最近太摆,前几天本来说写这道题题解的,一直拖延再加上玩,就拖到了今天...好好调整吧,争取在国庆集训回归正轨

标签:974,重叠,最少,ll,段时间,Codeforces,工作,这道题,Div
From: https://www.cnblogs.com/-zzuxx-/p/18442979

相关文章

  • Codeforces Round 973 (Div. 2) - D题二分
    首先这道题的一个坑点就是求max(a[1],a[2],...,a[n])和求min(a[1],a[2],...,a[n])是完全独立的,不会相互影响(可能是我读题能力太差,一直卡在这点了。。。)这道题二分是一种很好想的方法,题中提到max和min,我们就可以想到只要让最大值最小,让最小值最大就可以达到我的目的了,二分的......
  • Codeforces Round 976 (Div. 2)
    VP的这一场,真的唐完了。。。A.FindMinimumOperations题意给你一个\(n\)和\(k\),每次操作可以让\(n\)减去一个\(k\)的\(x\)次方,即\(n-k^x\)。问你最少操作几次能够让\(n\)变成\(0\)。思路我们先考虑如果\(k\)是\(2\)的情况,那么题目就转化成了\(n\)的......
  • Codeforces Round 958 (Div. 2)
    手速前三题,D题想到树形dp但是没做出来。A.SplittheMultiset题意给你一个多集,一开始这个多集里只有一个数字。每次操作可以选择删掉多集里的一个数,然后添加\(k\)个数,并且使得这\(k\)个数的和等于删掉的数。问你最少需要操作多少次多集里的数的个数等于等于\(n\)。思路......
  • codeforces round 975 E(div.2)(lambda表达式实现dfs,min_element函数,一定要优化重复的
    解题历程:看到题目要求要用最少的消除次数让所有叶子深度相同,通过观察,那么就只需要将所有深度都尝试一遍就行了,可是我当时没多想就用dfs记录所有节点的深度,单独将所有叶子和该叶子的深度存起来,记录最大的深度,从最大深度尝试到深度0,对于深度小于当前尝试深度的叶子,用dfs的方式将与......
  • Codeforces Round 976 (Div. 2) and Divide By Zero 9.0
    目录写在前面A签到B数学,模拟C二进制,拆位D暴力,并查集E概率DPF写在最后写在前面补题地址:https://codeforces.com/gym/104128。上大分失败呃呃呃呃有点过载了妈的我现在应该去打会儿游戏。A签到等价于求\(n\)在\(k\)进制下各位之和,写一个类似快速幂的东西。///*By......
  • Codeforces Round 975 (Div. 2)
    C.CardsPartition(C)对于每个确定的size,有便捷的方法判断该值是否合法:组数最小为\(a_{max}\),若\(k\)张牌可以填出\(a_{max}\)组牌堆则合法;将余下的牌当成新的一组,若\(k\)张牌可以凑出一整组则合法;其余情况不合法。由于check过程为\(O(1)\),可从大到小暴力枚举size,时间......
  • Codeforces Round 976 (Div. 2)
    传送门A.输出\(n\)在\(k\)进制下各数位之和B.一个位置被反转当且仅当有奇数个因子,有奇数个因子的数一定是完全平方数。二分\(n\)即可C.枚举二进制下每一位,发现\(b,c,d\)再这一位最多有八种可能,对于每一种情况都能得到在这一位\(a\)的值,分类讨论就行了。D.E.\(......
  • Codeforces Round 976 (Div. 2)
    B:很容易发现只有因数个数为偶数的灯泡是亮的。所以只有完全平方数的因数是奇数个。实现上可以二分。但是sqrt是double的必须开sqrtl才是longdouble的,才能满足这题longlong的数据范围。人给我卡傻了。哈哈。#include<bits/stdc++.h>usingnamespacestd;#defineintunsign......
  • Codeforces Round 975 (Div. 2) CE
    来源:CodeforcesRound975(Div.2)C.CardsPartition题意本身有\(a_i\)张\(i\)牌,现在将牌分成若干份,每一份牌数相等,且每一份都由不同的牌组成同时有\(k\)次补充任意牌的机会,求最多分成一份几张牌思路假定分成\(m\)份,每份\(p\)张牌,那么所有牌加补充的牌等于\(m*p......
  • Codeforces Round 975 (Div. 2) A~F 题解(Div.1 A~D)
    CodeforcesRound975(Div.2)A~F题解(Div.1A~D)也是补完整场了。A.MaxPlusSize枚举最大值的位置,使长度最长,更新答案。B.AllPairsSegments每个线段内部的点的答案都是一样的,在处理一下线段两边边界的点。被包含次数就是左边\(\times\)右边。用\(map\)记录答案......