• poj 3468 A Simple Problem with Integers


    线段树成段更新。成段求和

    開始没有注意到更新的值能够是负数。结果吧标记初始化为-1。wa到死

    #include<iostream>
    #include<cstdio>
    #define maxn 111111
    #define ll long long 
    using namespace std;
    ll num[maxn];
    int n,m;
    string cmd;
    int a,b,k; 
    struct stu
    {
    	int l,r,m;
    	ll sum,flag;
    	ll len()
    	{
    		return r-l+1;
    	}
    };
    stu mapp[maxn*4];
    void pushdown(int count)
    {
    	if(mapp[count].flag!=0)
    	{
    		mapp[count*2].flag+=mapp[count].flag;
    		mapp[count*2+1].flag+=mapp[count].flag;
    		mapp[count*2].sum+=mapp[count].flag*mapp[count*2].len();
    		mapp[count*2+1].sum+=mapp[count].flag*mapp[count*2+1].len();
    		mapp[count].flag=0;
    	}
    }
    void build(int l,int r,int count)
    {
    	mapp[count].l=l;
    	mapp[count].r=r;
    	mapp[count].m=(l+r)/2;
    	mapp[count].flag=0;
    	if(l==r)
    	{
    		mapp[count].sum=num[l];
    		return;
    	}
    	build(l,(l+r)/2,count*2);
    	build((l+r)/2+1,r,count*2+1);
    	mapp[count].sum=mapp[count*2].sum+mapp[count*2+1].sum;
    }
    void updata(int l,int r,int count)
    {
    	if(mapp[count].l==l&&mapp[count].r==r)
    	{
    		mapp[count].flag+=k;
    		mapp[count].sum+=mapp[count].len()*k;
    		return;
    	}
    	pushdown(count);
    	if(r<=mapp[count].m) updata(l,r,count*2);
    	else if(l>=mapp[count].m+1) updata(l,r,count*2+1); 
    	else
    	{
    		updata(l,mapp[count].m,count*2);
    		updata(mapp[count].m+1,r,count*2+1);
    	}
    	mapp[count].sum=mapp[count*2].sum+mapp[count*2+1].sum;
    	//cout<<mapp[count].l<<"~"<<mapp[count].r<<"~"<<mapp[count].sum<<endl; 
    }
    long long que(int l,int r,int count)
    {
    	if(mapp[count].l==l&&mapp[count].r==r) return mapp[count].sum;
    	pushdown(count);
    	if(r<=mapp[count].m) return que(l,r,count*2);
    	else if(l>=mapp[count].m+1) return que(l,r,count*2+1); 
    	else
    	{
    		return que(l,mapp[count].m,count*2)+que(mapp[count].m+1,r,count*2+1);
    	}
    	//cout<<mapp[count].l<<"~"<<mapp[count].r<<"~"<<mapp[count].sum<<endl; 
    }
    int main()
    {
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%I64d",&num[i]);
    		}
    		build(1,n,1);
    		for(int i=0;i<m;i++)
    		{
    			cin>>cmd;
    			if(cmd=="Q")
    			{
    				scanf("%d%d",&a,&b);
    				printf("%I64d
    ",que(a,b,1));
    			}
    			else
    			{
    				scanf("%d%d%d",&a,&b,&k);
    				updata(a,b,1);
    			}
    		}
    	}
    	return 0;
    } 


  • 相关阅读:
    cocoapods 命令
    开发常用
    ios 定位
    LoadingView
    自定义cell右侧 多按钮
    cocoaPods
    AFNetWorking
    iphone自定义铃声
    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错(引用他人的)
    理解c语言中的指针
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7290624.html
Copyright © 2020-2023  润新知