zoukankan      html  css  js  c++  java
  • codeforces 438D

    在大大推荐下这个标题不明的人做。而我的最后一个非常喜欢的段树,因此,愤怒出手。认为基本上相同。大值,当最大值小于取模时能够剪枝。
    今后再遇到此类问题算是能攻克了
    // file name: d.cpp                               //
    // author: huangjipeng                               //
    // creat time: 2014年05月26日 星期一 16时40分18秒    //
    ///////////////////////////////////////////////////////
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MAXN 100005
    struct node
    {
    	int l,r;
    	int mid;
    	long long maxx;
    	long long sum;
    }tree[MAXN<<2];
    void build(int l,int r,int now)
    {
    	tree[now].l=l;
    	tree[now].r=r;
    	tree[now].mid=(l+r)>>1;
    	if(l==r)
    	{
    		scanf("%I64d",&tree[now].maxx);
    		tree[now].sum=tree[now].maxx;
    		return ;
    	}
    	build(l,tree[now].mid,now<<1);
    	build(tree[now].mid+1,r,now<<1|1);
    	tree[now].sum=(tree[now<<1].sum+tree[now<<1|1].sum);
    	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
    }
    long long query(int l,int r,int now)
    {
    	if(tree[now].l==l && tree[now].r==r)
    		return tree[now].sum;
    	if(l>tree[now].mid)
    		return query(l,r,now<<1|1);
    	else if(r<=tree[now].mid)
    		return query(l,r,now<<1);
    	else
    		return query(l,tree[now].mid,now<<1)+query(tree[now].mid+1,r,now<<1|1);
    }
    void update(int l,int r,long long x,int now)
    {
    	if(tree[now].maxx<x)
    		return ;
    	if(tree[now].l==tree[now].r)
    	{
    		tree[now].sum=tree[now].sum%x;
    		tree[now].maxx=tree[now].sum;
    		return ;
    	}
    	if(l>tree[now].mid)
    		update(l,r,x,now<<1|1);
    	else if(r<=tree[now].mid)
    		update(l,r,x,now<<1);
    	else
    	{
    		update(l,tree[now].mid,x,now<<1);
    		update(tree[now].mid+1,r,x,now<<1|1);
    	}
    	tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
    	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
    }
    void op3(int k,long long x,int now)
    {
    	if(tree[now].l==k && tree[now].r==k)
    	{
    		tree[now].maxx=tree[now].sum=x;
    		return ;
    	}
    	if(k>tree[now].mid)
    		op3(k,x,now<<1|1);
    	else
    		op3(k,x,now<<1);
    	tree[now].sum=(tree[now<<1].sum+tree[now<<1|1].sum);
    	tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx);
    }
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	build(1,n,1);
    	while(m--)
    	{
    		int op;
    		scanf("%d",&op);
    		if(op==1)
    		{
    			int l,r;
    			scanf("%d%d",&l,&r);
    			cout<<query(l,r,1)<<endl;
    		}
    		else if(op==2)
    		{
    			int l,r;
    			long long x;
    			scanf("%d%d%I64d",&l,&r,&x);
    			update(l,r,x,1);
    		}
    		else if(op==3)
    		{
    			int k;
    			long long x;
    			scanf("%d%I64d",&k,&x);
    			op3(k,x,1);
    		}
    	}
        return 0;
    }
    

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    云中树莓派(5):利用 AWS IoT Greengrass 进行 IoT 边缘计算
    乐观锁 与 悲观锁 来解决数据库并发问题
    Python二维数组构造
    一次问题追查----短字符串签名算法引发的bug
    C++ assert 断言使用
    并查集(Union-Find)算法
    linux shell grep/awk/sed 匹配tab
    C++ 变量默认初始值不确定(代码测试)
    linux 查看机器内存方法 (free命令)
    html table奇偶行颜色设置 (CSS选择器)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4815538.html
Copyright © 2011-2022 走看看