蒟蒻线段树80分WA#2求条
查看原帖
蒟蒻线段树80分WA#2求条
767259
CYHstudy楼主2025/1/20 13:13
#include<bits/stdc++.h>
using namespace std;

const int N=1e7+10;

typedef long long ll;

struct Op
{
	ll op;
	ll y;
	ll l,r;
	ll id;
	Op() {}
	Op(int op,int y,int l,int r=0,int id=0) : op(op),y(y),l(l),r(r),id(id) {}
	bool operator<(const Op &that) const 
	{
		if(y==that.y) return op<that.op;
		return y<that.y;
	}
}op[N];

struct Node
{
	int sum;
}node[N];

void build(int w,int l,int r)
{
	if(l==r) return ;
	int mid=(l+r)/2;
	int ls=2*w,rs=ls+1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}

void add(int w,int l,int r,int x,int k)
{
	node[w].sum+=k;
	if(l==r) return ;
	int mid=(l+r)/2;
	int ls=2*w,rs=2*w+1;
	if(x<=mid) add(ls,l,mid,x,k);
	else add(rs,mid+1,r,x,k);
}

ll getsum(int w,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr) return node[w].sum;
	ll mid=(l+r)/2,ans=0;
	int ls=2*w,rs=ls+1;
	if(ql<=mid) ans+=getsum(ls,l,mid,ql,qr);
	if(qr>mid) ans+=getsum(rs,mid+1,r,ql,qr);
	return ans;
}

ll n,m,arr[N],mymax;
ll tot,ans[N];

int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&arr[i]);
		mymax=max(mymax,arr[i]);
		op[++tot]=Op(1,arr[i],i);
	}
	for(int i=1;i<=m;i++)
	{
		ll l,r,x;
		scanf("%lld%lld%lld",&l,&r,&x);
		mymax=max(mymax,r);
		op[++tot]=Op(2,x,l,r,i);
	}
	sort(op+1,op+tot+1);
	build(1,1,mymax);
	for(int i=1;i<=tot;i++)
	{
		if(op[i].op==1) add(1,1,mymax,op[i].l,1);
		else ans[op[i].id]=getsum(1,1,mymax,op[i].l,op[i].r);
	}
	for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
	return 0;
}
2025/1/20 13:13
加载中...