zoukankan      html  css  js  c++  java
  • [学习笔记]day3-一些双指针的题

    尺取法

    参考博客:https://www.luogu.com.cn/blog/Nero-Yuzurizaki/chi-qu-fa-xiao-jie


    http://poj.org/problem?id=3061

    序列,非负,问和不小于(S)的最短子串的长度,双指针扫描(O(n))复杂度。


    https://www.luogu.com.cn/problem/P1638

    类似上一题,找最短的区间使其包含([1,m])的整数。


    https://codeforces.com/problemset/problem/1042/D

    给一个序列,询问区间和小于(t)的子区间个数,(nleq 2e5)

    (s_r-s_{l-1}<t),对于每个(s_r)即查询有多少个(l)满足(s_{l-1}>s_r -t),可以直接暴力地写个动态开点的值域线段树(或者对所有(2n)个数进行离散化写普通的线段树)。

    另外这里还可以这么转化:考虑对区间进行分治,即([l,r])内有多少个(p,q(p<q):s_q-s_p<t),不难想到这样的数对的个数来自于([l,mid],[mid+1,r])的答案再加上跨越(mid)的区间的答案,前面两个直接递归计算,中间这一段类似归并排序。

    这里稍微把(l-1,r)转化成了(p,q)以避免(s)排序后出现的一些问题((s_{l-1})可能会取到不正确的位置)


    https://codeforces.com/problemset/problem/47/E

    上古CF,大意是((0,0))处有一个炮台,现在打出(n)个炮弹,每个炮弹速度都是(v),夹角(alphain(0,frac{pi}{4})),有(m)堵垂直(Ox)轴的墙,询问每个炮弹最后停在那里(只要撞到墙或者地就停下来),(nleq 10^4,mleq 10^5)

    因为是很老的题,其实直接写(O(nm))的暴力也卡得过去(

    不过还是有些性质可以看看:利用一些高中物理知识可以很容易注意到单调性。(速度一定的情况下斜抛)

    比如我们可以算出来抛物线的轨迹(egin{aligned}y=x an alpha -frac{g}{2v^2cos^2alpha}x^2end{aligned}),对应的零点除了(x=0)还有一个(x=frac{v^2}{g}sin(2alpha)),这个东西在(alphain(0,frac{pi}{4}))内是单调递增的,也就是角度越大抛得越远。

    同时最高点的纵坐标也能算出是(egin{aligned}y_m=frac{v^2 sin^2 alpha}{2g}=frac{v^2}{4g}(1-cos(2alpha))end{aligned}),也是单调的,那这题就很愉快了,对炮弹按照角度从小到大排序,对于一堵墙来说,如果角度小的能过,那么角度大的一定能过,双指针扫描炮弹和墙。

    时间复杂度(O(nlog n+mlog m))

  • 相关阅读:
    进程、线程
    timer控件、三级联动
    用户控件、动态创建添加
    打印控件
    窗体移动和阴影,对话框控件
    winform listview控件
    winform打开唯一窗体、构造函数传值
    菜单和工具栏
    winform公共控件
    hibernate中各种包的添加
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/14412524.html
Copyright © 2011-2022 走看看