CF1175E Minimal Segment Cover 题解】的更多相关文章

题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然的贪心,设询问区间为\([l,r]\),则所取的区间最靠左的一个的左端点必定小于等于\(l\),并且要使这个区间尽可能地向右延伸. 取完第一个之后,重复以上的贪心,直至满足条件,那么这样的答案必定是最小的. 但是这样的时间复杂度是\(O(nm)\)的,所以要考虑优化,优化方法是用倍增,每次向右跳\(…
题目链接 题意 给出n条线段.m次询问,每次询问给出一个区间\([l,r]\)问最少需要多少条线段才能覆盖区间\([l,r]\). 所有坐标\(\le 5\times 10^5\).\(n,m\le 2\times 10^ 5\) 思路 其实是比较经典的线段覆盖问题. \(f[i][j]\)表示从i开始走\(2^j\)条线段最远到达的位置. 然后对于每次询问都走一遍即可. 代码 /* * @Author: wxyww * @Date: 2019-06-06 10:55:48 * @Last Mo…
题意: 有\(n\)条线段,区间为\([l_i, r_i]\),每次询问\([x_i, y_i]\),问要被覆盖最少要用多少条线段. 思路: \(f[i][j]\)表示以\(i\)为左端点,用了\(2^j\)条线段,最远到哪里. 然后从大到小贪心即可,类似于倍增找LCA的过程. 代码: #include <bits/stdc++.h> using namespace std; #define N 200010 #define M 500010 #define D 20 int n, q; in…
题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端点”,然后一直往右跳直到跳到r为止,但最坏情况下需要跳O(n)次显然是会T的,那咋办呢? 我们拓展一下,利用倍增的方法,可以预处理出“从每个左端点l出发选2^k条线段可以到达的最右端点”,设为$dp[l][k]$,则有$dp[l][k]=dp[dp[l][k-1]][k-1]$,对于每组询问,让k从…
题目传送门 题意:给出n条平行于x轴的线段,q次询问,每次询问一个区间最少要几条线段来覆盖,若不能覆盖则输出-1. 思路:先考虑贪心,必定是先找到,所有左端点小于等于$x$的线段的右端点最大在哪里,然后答案加一,将$x$挪到这个最大右端点,继续贪心,直到右端点大于$y$. 考虑优化,可以用倍增来加速这个过程,先用初始的线段预处理出所有的$f[i][j]$,代表第i个节点跳跃{2^j}个线段最大能到达多少个右端点,然后倍增搞一下,每次询问的时候,也是二分的跳,每次的时间复杂度都是$log(n)$,…
题意简述 原题LightOJ 1240,Point Segment Distance(3D). 求三维空间里线段AB与C. 题解 我们设一个点在线段AB上移动,然后发现这个点与原来的C点的距离呈一个单峰状,于是珂以三分. 三分的时候处理一下,把A点坐标移动到(0,0,0)珂以方便操作. 代码 #include <cstdio> #include <cmath> namespace fast_IO{ const int IN_LEN = 10000000, OUT_LEN = 100…
题意: 给你一个串,问你他的每个前缀的最小重复单元,其中单元是可以重叠的,最后按顺序输出即可.比如样例中abaabaa的最小重复单元为abaa,所以相应输出为4. 样例: input : abaabaababa output:1 2 3 4 5 3 4 5 3 10 3 kmp过程就不用多说了,现在我们利用next数组的性质来对问题进行求解. 我们首先用一个ans[maxn]数组来记录最后的答案,且我们的字符串下标从0开始,显然,我们ans[i]的最大值为i+1,我们因此也用此值对其进行初始化.…
本题是最主要的分段树操作了.或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了. 不使用lazy标志,更新仅仅是更新单点. 假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率就须要O(lgn)了. 可是不是用分段树,那么查询的时间效率是O(n),而分段树查询效率是O(lgn) 这就是amortize分摊了时间,并且lgn真的非常快,数据不是非常巨大的时候.接近常数了. 故此本题须要使用分段树. #include <cstdio> class EnemyInfo { s…
A. From Hero to Zero 通过取余快速运行第一步即可.由于\(a \% b (a >= b) <= \frac{a}{2}\).所以总复杂度不超过\(O(log_2n)\). #include <cstdio> #include <iostream> using namespace std; typedef long long LL; int main(){ int T; scanf("%d", &T); while(T--)…
比赛链接:https://codeforces.com/contest/1437 A. Marketing Scheme 题解 令 \(l = \frac{a}{2}\),那么如果 \(r < a\),每个顾客都会买更多猫粮. 代码 #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t;…