请问这道题能使用线段树+离散化吗?
查看原帖
请问这道题能使用线段树+离散化吗?
205782
R浩轩泽Anmicius楼主2020/8/12 09:15

蒟蒻刚学线段树没两天,也是昨天下午才接触到的离散化的概念,不过到现在还是不能理解在N≤1e7的情况下如何离散化。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using std::cin;
using std::cout;
#define re register int
const int N=5e5+5;
int n,m;
struct Tree{
	int ans;
	int lazy_tag;
}node[N<<2]; 
inline void Add(int k,int l,int r,int num)
{
	node[k].lazy_tag+=num;
	node[k].ans+=(l-r+1)*num;
}
inline void push_down(int k,int l,int r)//懒标记下传 
{
	if(!node[k].lazy_tag||l==r)return;
	int mid=(l+r)>>1;
	Add(k<<1,l,mid,node[k].lazy_tag);
	Add(k<<1|1,mid+1,r,node[k].lazy_tag);
	node[k].lazy_tag=0;
}
void Add_data(int k,int l_now,int r_now,int l,int r)
{
	if(l<=l_now&&r_now<=r)return Add(k,l_now,r_now,1);
	push_down(k,l_now,r_now); 
	int mid=(l_now+r_now)>>1;
	if(l<=mid)Add_data(k<<1,l_now,mid,l,r);
	if(mid<r)Add_data(k<<1|1,mid+1,r_now,l,r);
	node[k].ans=node[k<<1].ans+node[k<<1|1].ans;//维护答案 
}
int ask(int k,int l_now,int r_now,int num)
{
	if(l_now==r_now)return node[k].ans;
	push_down(k,l_now,r_now);
	int mid=(l_now+r_now)>>1;
	if(num<=mid)return ask(k<<1,l_now,mid,num);
	else return ask(k<<1|1,mid+1,r_now,num);
}
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>n>>m;
	memset(node,0,sizeof(node));
	while(m--)
	{
		bool a;
		int b,c;
		cin>>a>>b;
		if(!a)
		{
			cin>>c;
			Add_data(1,1,n,b,c);
		}
		else cout<<ask(1,1,n,b)<<'\n'; 
	}
	return 0;
}

有奆佬帮忙解释下吗?

2020/8/12 09:15
加载中...