zoukankan      html  css  js  c++  java
  • _bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002

    见一周目记录:http://www.cnblogs.com/ciao-sora/p/6099077.html

    #include <cstdio>
    #include <cmath>
    
    const int maxn = 200005;
    
    int n, m, a[maxn], to[maxn], need[maxn], siz, id, t1, t2, t3, haji;
    
    inline int qry(int pos) {
    	int rt = 0;
    	while (~pos) {
    		rt += need[pos];
    		pos = to[pos];
    	}
    	return rt;
    }
    inline void upd(int pos, int val) {
    	id = pos / siz;
    	haji = id * siz;
    	a[pos] = val;
    	for (int i = pos; i >= haji; --i) {
    		if (i + a[i] >= n) {
    			to[i] = -1;
    			need[i] = 1;
    		}
    		else if (i + a[i] >= (id + 1) * siz) {
    			to[i] = i + a[i];
    			need[i] = 1;
    		}
    		else {
    			to[i] = to[i + a[i]];
    			need[i] = need[i + a[i]] + 1;
    		}
    	}
    }
    
    int main(void) {
    	scanf("%d", &n);
    	siz = (int)sqrt((float)n + 0.5f);
    	for (int i = 0; i < n; ++i) {
    		scanf("%d", a + i);
    	}
    	for (int i = n - 1; ~i; --i) {
    		id = i / siz;
    		if (i + a[i] >= n) {
    			to[i] = -1;
    			need[i] = 1;
    		}
    		else if (i + a[i] >= (id + 1) * siz) {
    			to[i] = i + a[i];
    			need[i] = 1;
    		}
    		else {
    			to[i] = to[i + a[i]];
    			need[i] = need[i + a[i]] + 1;
    		}
    	}
    	scanf("%d", &m);
    	while (m--) {
    		scanf("%d%d", &t1, &t2);
    		if (t1 == 1) {
    			printf("%d
    ", qry(t2));
    		}
    		else {
    			scanf("%d", &t3);
    			upd(t2, t3);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    用 Web 实现一个简易的音频编辑器
    TypeScript教程
    他的独,殇情沉醉
    重新拎一遍js的正则表达式
    网络流
    Xmind最新的安装与破解教程
    adb的端口号5037被占用的解决方法
    使用Fiddler模拟弱网测试教程
    web的前台、后台、前端、后端
    常见面试笔试题
  • 原文地址:https://www.cnblogs.com/ciao-sora/p/6146309.html
Copyright © 2011-2022 走看看