博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【做题】arc068_e-Snuke Line——利用特殊性质分讨
阅读量:4582 次
发布时间:2019-06-09

本文共 1128 字,大约阅读时间需要 3 分钟。

显然,对于所有跨度暴力扫一遍的复杂度本身只有\(O(n \log n)\)

容易想到在每一个到达的位置加上覆盖这个位置的区间数。剩下的问题就在于如何处理覆盖了多个位置的区间。
记录已访问或去重都是难以实现的。但注意到一个性质:

所有长度不小于跨度的区间一定都能被访问到,所有长度小于跨度的区间至多访问一次。

于是我们枚举跨度,维护长度不小于当前跨度的区间数,把长度小于当前跨度的区间加入到一个支持区间加和单点查询的数据结构里就可以了。

时间复杂度\(O(n \log ^2 n)\)

#include 
using namespace std;const int N = 300010, M = 100010;#define lowbit(x) ((x) & (-(x)))int v[M],n,m,s,ans,p=1;struct data { int l,r; bool operator < (const data& x) const { return r - l < x.r - x.l; }} dat[N];void add(int p,int val) { for (; p <= s ; p += lowbit(p)) v[p] += val;}int query(int p) { int res = 0; for (; p ; p -= lowbit(p)) res += v[p]; return res;}int main() { scanf("%d%d",&n,&m); for (int i = 1 ; i <= n ; ++ i) scanf("%d%d",&dat[i].l,&dat[i].r); sort(dat+1,dat+n+1); s = m+1; for (int i = 1 ; i <= m ; ++ i) { while (dat[p].r - dat[p].l + 1 < i && p <= n) { add(dat[p].l+1,1); add(dat[p].r+2,-1); p ++; } ans = n - p + 1; for (int j = 0 ; j <= m ; j += i) ans += query(j+1); printf("%d\n",ans); } return 0;}

小结:利用题目特殊性质分类讨论可以有效简化题目。

转载于:https://www.cnblogs.com/cly-none/p/8997726.html

你可能感兴趣的文章
[转载]漫话:如何给女朋友介绍什么是死锁
查看>>
读书笔记——持有对象
查看>>
php header函数导出excel表格
查看>>
Jzoj1277最高的奶牛
查看>>
plsql中文乱码问题(显示问号)
查看>>
C# DataTbale详细操作
查看>>
用opencv检测人眼并定位瞳孔位置
查看>>
实现多项式的JAVA类
查看>>
Getting Started with the G1 Garbage Collector 转发
查看>>
HDU5036 Explosion(期望 bitset)
查看>>
有限自动机的构造和识别
查看>>
初试机器学习
查看>>
DNS的功能-域名空间、域名注册和域名解析
查看>>
Javascript模块化编程(三):require.js的用法(转)
查看>>
Git使用3(Git操作完整版)
查看>>
sql报错注入:extractvalue、updatexml报错原理
查看>>
C# this.Hide()
查看>>
sqlmap的学习之路-自动化测试SQL注入工具
查看>>
Java 内存管理、JVM 工作原理与 Java 运行时系统
查看>>
矩阵分解(matrix factorization)
查看>>