原题链接

题意简述

给出n(n≤3×105)个区间和m(m≤105)。求对于任意k≤m,有多少个区间包含k的倍数。

题解

考虑怎样的区间不包含k的倍数。

对于k的倍数tk和tk+k,满足L,R∈(tk,tk+k)的区间[L,R]不包含任何k的倍数。

于是转化为二维数点问题,可以用可持久化线段树解决。把区间[L,R]视作一个横坐标为L,纵坐标为R的点,则L,R∈(tk,tk+k)等价于点(L,R)在矩形(tk,tk)−(tk+k,tk+k)内部。

时间复杂度O(nlogm+∑mi=1mi×logm)=O(nlogm+mlog2m)。

Code

//Snuke Line
#include <cstdio>
#include <algorithm>
inline char gc()
{
static char now[1<<16],*S,*T;
if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
return *S++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
int const N=3e5+10;
int const M=1e5+10;
int n,m;
struct range{int fr,to;} rg[N];
bool cmpRg(range x,range y) {return x.fr<y.fr;}
int sgCnt,rt[M];
struct seg{int cnt; int L,R;} sg[N*20];
void update(int s) {sg[s].cnt=sg[sg[s].L].cnt+sg[sg[s].R].cnt;}
void ins(int &s,int fr,int to,int x)
{
sg[++sgCnt]=sg[s]; s=sgCnt;
if(fr==to) {sg[s].cnt++; return;}
int mid=fr+to>>1;
if(x<=mid) ins(sg[s].L,fr,mid,x);
else ins(sg[s].R,mid+1,to,x);
update(s);
}
int query(int s1,int s2,int fr,int to,int fr0,int to0)
{
if(fr0<=fr&&to<=to0) return sg[s2].cnt-sg[s1].cnt;
int mid=fr+to>>1; int res=0;
if(fr0<=mid) res+=query(sg[s1].L,sg[s2].L,fr,mid,fr0,to0);
if(mid<to0) res+=query(sg[s1].R,sg[s2].R,mid+1,to,fr0,to0);
return res;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) rg[i].fr=read(),rg[i].to=read();
std::sort(rg+1,rg+n+1,cmpRg);
rt[0]=0; int p=1;
for(int i=1;i<=m;i++)
{
rt[i]=rt[i-1];
while(rg[p].fr==i) ins(rt[i],1,m,rg[p].to),++p;
}
printf("%d\n",n);
for(int d=2;d<=m;d++)
{
int ans=n,i;
for(i=d;i<=m;i+=d) ans-=query(rt[i-d],rt[i-1],1,m,i-d+1,i-1);
if(i-d+1<=m) ans-=query(rt[i-d],rt[m],1,m,i-d+1,m);
printf("%d\n",ans);
}
return 0;
}

注意

空间复杂度为O(nlogm),因为对于每个点(每个区间)都要建一个O(logm)的线段树。

对于有些k最后会有剩余,所以有if(i-d+1<=m) ans-=query(rt[i-d],rt[m],1,m,i-d+1,m);

ARC068E - Snuke Line的更多相关文章

  1. 【arc068E】Snuke Line

    Portal -->arc068E (温馨提示:那啥..因为各种奇怪的我也不知道的原因这题的题号在某度上面显示出来是agc007F...然而下面是arc068E的题解qwq给大家带来不便之处真是 ...

  2. 【AtCoder - 2300】Snuke Line(树状数组)

    BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一 ...

  3. [arc068E]Snuke Line-[树状数组]

    Description 传送门 Solution 假如想直接YY对于每一个d会有多少种商品满足条件,em反正我搞不定. 然后大佬的题解告诉我说:搞不定?那就不搞它啊,反过来不就得了? 好吧.我们来考虑 ...

  4. arc068 E: Snuke Line

    首先要知道 (m/1 + m/2 + ... + m/m) 约为 mlogm 还有一个比较明显的结论,如果一个纪念品区间长度大于d,那么如果列车的停车间隔小于等于d,则这个纪念品一定能被买到 然后把区 ...

  5. AtCoder Regular Contest 068E:Snuke Line

    题目传送门:https://arc068.contest.atcoder.jp/tasks/arc068_c 题目翻译 直线上有\(0-m\)这\(m+1\)个点,一共有\(m\)辆火车.第\(i\) ...

  6. [arc086e]snuke line

    题意: 有n个区间,询问对于$1\leq i\leq m$的每个i,有多少个区间至少包含一个i的倍数? $1\leq N\leq 3\times 10^5$ $1\leq M\leq 10^5$ 题解 ...

  7. NOIp模拟赛三十

    心态崩了的一天 先Orz yrx 开场五分钟yrx大吼一声:“这B题不是原题吗” hjw:“对哦好像我也做过哦” 过了十分钟yrx又大吼一声:“这C题我也做过啊,洪水那题啊” 于是 像我这种傻逼A题一 ...

  8. AtCoder Regular Contest

    一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...

  9. 【AtCoder】ARC068

    ARC 068 C - X: Yet Another Die Game 显然最多的就是一次6一次5 最后剩下的可能需要多用一次6或者6和5都用上 #include <bits/stdc++.h& ...

随机推荐

  1. 【Code clone】Distributed Code Clone Detection Based on Index

    1 摘要  随着软件产业的发展,代码克隆现象越来越常见,随之带来的安全漏洞.可维护性.产权等问题也引起人们重视.代码克隆按照复制程度分为4类:完全复制.修改名称.更换顺序和自实现.现有的代码克隆检测工 ...

  2. 更改Patrol Agent的密码

    大家可以使用P3console去做,具体方法请见:http://wenku.baidu.com/link?url=HbSzxNV2SPrlpk_Bfmcg0CNZuAlyX4jgdp4vbrxmynv ...

  3. BST,AVL,B,B+,B*,红黑树

    BST(右)和AVL(左) 比较:AVL树每个结点的左右子树的深度差的绝对值不大于1 B - tree 特点:所有结点都包含数据信息,不同查询的效率不同,特殊的:二阶B树就是AVL,三阶B树就是2-3 ...

  4. android在一个应用程序员启动另一个程序

    一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动: Intent intent = new Intent(Intent.ACTION_MAIN); int ...

  5. 童攀TP5企业网站实战笔记

    $this->assign('data',$data) ---恢复内容开始--- return view();   载入视图 {include file='public/head'} 包含文件 ...

  6. js调用系统虚拟键盘

    <input type="text" id="tt" /> <script language="javascript" t ...

  7. openvpn的搭建

    openvpn搭建 原创不易,转载请注明 openvpn简介 1.1 openvpn原理 OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现 虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安 ...

  8. python使用上下文管理器实现sqlite3事务机制

    如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类 ...

  9. spring-boot 使用 main函数 无法启动的问题完美 解决方案。

    首先 是启动之后 ,直接回exit code  0,网址 里面输入localhost:8080显示站点未启动.网上查 了多种 方式 ,日志 也 打了,都没发现问题,最后到这篇文章里 找到了答案.但是这 ...

  10. Cypher查询语言--Neo4j-WHERE(三)

    目录 Where Boolean 操作类型 节点属性上的过滤 正则表达式 转义正则表达式 不分大小些正则表达式 关系类型上的过滤 属性存在性 如果缺失属性默认为true 如果缺失属性默认为false ...