ARC068E - Snuke Line
题意简述
给出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的更多相关文章
- 【arc068E】Snuke Line
		Portal -->arc068E (温馨提示:那啥..因为各种奇怪的我也不知道的原因这题的题号在某度上面显示出来是agc007F...然而下面是arc068E的题解qwq给大家带来不便之处真是 ... 
- 【AtCoder - 2300】Snuke Line(树状数组)
		BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一 ... 
- [arc068E]Snuke Line-[树状数组]
		Description 传送门 Solution 假如想直接YY对于每一个d会有多少种商品满足条件,em反正我搞不定. 然后大佬的题解告诉我说:搞不定?那就不搞它啊,反过来不就得了? 好吧.我们来考虑 ... 
- arc068 E: Snuke Line
		首先要知道 (m/1 + m/2 + ... + m/m) 约为 mlogm 还有一个比较明显的结论,如果一个纪念品区间长度大于d,那么如果列车的停车间隔小于等于d,则这个纪念品一定能被买到 然后把区 ... 
- AtCoder Regular Contest 068E:Snuke Line
		题目传送门:https://arc068.contest.atcoder.jp/tasks/arc068_c 题目翻译 直线上有\(0-m\)这\(m+1\)个点,一共有\(m\)辆火车.第\(i\) ... 
- [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$ 题解 ... 
- NOIp模拟赛三十
		心态崩了的一天 先Orz yrx 开场五分钟yrx大吼一声:“这B题不是原题吗” hjw:“对哦好像我也做过哦” 过了十分钟yrx又大吼一声:“这C题我也做过啊,洪水那题啊” 于是 像我这种傻逼A题一 ... 
- AtCoder Regular Contest
		一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ... 
- 【AtCoder】ARC068
		ARC 068 C - X: Yet Another Die Game 显然最多的就是一次6一次5 最后剩下的可能需要多用一次6或者6和5都用上 #include <bits/stdc++.h& ... 
随机推荐
- There were X failed login attempts since the last successful login
			如题,开始玩Linux的人,每次登陆的时候,肯定会遇到这个提示,好担心系统被人攻破,那怎么把这些试探的IP抓出来,并屏蔽呢,今天就记录一下我的做法,供大家参考 其实这个问题已经在系统级别支持解决,目前 ... 
- Linux普通用户修改owner非本人文件为什么成功
			关键字:错误提示:E45 已设定选项’readonly’(请加!强制执行) Linux对文件和目录有很好的权限管理,但今天遇到一个比较诡异的事情,普通用户对文件权限不可写,但可以强制保存该文件,这样就 ... 
- HotSpot 虚拟机的算法实现
- 关于flying框架
			开发10多年了,开发过程中遇到的最大的问题: ①项目的代码越来越多了,越来越复杂了,而客户的需求,你还不得不往里面加入新代码. ②开发了很多项目,每次复用时却只能把代码copy来copy去,然后调试. ... 
- HttpClient方式调用接口的实例
			使用HttpClient的方式调用接口的实例. public class TestHttpClient { public static void main(String[] args) { // 请求 ... 
- IOS 疯狂基础之 页面间跳转
			常用的就两种 一种通过导航,一种直接跳 第一种 直接跳转 思路大致就是new一个目的页面,然后设置下页面跳转动画 中间还可以做点目的页面的数据初始化: ValueInputView *valueVie ... 
- python 编写简单的setup.py
			学习python也已经有一段时间了,发现python作为脚本语言一个很重要的特点就是简单易用,而且拥有巨多的第三方库,几乎方方面面的库都有,无论你处于哪个行业,想做什么工作,几乎都能找到对应的第三方库 ... 
- 如何使用 highlight.js 高亮代码
			highlight 是一款简单易用的 web 代码高亮插件,可以自动检测编程语言并高亮,兼容各种框架,可以说是十分强大了.下面就简单介绍一下如何使用这款插件. 两种使用方式: 1. 手动选择主题,官网 ... 
- Matplotlib快速入门笔记
			我正以Python作为突破口,入门机器学习相关知识.出于机器学习实践过程中的需要,快速了解了一下matplotlib绘图库.下图是我学习过程中整理的一些概念. 本文将以该图为线索梳理相关概念. 简介 ... 
- POJ 2065 SETI [高斯消元同余]
			题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ... 
