Wow! Such Sequence! (线段树) hdu4893

http://acm.hdu.edu.cn/showproblem.php?pid=4893

先贴上一份还没过的代码,不知道拿出错了  1 // by caonima

2 // hehe
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cstdio>
  6 #include <queue>
  7 #include <stack>
  8 #include <vector>
  9 #include <map>
 10 #include <cmath>
 11 #include <set>
 12 #include <iostream>
 13 #include <string>
 14 using namespace std;
 15 #define LL __int64
 16 const int MAX = 1e6+10;
 17 const LL inf = 1LL<<62;
 18 LL sum[MAX<<2],col[MAX<<2],fib_sum[MAX<<2],fib[MAX];
 19 int cur=2;
 20 void init() {
 21     fib[1]=fib[0]=1;
 22     for(int i=2;i<MAX;i++) {
 23         if(fib[i-1]+fib[i-2]>inf) break;
 24         fib[i]=fib[i-1]+fib[i-2];
 25         cur++;
 26     }
 27     return ;
 28 }
 29 void push_up(int o) {
 30     fib_sum[o]=fib_sum[o<<1]+fib_sum[o<<1|1];
 31     sum[o]=sum[o<<1]+sum[o<<1|1];
 32 }
 33 void push_down(int o) {
 34     if(col[o]!=-1) {
 35         col[o<<1]=col[o<<1|1]=col[o];
 36         sum[o<<1]=fib_sum[o<<1];
 37         sum[o<<1|1]=fib_sum[o<<1|1];
 38         col[o]=-1;
 39     }
 40     return;
 41 }
 42 void build(int L,int R,int o) {
 43     if(L==R) {
 44         sum[o]=0;
 45         fib_sum[o]=1; col[o]=-1;
 46         return ;
 47     }
 48     int mid=(L+R)>>1;
 49     build(L,mid,o<<1);
 50     build(mid+1,R,o<<1|1);
 51     push_up(o);
 52 }
 53 void add(int L,int R,int o,int k,int val) {
 54     if(L==R) {
 55         sum[o]+=(LL)val;
 56         int x=(int)(lower_bound(fib,fib+cur,sum[o])-fib);
 57 //        printf("%I64d %I64d\n",fib[x],fib[x-1]);
 58 //        printf("%I64d\n",sum[o]);
 59 
 60         if(x==0) fib_sum[o]=fib[x];
 61         else if((-fib[x]+sum[o])>=(-fib[x-1]+sum[o])) fib_sum[o]=fib[x-1];
 62         else fib_sum[o]=fib[x];
 63        // printf("%I64d\n",fib_sum[o]);
 64         return ;
 65     }
 66     push_down(o);
 67     int mid=(L+R)>>1;
 68     if(k<=mid) add(L,mid,o<<1,k,val);
 69     else add(mid+1,R,o<<1|1,k,val);
 70     push_up(o);
 71 }
 72 
 73 void Update(int L,int R,int o,int ls,int rs) {
 74     if(ls<=L&&rs>=R) {
 75         sum[o]=fib_sum[o];
 76         col[o]=1;
 77         return ;
 78     }
 79     push_down(o);
 80     int mid=(L+R)>>1;
 81     if(ls<=mid) Update(L,mid,o<<1,ls,rs);
 82     if(rs>mid) Update(mid+1,R,o<<1|1,ls,rs);
 83     push_up(o);
 84 }
 85 LL Query(int L,int R,int o,int ls,int rs) {
 86     if(ls<=L&&rs>=R) {
 87         return sum[o];
 88     }
 89     push_down(o);
 90     int mid=(L+R)>>1;
 91     LL res=0;
 92     if(ls<=mid) res+=Query(L,mid,o<<1,ls,rs);
 93     if(rs>mid) res+=Query(mid+1,R,o<<1|1,ls,rs);
 94     return res;
 95 
 96 }
 97 int main() {
 98     int n,m,op,ls,rs;
 99     init();
100     while(scanf("%d %d",&n,&m)==2) {
101         build(1,n,1);
102         for(int i=0;i<m;i++) {
103             scanf("%d %d %d",&op,&ls,&rs);
104             if(op==1) {
105                 add(1,n,1,ls,rs);
106             }
107             else if(op==2) {
108                 printf("%I64d\n",Query(1,n,1,ls,rs));
109             }
110             else {
111                 Update(1,n,1,ls,rs);
112             }
113         }
114     }
115     return 0;

116 }

Wow! Such Sequence! (线段树) hdu4893,布布扣,bubuko.com

时间: 2024-10-24 21:21:25

Wow! Such Sequence! (线段树) hdu4893的相关文章

HDU4893 Wow! Such Sequence! 线段树

题意:给你一个序列,其中有三种操作 1)位置为K 的数+ D 2)求 l-r 区间和 3)把 l-r 区间里面的所有数都变为理它最近的斐波纳契数 解题思路:这个题的区间更新其实可以在单点更新的时候就得出,为节点维护两个 和,一个是 斐波纳契和 一个是正常和 ,再看这个区间有没有被3覆盖,特判一下就行了. 解题代码: 1 // File Name: 1007.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月29日 星期二 12时49分33

HDU4893:Wow! Such Sequence!(线段树lazy)

Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger from St. Beeze College. No, not cactuses. It's a mysterious blackbox. After some research, Doge found that the box is maintaining a sequence an of n nu

hdu 4893 Wow! Such Sequence!(线段树)

题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 修改k的为值增加d 2 l r, 查询l到r的区间和 3 l r, 间l到r区间上的所以数变成最近的斐波那契数,相等的话取向下取. 解题思路:线段树,对于每个节点新增一个bool表示该节点以下的位置是否都是斐波那契数. #include <cstdio> #include <cstring> #include <cstdlib> #include <algor

hdu 4893 (多校1007)Wow! Such Sequence!(线段树&amp;二分&amp;思维)

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 352    Accepted Submission(s): 104 Problem Description Recently, Doge got a funny birthday present from his new friend, Prot

HDOJ 4893 Wow! Such Sequence! 线段树

http://acm.hdu.edu.cn/showproblem.php?pid=4893 题意:10万的区间,初始都为0,10万次操作,三种操作为单点修改,区间将每个数改成最近的斐波那契数,以及区间求和. 分析:用一个flag记录该段是否被改成斐波那契数,同时多维护一个sum1表示如果该段改成斐波那契数,区间和为多少.开始sum1为区间长度,之后在单点做了修改以后对其更新,需要的时候用其覆盖sum. 1 #include<cstdio> 2 #include<cstring>

2014多校3 Wow! Such Sequence!线段树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 这题实在是让人纠结啊--好久不写线段树的题了,因为这几天学伸展树,然后觉得线段树小case了.没想到栽在这题上了.尼玛-- 自己把自己给搞晕了--想复杂了,都不懂得预处理一下,唉--还得怒刷几十道啊!! #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #in

HDU 4893 Wow! Such Sequence 线段树暴力

题意:n个数 初始为0,三个操作:给某个数加上d,查询区间和,把区间[l,r]中每个a[i]变为离a[i]最近的斐波那契数,n,m<=1e5. 无操作1情况下,每个点最多变化一次,每次修改logn,算上操作1 最坏情况下修改n+m次 O((n+m)logn). 对区间设个标记 线段树暴力即可. #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; const int

hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】

题意:一个初始为0的数组,支持三种操作:1.向第k个数添加d,(|d| < 2^31);2.把[l, r]区间内的数字都换成与它最相近的Fibonacci数;3.询问[l, r]区间的和. 思路:初始化Fibonacci数组,longlong 类型内90个就够用了. 线段树区间查询,用lazy标记, sgt[]记录线段树各个节点的区间和, fib_num_sum[]记录与各个叶子节点当前值最接近的Fibonacci数,传递到区间fib_num_sum[]就是区间Fibonacci数的和. 操作1

CF(438D) The Child and Sequence(线段树)

题意:对数列有三种操作: Print operation l,?r. Picks should write down the value of . Modulo operation l,?r,?x. Picks should perform assignment a[i]?=?a[i] mod x for each i (l?≤?i?≤?r). Set operation k,?x. Picks should set the value of a[k] to x (in other words

hdu4893Wow! Such Sequence! (线段树)

Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger from St. Beeze College. No, not cactuses. It's a mysterious blackbox. After some research, Doge found that the box is maintaining a sequence an of n nu