[BZOJ 3211] 花神游历各国
2016-03-14 16:36
363 查看
每次把一段区间变成根号。
查询一段区间的和
Po姐的题解QAQ
查询一段区间的和
Po姐的题解QAQ
#include #include #include #include #include #define maxn 100010 using namespace std; int n; typedef long long ll; void read(int &num){ num = 0;char ch = getchar(); for(; ch < '!'; ch = getchar()); for(; ch > '!'; ch = getchar()) num = (num << 3) + (num << 1) + (ch ^ 48); } int a[maxn], fa[maxn]; int getfa(int x){ if(x == fa[x] || fa[x] == 0) return fa[x] = x; return fa[x] = getfa(fa[x]); } ll t[maxn]; #define lowbit(i) i & ((~i) + 1) void update(int pos, int val){ for(int i = pos; i <= n; i += lowbit(i)) t[i] += val; } ll ask(int pos){ if(pos == 0)return 0; ll ret = 0; for(int i = pos; i; i -= lowbit(i)) ret += t[i]; return ret; } void Modify(int l, int r){ for(int i = l; i <= r; i = getfa(i + 1)){ int New = sqrt(a[i]); update(i, New - a[i]); a[i] = New; if(a[i] <= 1) fa[i] = getfa(i + 1); } } int main(){ read(n); for(int i = 1; i <= n; i ++){ read(a[i]); if(a[i] <= 1) fa[i] = i + 1; update(i, a[i]); } int m; read(m); int x, l, r; for(int i = 1; i <= m; i ++){ read(x), read(l), read(r); if(x == 1)printf("%lld\n", ask(r) - ask(l - 1)); else Modify(l, r); } return 0; }
相关文章推荐
- 设计模式总结
- 死锁、活锁、优先级翻转
- RecyclerView下拉刷新和加载更多
- iOS单元测试
- libcurl的使用
- CodeForces 622C Not Equal on a Segment
- 百度糯米产品分析
- Android 如何进行js交互
- ios 中NULL,nil, Nil, NSNull的区别
- SSL和HTTPS的设置
- Hibernat org.hibernate.MappingException: Could not determine type for: java.util.Set
- Android 中 onTouch 和OnClick 冲突的处理(onTouchEvent返回true时与onclick冲突)
- 算法题3 寻找丑数&amp;数值逼近
- 算法题4 斐波那契数列
- 算法题5 二进制中1的个数
- 算法题6 最大数对差值
- 算法题7 判断扑克牌中的顺子
- 算法题8 动态规划之字符串相似度
- 算法题9 动态规划之最长公共子序列&amp;最长公共子串
- 算法题10 最长等差序列问题