蒟蒻刚学线段树没两天,也是昨天下午才接触到的离散化的概念,不过到现在还是不能理解在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;
}
有奆佬帮忙解释下吗?