YY模拟:跳蚤(分块)

22人阅读 评论(0) 收藏 举报
分类:

题意:
维护以下三个操作:
1. 在位置x 放置一只每次向右(坐标增大方向)跳t 格的跳蚤。
2. 命令所有跳蚤向右跳跃一次,跳跃的距离为各自的t
3. 给定区间[l;r],求该区间内跳蚤的个数。
Q1e5,1x,ti1e5,1liri1e5

题解:
注意到li,ri有限制,于是可以对t分块,小的用线段树维护,大的单独维护。时间复杂度O(nnlogn)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long LL;
typedef pair <int,int> pii;
typedef tree <pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> Set;

const int RLEN=1<<18|1;
inline char nc() {
    static char ibuf[RLEN],*ib,*ob;
    (ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    return (ib==ob) ? -1 : *ib++; 
}
inline int rd() {
    char ch=nc(); int i=0,f=1;
    while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}
    while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
    return i*f;
}
inline void W(int x) {
    static int buf[50];
    if(!x) {putchar('0'); return;}
    if(x<0) {putchar('-'); x=-x;}
    while(x) {buf[++buf[0]]=x%10; x/=10;}
    while(buf[0]) {putchar(buf[buf[0]--]+'0');}
}
const int N=1e5+50, B=200, INF=0x3f3f3f3f;

int n;
LL tag[B]; list <pii> ls;
struct MySet {
    unordered_map <LL,int> mp;
    Set S;
    inline void insert(LL v) {
        int t=++mp[v];
        S.insert(make_pair(v,t));
    }
    inline void erase(LL v) {
        int t=mp[v]--;
        S.erase(S.find(pii(v,t)));
    }
    inline int ask(LL v) {
        return S.order_of_key(pii(v,INF));
    }
} s[B],s2;

int main() {
    n=rd();
    for(int i=1;i<=n;i++) {
        int op=rd();
        if(op==1) {
            int x=rd(), y=rd();
            if(y>=B) {
                if(x>N) continue;
                s2.insert(x); 
                ls.insert(ls.end(),pii(x,y));
            } else {
                s[y].insert(x-tag[y]);
            }
        } else if(op==2) {
            for(int j=1;j<B;j++) tag[j]+=j;
            for(list <pii> ::iterator it=ls.begin();it!=ls.end();) {
                list <pii> ::iterator now=it++;
                s2.erase(now->first);
                if(now->first+now->second>N) ls.erase(now);
                else now->first+=now->second, s2.insert(now->first);
            }
        } else {
            int l=rd(), r=rd(), ans=0;
            for(int j=1;j<B;j++) ans+=s[j].ask(r-tag[j])-s[j].ask(l-1-tag[j]);
            ans+=s2.ask(r)-s2.ask(l-1);
            W(ans); putchar('\n');
        }
    }
} 
查看评论

[莫比乌斯反演+分块求和] BZOJ2820: YY的GCD

题意给定N, M,求1
  • CHHNZ
  • CHHNZ
  • 2017-07-02 17:15:46
  • 604

【莫比乌斯函数+除法分块】BZOJ2820[YY的GCD]题解

题目概述求 (i,j)∈P,1≤i≤n,1≤j≤m(i,j)\in P,1\le i\le n,1\le j\le m ( PP 是素数集)的 i,ji,j 的个数。解题报告按照BZOJ2301的方法...
  • zzkksunboy
  • zzkksunboy
  • 2017-12-20 20:06:29
  • 109

Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M...
  • sinat_34550050
  • sinat_34550050
  • 2017-03-06 11:29:54
  • 375

【bzoj2820】YY的GCD 线性筛法+莫比乌斯反演+数论分块

枚举每个质数,然后暴力算,TLE 换一种思路,改变枚举顺序#include #include #include #include #include #include #define maxn 1000...
  • u012288458
  • u012288458
  • 2016-03-30 19:10:00
  • 549

YY模拟器

  • 2013年06月09日 13:38
  • 612KB
  • 下载

bzoj 2820-莫比乌斯函数反演+分块优化 +换元优化

BZOJ2820 YGY的GCD •题目大意:求有多少数对(x,y)(1满足gcd(x,y)为质数 T = 10000 N, M 参考popoqqqPPT: 首先,根据http:...
  • viphong
  • viphong
  • 2016-09-06 20:42:29
  • 482

poj 1091 跳蚤 (数论,容斥原理)

题意: 一只小跳蚤想要迟到它左边的食物,但是跳蚤只能按照某张牌上的数字进行往左或者往右的跳跃。牌中数字有N+1个,并且最后一个一定是M,其他的不比M大。问在所有的组合M^N中有多少张牌是可以让跳蚤迟...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015-03-24 15:29:50
  • 901

跳蚤算法:快速跳蚤算法

跳蚤算法:快速跳蚤算法在原理当中讲了跳蚤算法的原型,用来获得x个0 to n范围内的不重复随机数。 初始化 For i=0 to n a(i)=i Next 乱序 For i=0 to n...
  • KiteGirl
  • KiteGirl
  • 2007-06-26 04:24:00
  • 2547

BZOJ 4310: 跳蚤

(我当然不是因为标题才点进这道题的啦(打死不承认))  最大字典序的串最小,听起来就很像二分嘛 于是我们考虑一共m个本质不同的子串,从这里面二分就好了 首先我们需要求第k大(小?)(即二...
  • nlj1999
  • nlj1999
  • 2016-06-17 18:41:25
  • 727
    个人资料
    持之以恒
    等级:
    访问量: 6万+
    积分: 4607
    排名: 8019
    友情链接
    文章分类