首页 > 其他分享 >D. Jumping Through Segments

D. Jumping Through Segments

时间:2023-12-11 15:35:44浏览次数:18  
标签:题意 int max Segments mid Jumping Through 区间 left

1、首先,假设我们已知一个k,若其符合题意,那么

第一次移动时可达区间为[-k,k],我们只需判断这个区间和[L1,R1]是否有交区间。然后我们取出这个交区间【left,right】。

接下每次移动,我们都在上一次得到的区间基础上得到新的可移动区间【left-k,right+k】,之后再和【Li,Ri】取交区间。

如果其中有一次交区间为空,那么该k不符合题意,反之,则符合。

2、接下来,通过二分法取k,并执行1步骤判断是否符合,最终可以得到最小的k值。

主要代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> Pos;
bool process(int mid,vector<Pos> &a,int n){
    int l=0,r=0;
    for (int i=0;i<n;i++){
        l-=mid;r+=mid;  //可移动区间的左右边界 
        if (r<(a[i].first)) return false;  //右边界小于Ri时不符合 
        else if (l>(a[i].second)) return false;//左边界大于Li时不符合 
        else{l=max(l,a[i].first);r=min(r,a[i].second);}  //取交区间 
    }
    return true;
}
int main(){
    int t;
    cin>>t;
    while (t--){
        int n,l,r,max=0;
        cin>>n;
        vector<Pos> a;  //存储每一段区间 
        for (int i=0;i<n;i++){
            cin>>l>>r;
            a.push_back(Pos(l,r));
            if (r>max) max=r;  //找到二分法的最大值 
        }
        int left=0,mid;
        while (left<=max){  //二分查找 
            mid=left+((max-left)>>1);
            if (process(mid,a,n)) max=mid-1;  //判断是否符合题意 
            else left=mid+1;
        }
        printf("%d\n",max+1);
    }
    return 0;
}

 

标签:题意,int,max,Segments,mid,Jumping,Through,区间,left
From: https://www.cnblogs.com/purple123/p/17894541.html

相关文章

  • ARC169 B Subsegments with Small Sums 题解
    LinkARC169BSubsegmentswithSmallSumsQuestion\(x\)是一个序列,定义\(f(x)\)为把序列\(x\)切成几段,每段的和不能超过\(S\)的最小段数给出序列\(A=(A_1,A_2,\cdots,A_N)\)求:\[\sum_{1\lel\leN}f((A_l,A_{l+1},\cdots,A_r))\]Question先考虑一个结论,\(x\)为......
  • D. Jumping Through Segments
    题目传送门我是彩笔二分trigger:存在一个最小值,使得当大于最小值时一定成立,小于最小值时一定不成立#include<bits/stdc++.h>usingnamespacestd;intn;intl[200005]={0},r[200005]={0};intss(intlen){intnow=0;intlp=0,rp=0;//代表第i此行动后能到达的有效......
  • Fiori WalkThrough学习-Step02.Bootstrap
    1.Index.html<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>UI5Walkthrough</title><scriptid="sap-ui-bootstrap"src="https://openui5.hana.ondemand.co......
  • hackthebox format medium walkthrough
    walkthough 1.Wemustbrowsethewebsiteandlookupthebusinesspointforthewebpage.atthisboxwecanfindthecoderepository.codeauditinganddiscoveringtheprivilegeescalatedthroughtheRedisUnixsockvulnerability.2.Afterprivilegeescalat......
  • [ARC168E] Subsegments with Large Sums
    题目链接看到严格选\(k\)个,不难想到WQS二分。定义\(f(x)\)为分成\(x\)段,最多有多少个超过\(S\)的。然后你会发现他不是凸的。因为他有很多平段,比如把两个很小的合并不改变答案。换个方向?考虑定义\(f(x)\)为有\(x\)个超过\(S\)的段,最多有多少个段。然后发现这个......
  • [ARC168E] Subsegments with Large Sums
    有点意思的简单题。答案有可二分性。合并两段,显然仍然合法。考虑如何check。因为答案可以被二分,我们尝试求恰好\(x\)段就行了。恰好,这是wqs二分的内容。如何设计一个与\(x\)有关的凸函数呢?这个函数大概是\(\sum_{i=1}^xw(l_i,r_i)\)的形式,每一个\([l,r]\)都是合......
  • CF685E Travelling Through the Snow Queen's Kingdom
    题意给定一张图,走出当前边的时间为\(i\)。\(q\)次询问,问\(s\)是否能在\(l\tor\)中走到\(t\)。Sol考虑将边从大到小插入图中。注意到当前边只能对起点造成贡献。复杂度\(O(n\times\max\{n,m\})\)Code#include<iostream>#include<algorithm>#include<cstd......
  • 什么是 DTU(Database Throughput Unit)
    在云计算领域,DTU是DatabaseThroughputUnit的缩写,它代表着数据库吞吐单位,是一种用于度量数据库性能的单位。DTU概念主要应用于AzureSQLDatabase和AzureSQLManagedInstance,它是一种抽象的、预配置的资源集合,包括CPU、内存、读写操作等。在DTU模型中,每个服务级别都......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解] CF1327F AND Segments
    ANDSegments有\(m\)个限制\((l,r,x)\)。要计算满足以下条件的长度为\(n\)的序列\(a\)的数量:\(\foralli\in[1,n],0\lea_i<2^k\)。\(\foralli\in[1,m],a_{l_i}\operatorname{and}a_{l_i+1}\operatorname{and}\cdots\operatorname{and}a_{r......