Codeforces Round #250 (Div. 1) D. The Child and Sequence (线段树)
2016-04-10 12:18
525 查看
题目链接:http://codeforces.com/problemset/problem/438/D
给你n个数,m个操作,1操作是查询l到r之间的和,2操作是将l到r之间大于等于x的数xor于x,3操作是将下标为k的数变为x。
注意成段更新的时候,遇到一个区间的最大值还小于x的话就停止更新。
给你n个数,m个操作,1操作是查询l到r之间的和,2操作是将l到r之间大于等于x的数xor于x,3操作是将下标为k的数变为x。
注意成段更新的时候,遇到一个区间的最大值还小于x的话就停止更新。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef __int64 LL; const int MAXN = 1e5 + 5; struct segtree { int l , r; LL sum , Min; }T[MAXN << 2]; LL res; void init(int p , int l , int r) { int mid = (l + r) >> 1; T[p].l = l , T[p].r = r; if(l == r) { scanf("%I64d" , &T[p].sum); T[p].Min = T[p].sum; return ; } init(p << 1 , l , mid); init((p << 1)|1 , mid + 1 , r); T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum; T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min); } void updata(int p , int l , int r , LL x) { int mid = (T[p].l + T[p].r) >> 1; if(T[p].Min < x) { return ; } if(T[p].l == T[p].r) { T[p].Min %= x; T[p].sum %= x; return ; } if(r <= mid) { updata(p << 1 , l , r , x); } else if(l > mid) { updata((p << 1)|1 , l , r , x); } else { updata(p << 1 , l , mid , x); updata((p << 1)|1 , mid + 1 , r , x); } T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum; T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min); } void updata2(int p , int index , LL x) { int mid = (T[p].l + T[p].r) >> 1; if(T[p].l == T[p].r && T[p].l == index) { T[p].sum = T[p].Min = x; return ; } if(index <= mid) { updata2(p << 1 , index , x); } else { updata2((p << 1)|1 , index , x); } T[p].sum = T[p << 1].sum + T[(p << 1)|1].sum; T[p].Min = (T[p << 1].Min > T[(p << 1)|1].Min ? T[p << 1].Min : T[(p << 1)|1].Min); } void query(int p , int l , int r) { int mid = (T[p].l + T[p].r) >> 1; if(l == T[p].l && T[p].r == r) { res += (LL)T[p].sum; return ; } if(r <= mid) { query(p << 1 , l , r); } else if(l > mid) { query((p << 1)|1 , l , r); } else { query(p << 1 , l , mid); query((p << 1)|1 , mid + 1 , r); } } int main() { int n , m , l , r , c; LL x; scanf("%d %d" , &n , &m); init(1 , 1 , n); while(m--) { scanf("%d" , &c); if(c == 1) { scanf("%d %d" , &l , &r); res = 0; query(1 , l , r); printf("%I64d\n" , res); } else if(c == 2) { scanf("%d %d %I64d" , &l , &r , &x); updata(1 , l , r , x); //cout << query(1 , 4 , 4) << endl; } else { scanf("%d %I64d" , &l , &x); updata2(1 , l , x); } } }
相关文章推荐
- 关于easyuidatagrid获取datagrid的选择数据
- UIViewController的生命周期及iOS程序执行顺序
- angular ui $modal 使用 option
- Android模仿发说说 完美版 无bug 可以本地获取相机,相册 删除,点击进入滑动 ui更新
- android实现miui指示器的效果
- HDU 4848 Wow! Such Conquering!
- 【iOS】UISearchBar修改右边取消按钮的方法
- UI- 基础控件零散知识点回归
- oc新手学习细节之(UIView)动画总结
- 【UE4学习】05——Vive的环境搭建
- LeetCode Question Difficulty Distribution
- 设置UITableView的cell能否被选中
- 003--队列queue
- 2013山东省第四届ACM省赛 Rescue The Princess
- ReflectionToStringBuilder使用
- 我的第一个FluentNHibernate例子
- checkbox已设置为checked--true-但不勾选问题解决方法(只第一次勾选有效)
- UI-定时器与动画使用总结
- 107.Range Sum Query - Immutable
- WPF 绑定中的TargetNullValue