LZH的多重影分身 qduoj 思维 差分

原题链接:https://qduoj.com/problem/591

题意

在数轴上有\(n\)个点(可以重合)和\(m\)条线段(可以重叠),你可以同时平移这\(n\)个点,询问最多可以有多少个点在线段上,输出平移的距离\(d\),和最后的答案\(val\)(如果有多个\(d\)使得\(val\)最大,则输出最小的\(d\))。

解题思路

下面的题解是我们厉害的学长给的,真是太厉害了。


首先,我们用\(ans[i]\),来代表平移\(i - MAX\)(这样表示是因为平移的距离会有负数)的距离会有多少点在线段上。

对于每一个点,我们都可以计算出该点平移到线段上的距离的范围(我们用正数代表向数轴正向移动,用负数代表向数轴负向移动),比如,有一个点位于数轴上\(4\)的位置,有两条线段\([1,2],[5,6]\),则可以让该点移动到线段上的平移距离的范围为:\([-3,-2],[1,2]\)。所以我们可以让$$ans[-3+MAX]...ans[-2+MAX],ans[1+MAX]...ans[2+MAX]$$

各增加1(这不就是区间加的操作吗?)。

这样我们遍历所有的点,就可以得到正确的\(ans\)数组了。扫描一遍\(ans\)数组记录最大值即可得到答案。

但是注意:

1.在进行区间加的操作的时候,应该采用差分的方式进行(不能暴力,使用线段树、树状数组等数据结构的时间复杂度也太高,并且相比差分代码量更大)。

2.要先把有交集的线段合并,在统计答案,否则会重复计算。


总结一下就是,求出每个点到达所有的区间所走的长度,然后在这些点上进行加一,这样我们就可以直接进行遍历所有可以走的长度,寻找最大值。学长们真是太强了。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+7;
const int maxm=1e3+7;
const int maxlen=1e6+7;
int pos[maxn];
struct Node
{
int l, r;
friend bool operator<(const Node a, const Node b)
{
return a.l < b.l;
}
}node[maxm];
int ans[maxlen<<1];
int n, m, cnt;
int main()
{
scanf("%d%d",&n, &m);
for(int i=0; i<n; i++)
scanf("%d", &pos[i]);
for(int i=0; i<m; i++)
scanf("%d%d",&node[i].l, &node[i].r);
sort(node, node+m);
cnt=1;
for(int i=1; i<m; i++)
{
if(node[cnt-1].r >=node[i].l )
node[cnt-1].r=max(node[cnt-1].r, node[i].r);
else
node[cnt++]=node[i];
}
int l, r;
for(int i=0; i<n; i++)
{
for(int j=0; j<cnt; j++)
{
l=node[j].l-pos[i]; r=node[j].r-pos[i];
++ans[l+maxlen];
--ans[r+maxlen+1];
}
}
int len=maxlen<<1, sum=0, delta=0, outans=0;
for(int i=0; i<len; i++)
{
sum+=ans[i];
if(sum > outans)
{
outans=sum;
delta=abs(i-maxlen);
}
else if(sum==outans && delta > abs(i-maxlen))
{
delta=abs(i-maxlen);
}
}
printf("%d %d\n", delta, outans);
return 0;
}

LZH的多重影分身 qduoj 思维 差分的更多相关文章

  1. Magic Stones CodeForces - 1110E (思维+差分)

    E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. AtCoder Beginner Contest 188 D - Snuke Prime (思维,差分)

    题意:你需要订阅一些服务,每个服务每天需要花费\(c_i\),要从第\(a_i\)用到第\(b_i\)天,你可以购买会员,会员每天需要花费\(C\),但是这天的服务不用再另花钱了,问你订阅这些服务的最 ...

  3. Straight Master Gym-101775J (思维+差分)

    题意:给出N种类的数量,求是否可以把N种牌按3-5张连续的顺子打出,顺子必须连续. 分析:相当于把这个序列分成若干长度为[3,5]的区间,当然其实分成若干段大于3的区间即可.因为大于5的区间又可以分拆 ...

  4. T2960 全民健身【思维Dp,预处理,差分优化】

    Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...

  5. [The Preliminary Contest for ICPC Asia Shanghai 2019] B-Light bulbs(差分+思维)

    前言 最近有很多算不上事的事,搞得有点心烦,补题难免就很水,没怎么搞,自我检讨一番~~ 说实话网络赛题目的质量还是挺高的,题目都设计的挺好的,很值得学习.这场比赛那会只有我们大二的在做,其他人去参加$ ...

  6. 洛谷 P4749 - [CERC2017]Kitchen Knobs(差分转换+dp,思维题)

    题面传送门 一道挺有意思的思维题. 首先有一个 obvious 的结论,就是对于每个炉子,要么转到哪里都符合条件,要么存在唯一的最大值.对于转到哪儿都符合条件的炉子我们 duck 不必考虑它,故我们只 ...

  7. Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)

    题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...

  8. 差分约束系统+(矩阵)思维(H - THE MATRIX PROBLEM HDU - 3666 )

    题目链接:https://cn.vjudge.net/contest/276233#problem/H 题目大意:对于给定的矩阵  每一行除以ai  每一列除以bi 之后 数组的所有元素都还在那个L- ...

  9. 【思维题 集合hash 树上差分】11.5撸树

    要注重问题的转化和一些结论的推断 题目描述 要致富,先撸树. 一棵树的形状可以简化为一张 $N$ 个点 $M$ 条边的图,由于装备条件限制,你只有撸两次,也就是删去两条边,当这张图不联通时,就意味着树 ...

随机推荐

  1. 灰度图像--图像分割 阈值处理之OTSU阈值

    学习DIP第55天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...

  2. 关于项目在网页中运行部分jsp出现乱码(由request.getRequestDispatcher("XXX.jsp").forward(request, response)造成)的解决方法

    在写jsp的时候发现部分的jsp在浏览器预览时出现乱码,为一堆问号,如图: 当时问了同学,只有部分jsp会出现乱码,因为重新建一个jsp在运行就没有错误,可以显示出来,所以发现是jsp头部的错误,当新 ...

  3. AcWing:135. 最大子序和(前缀和 + 单调队列)

    输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大. 输入格式 第一行输入两个整数n,m. 第二行输入n个数,代表长度为n的整数序列. 同一行数之间用空格隔开 ...

  4. A. Odds and Ends(思维)

    A. Odds and Ends time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. Linux网络编程二、tcp连接API

    一.服务端 1.创建套接字: int socket(int domain, int type, int protocol); domain:指定协议族,通常选用AF_INET. type:指定sock ...

  6. Maven :Failed to execute goal on projectt ...: Could not resolve dependencies for project ...

    Maven 项目运行 clean install  之前,先要运行父项目的 clean install, 否则可能出现 Failed to execute goal on project ...: C ...

  7. TCP输出 之 tcp_transmit_skb

    概述 tcp_transmit_skb的作用是复制或者拷贝skb,构造skb中的tcp首部,并将调用网络层的发送函数发送skb:在发送前,首先需要克隆或者复制skb,因为在成功发送到网络设备之后,sk ...

  8. DFA和NFA的区别

    正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机),另一类称为NFA(非确定性有穷自动机).两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去.DFA捏着文本串去比较 ...

  9. Vue-2:官方教程学习

    1,先把下面这些内容都按照官方教程敲一遍,打好基础,类似于“前戏”,其作用我想爸爸就不必多说了吧(づ。◕‿‿◕。)づ. https://cn.vuejs.org/v2/guide/ 同时可以配合配套视 ...

  10. 求平面上N点最远两点和最近两点距离

    最近两点,二分法 最远两点,凸包+找对踵点