码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 438D

时间:2014-06-08 15:36:11      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:acm   acm-icpc   线段树   数据结构   codeforces   

在某位不知名的大大推荐下做了这题,和我上一篇的线段树很像,于是怒拍,思想基本相同,记录区间最大值,当最大值小于取模时可以剪枝。
今后再遇到此类问题算是能解决了
// 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;
}

codeforces 438D,布布扣,bubuko.com

codeforces 438D

标签:acm   acm-icpc   线段树   数据结构   codeforces   

原文地址:http://blog.csdn.net/accepthjp/article/details/28868029

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!