HDU 4893 Wow! Such Sequence! 水线段树
2014-07-29 19:50
288 查看
思路:
线段树走起。。
写完这题就退役T^T
单点更新的时候直接找到这个点的最近fib,然后维护当前和 和 fib的和
线段树走起。。
写完这题就退役T^T
单点更新的时候直接找到这个点的最近fib,然后维护当前和 和 fib的和
#include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> using namespace std; #define L(x) (x<<1) #define R(x) (x<<1|1) #define mod 1000000007 #define N 200000 #define ll long long ll f[100]; inline ll Mid(ll x, ll y){return (x+y)>>1;} ll find(ll x){ ll id = lower_bound(f, f+90, x) - f; if(f[id] == x || id==0)return f[id]; if(f[id] - x >= x - f[id-1]) return f[id-1]; else return f[id]; } struct node{ ll l, r; ll sum, bsum; ll lazy; }tree[N<<2]; void push_down(ll id){ if(tree[id].lazy == 0)return ; tree[id].lazy = 0; if(tree[id].l == tree[id].r) return ; tree[L(id)].sum = tree[L(id)].bsum; tree[R(id)].sum = tree[R(id)].bsum; tree[L(id)].lazy = tree[R(id)].lazy = 1; } void push_up(ll id){ tree[id].sum = tree[L(id)].sum + tree[R(id)].sum; tree[id].bsum = tree[L(id)].bsum + tree[R(id)].bsum; } void build(ll l, ll r, ll id){ tree[id].l = l; tree[id].r = r; tree[id].sum = 0; tree[id].bsum = 0; tree[id].lazy = 0; if(l == r) { tree[id].bsum = find(0); return ; } ll mid = Mid(l, r); build(l, mid, L(id)); build(mid+1, r, R(id)); push_up(id); } ll query(ll l, ll r, ll id){ push_down(id); if(l == tree[id].l && tree[id].r == r) return tree[id].sum; ll mid = Mid(tree[id].l, tree[id].r), ans = 0; if(mid < l) ans = query(l, r, R(id)); else if(r <= mid) ans = query(l, r, L(id)); else ans = query(l, mid, L(id)) + query(mid+1, r, R(id)); push_up(id); return ans; } void updata(ll pos, ll add, ll id){ push_down(id); if(tree[id].l == tree[id].r) { tree[id].sum += add; tree[id].bsum = find(tree[id].sum); return ; } ll mid = Mid(tree[id].l, tree[id].r); if(mid < pos) updata(pos, add, R(id)); else if(pos <= mid) updata(pos, add, L(id)); push_up(id); } void updata2(ll l, ll r, ll id){ push_down(id); if(l == tree[id].l && tree[id].r == r) { tree[id].lazy = 1; tree[id].sum = tree[id].bsum; return ; } ll mid = Mid(tree[id].l, tree[id].r); if(mid < l) updata2(l, r, R(id)); else if(r <= mid) updata2(l, r, L(id)); else { updata2(l, mid, L(id)); updata2(mid+1, r, R(id)); } push_up(id); } ll n, m; int main(){ ll u, v, i, j, op; f[0] = f[1] = 1; for(i = 2; i < 90; i++)f[i] = f[i-1] + f[i-2]; while(cin>>n>>m){ build(1, n, 1); while(m--) { scanf("%I64d %I64d %I64d",&op,&u,&v); if(op==1) updata(u, v, 1); else if(op==2) printf("%I64d\n", query(u, v, 1)); else updata2(u, v, 1); // for(i = 1; i <= n; i++) cout<<query(i, i, 1)<<" "; puts(""); } } return 0; } /* 5 10 2 1 5 3 1 5 2 1 5 1 1 10 2 1 5 3 1 5 2 1 5 4 5 1 1 3 2 1 2 3 2 3 1 2 1 2 1 4 ans: 0 5 15 17 3 */
相关文章推荐
- HDU 4893(Wow! Such Sequence!-线段树单点修改+区间求和+改为最近Fib数)
- HDU 4893 Wow! Such Sequence! (线段树)
- hdu 4893 Wow! Such Sequence! 线段树单点更新+区间更新+区间查询
- 【HDU 4893 多校联合】 Wow! Such Sequence!【线段树】
- HDU 4893 Wow! Such Sequence! 线段树
- ACM 线段树模板 hdu 4893 Wow! Such Sequence!
- HDU 4893 Wow! Such Sequence!【线段树】
- hdu 4893 Wow! Such Sequence! 水线段树。
- HDU 4893 Wow! Such Sequence! (线段树)
- 【HDU】4893 Wow! Such Sequence! 线段树
- HDU 4893 Wow! Such Sequence! 解题报告(线段树)
- hdu 4893 Wow! Such Sequence! 线段树
- 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!
- HDU 4893 Wow! Such Sequence! (线段树)
- hdu 4893 Wow! Such Sequence!
- 【2014 Multi-University Training Contest 3 1007】/【HDU 4893】 Wow! Such Sequence!
- hdu 4893 Wow! Such Sequence!
- HDU 4893 Wow! Such Sequence!
- 【2014 Multi-University Training Contest 3 1007】/【HDU 4893】 Wow! Such Sequence!
- hdu 4893 Wow! Such Sequence! 2014 Multi-University Training Contest 3