花神游历各国 bzoj3211 线段树
来源:互联网 发布:网站建设方案书 阿里云 编辑:程序博客网 时间:2024/06/10 09:00
Description
有一个n个数的序列A,请写一个程序完成下列操作:
1 l r表示查询l到r的和
2 l r表示把每个a[x] (l<=x<=r)变为sqrt(x)
n<=100000,m<=100000
Solution
其实我是偶然看过幂伟的题解的(滑稽
两种做法。如果是树状数组的话用链表或者并查集记录一下每个数字下一个不是1的数字的位置,这样子均摊就是接近O(1)的了
线段树呢记录一下当前区间是否全部为1,然后这样即使日到底也不惧了。实测线段树会慢一点,但是好写啊
权限题啊,什么时候我也能有bzoj的权限号呢?
Code
#include <stdio.h>#include <math.h>#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define ll long long#define N 100001struct treeNode{int l, r; ll sum; int c;}t[N * 4 + 1];inline ll read(){ char ch = getchar(); ll x = 0; while (ch < '0' || ch > '9'){ ch = getchar(); } while (ch <= '9' && ch >= '0'){ x = (x << 1) + (x << 3) + ch - '0'; ch = getchar(); } return x;}inline ll query(int now, int l, int r){ int mid = (t[now].l + t[now].r) >> 1; if (t[now].l == l && t[now].r == r){ return t[now].sum; }else if (r <= mid){ return query(now << 1, l, r); }else if (l > mid){ return query(now << 1 | 1, l, r); }else{ return query(now << 1, l, mid) + query(now << 1 | 1, mid + 1, r); }}inline void modify(int now, int l, int r){ int mid = (t[now].l + t[now].r) >> 1; if (t[now].l == l && t[now].r == r){ if (t[now].c == 1){ return; }else if (l == r){ t[now].sum = sqrt(t[now].sum); t[now].c = t[now].sum == 1; }else{ modify(now << 1, l, mid); modify(now << 1 | 1, mid + 1, r); t[now].sum = t[now << 1].sum + t[now << 1 | 1].sum; t[now].c = t[now << 1].c & t[now << 1 | 1].c; } return; } if (r <= mid){ modify(now << 1, l, r); }else if (l > mid){ modify(now << 1 | 1, l, r); }else{ modify(now << 1, l, mid); modify(now << 1 | 1, mid + 1, r); } t[now].sum = t[now << 1].sum + t[now << 1 | 1].sum; t[now].c = t[now << 1].c & t[now << 1 | 1].c;}inline void build(int now, int l, int r){ int mid = (l + r) >> 1; t[now] = (treeNode){l, r, 0, 0}; if (l == r){ t[now].sum = read(); t[now].c = t[now].sum == 1; return; } build(now << 1, l, mid); build(now << 1 | 1, mid + 1, r); t[now].sum = t[now << 1].sum + t[now << 1 | 1].sum; t[now].c = t[now << 1].c & t[now << 1 | 1].c;}int main(void){ int n = read(); build(1, 1, n); int T = read(); while (T --){ int opt = read(), l = read(), r = read(); if (opt == 1){ printf("%lld\n", query(1, l, r)); }else if (opt == 2){ modify(1, l, r); } } return 0;}
1 0
- bzoj3211.花神游历各国(线段树)
- 花神游历各国 bzoj3211 线段树
- bzoj3211 花神游历各国 线段树
- [bzoj3211]花神游历各国 线段树
- bzoj3211 花神游历各国(线段树)
- bzoj3211花神游历各国 线段树
- BZOJ3211[花神游历各国]--线段树
- 【bzoj3211】【花神游历各国】【线段树+并查集】
- bzoj3211 花神游历各国 ( 线段树 )
- [BZOJ3211]花神游历各国(线段树)
- [BZOJ3211]花神游历各国 势能线段树
- BZOJ3211 花神游历各国 线段树+并查集
- BZOJ3211 花神游历各国(线段树,区间开根号)
- 【bzoj3211】花神游历各国
- 【BZOJ3211】花神游历各国
- 【bzoj3211】花神游历各国
- BZOJ3211花神游历各国
- [BZOJ3211]花神游历各国
- POJ1269 Intersecting Lines
- java.lang.NoClassDefFoundError: org/apache/commons/collections4/ListValuedMap
- 查询一个消息队列的状态,OSQQuery()
- 文档总结:linux中设备的访问
- HTML的第二天_HTML element
- 花神游历各国 bzoj3211 线段树
- iOS与Android对比学习之description方法
- ACM刷题之ZOJ————Ace of Aces
- 笔试技巧 java数据输入
- tensorflow42《TensorFlow实战》笔记-09-01 TensorBoard code
- bzoj 4814 [Cqoi2017]小Q的草稿
- LoadingBar
- nodejs模块之fs模块
- 动态规划-最大子矩阵