zoukankan      html  css  js  c++  java
  • 树线段BZOJ 3211(花神游历各国线段树区间开方)

    每日一贴,今天的内容关键字为树线段

        

        

    3211: 花神游历各国

        Time Limit: 5 Sec  Memory Limit: 128 MB

        Submit: 52  Solved: 24

        [

        Submit

        ][

        Status

        ][

        Discuss

        ]

        

        

    Description

        

    树和线段

        

    Input

        

    树和线段

        

    Output

        

    每次x=1时,每行一个整数,表示这次游览的高兴度

        

    Sample Input

        

    4

    1 100 5 5

    5

    1 1 2

    2 1 2

    1 1 2

    2 2 3

    1 1 4

        

    Sample Output

        


    101

    11

    11

        

    HINT

        

    对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9


        

    Source

        每日一道理
    感叹人生,是因为曾经没有过轰轰烈烈的壮举,觉得渺小,觉得平庸,似乎生活过于简单,简单得让人感觉烦躁。没有大言不惭地说过将来,只是比较现实地握住了现在,我想,这是一条路,每个人所必须踏上的一次旅程,曾经看到过这样一句话:成长的过程漫长却充实,自毁的过程短暂却留下一生痛苦,人生可以说是一次考验,何去何从取决于自我。

    SPOJ2713 数据已增强

    不用犹豫,本题正宗线段树。

    不过线段树不支持区间开方,但是10^9最多开5次方就到1了-_-

    所以暴力改也就MAXN*5 无压力。

    用线段树存储一段是不是须要开方(2-须要,1-不用)+暴力改

    无压力

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    #include<cmath>
    #include<cctype>
    using namespace std;
    #define For(i,n) for(int i=1;i<=n;i++)
    #define Rep(i,n) for(int i=0;i<n;i++)
    #define Fork(i,k,n) for(int i=k;i<=n;i++)
    #define ForD(i,n) for(int i=n;i;i--)
    #define Forp(x) for(int p=pre[x];p;p=next[p])
    #define RepD(i,n) for(int i=n;i>=0;i--)
    #define MAXN (200000+10)
    #define MAXM (400000+10)
    #define Lson (x<<1)
    #define Rson ((x<<1)+1)
    int n,m,a[MAXN*2]={0},b[MAXN*2]={0};
    long long sum[MAXN*2];
    void update(int x)
    {
    	if (b[Lson]==2||b[Rson]==2) b[x]=2;
    	else b[x]=1; 
    	sum[x]=sum[Lson]+sum[Rson];
    }
    void build(int x,int l,int r)
    {
    	if (l==r) 
    	{
    		scanf("%d",&a[x]);sum[x]=a[x];
    		if (a[x]<=1) b[x]=1;
    		else b[x]=2;
    	}		
    	if (l>=r) return;
    	int m=(l+r)>>1;
    	build(Lson,l,m);
    	build(Rson,m+1,r);
    	update(x);
    }
    void pushdown(int x,int l,int r)
    {
    	if (b[x]<=1) return;
    	if (l==r)
    	{
    		a[x]=sum[x]=sqrt(a[x]);
    		if (a[x]<=1) b[x]=1;
    		return;
    	}
    	int m=(l+r)>>1;
    	pushdown(Lson,l,m);
    	if (m<r) pushdown(Rson,m+1,r);
    	update(x);
    }
    void change(int x,int l,int r,int L,int R)
    {
    	if (b[x]<=1) return;
    	int m=(l+r)>>1;
    	if (L<=l&&r<=R)
    	{
    		pushdown(x,l,r);
    		return;
    	}
    	if (L<=m) change(Lson,l,m,L,R);
    	if (m<R) change(Rson,m+1,r,L,R);
    	update(x);	
    }
    long long qur(int x,int l,int r,int L,int R)
    {
    	int m=(l+r)>>1;
    	if (L<=l&&r<=R)
    	{
    		return sum[x];
    	}
    	long long ans=0;
    	if (L<=m) ans+=qur(Lson,l,m,L,R);
    	if (m<R) ans+=qur(Rson,m+1,r,L,R);
    	return ans;	
    }
    
    int main()
    {
    //	freopen("bzoj3211.in","r",stdin);
    //	freopen(".out","w",stdout);
    	scanf("%d",&n);
    	build(1,1,n);
    	scanf("%d",&m);
    	For(i,m)
    	{
    		int x,l,r;
    		scanf("%d%d%d",&x,&l,&r);
    		if (x==1) printf("%lld\n",qur(1,1,n,l,r));
    		else change(1,1,n,l,r);
    	}
    	return 0;
    }


    文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
    如果 C++是一把锤子的话,那么编程就会变成大手指头。
    如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
    一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
    如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

    --------------------------------- 原创文章 By
    树和线段
    ---------------------------------

  • 相关阅读:
    叉积与点积
    Vector3 *2 ,ToString()自动四舍五入
    "无法删除数据库,因为该数据库当前正在使用"问题解决
    感谢信
    实变函数一窥
    北京大学2015年数学分析考研试题
    象棋是门残忍的艺术---续篇
    象棋是门残忍的艺术
    赣南师范学院教师高级专业技术资格评审委员会评审通过人员公示名单
    [再寄小读者之数学篇](2014-12-24 乘积型不等式)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3105062.html
Copyright © 2011-2022 走看看