zoukankan      html  css  js  c++  java
  • Bzoj2002/洛谷P3203 [HNOI2010]弹飞绵羊(分块)

    题面

    Bzoj

    洛谷

    题解

    大力分块,分块大小$sqrt n$,对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是$sqrt n$的模拟。

    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using std::min; using std::max;
    using std::swap; using std::sort;
    using std::__gcd;
    typedef long long ll;
    
    template<typename T>
    void read(T &x) {
        int flag = 1; x = 0; char ch = getchar();
        while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
    }
    
    const int N = 2e5 + 10, SN = 450, M = 1e5 + 10;
    int n, m, k[N], x, y, siz, out[N], step[N];
    int bel[N], l[SN], r[SN];
    
    void doit (int L, int R) {
    	for(int i = R; i >= L; --i) {
    		int nxt = i + k[i];
    		if(nxt > R) step[i] = 1, out[i] = nxt;
    		else step[i] = step[nxt] + 1, out[i] = out[nxt];
    	}
    }
    
    int main () {
    #ifdef OFFLINE_JUDGE
        freopen("233.in", "r", stdin);
        freopen("233.out", "w", stdout);
    #endif
    	read(n), siz = sqrt(n);
    	for(int i = 1; i <= n; ++i)
    		read(k[i]), bel[i] = (i - 1) / siz + 1;
    	for(int i = 1; i <= bel[n]; ++i) {
    		l[i] = r[i - 1] + 1, r[i] = min(i * siz, n);
    		doit(l[i], r[i]);
    	}
    	read(m); int opt;
    	while(m--) {
    		read(opt), read(x), ++x;
    		if(opt == 1) {
    			int ret = 0;
    			while(x <= n) ret += step[x], x = out[x];
    			printf("%d
    ", ret);
    		} else read(k[x]), doit(l[bel[x]], r[bel[x]]);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    全栈程工程师
    月薪8000的程序员和月薪2万的程序员差别在哪里?
    原型中的访问
    关于 基本类型和复合类型 用== 判断的小问题
    使用原型解决构造函数问题
    前端工程师学习路线 --书籍
    程序员成长之路
    GIT学习(1) Pull和Fetch
    OO面向对象编程:第四单元总结及课程总结
    OO面向对象编程:第三单元总结
  • 原文地址:https://www.cnblogs.com/water-mi/p/10304468.html
Copyright © 2011-2022 走看看