0pts求条悬2关
查看原帖
0pts求条悬2关
941575
Stars_visitor_tyw楼主2025/1/13 19:50

rt,可能写的有些混乱

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int a[N], n, k, tag[4*N], tree[4*N], aa[N];
struct node
{
	int l, r, c, t;
}s[4*N];
void pushup(int cur)
{
	tree[cur]=tree[cur*2]+tree[cur*2+1];
}
void addtag(int cur, int lt, int rt, int val)
{
	tree[cur]+=(rt-lt+1)*val;
	tag[cur]+=val;
}
void pushdown(int cur, int lt, int rt)
{
	if(!tag[cur])return ;
	int mid=(lt+rt)>>1;
	addtag(cur*2,lt,mid,tag[cur]);
	addtag(cur*2+1,mid+1,rt,tag[cur]);
	tag[cur]=0;
	return ;
}
void build(int cur, int lt, int rt)
{
	if(lt==rt)
	{
		tree[cur]=a[lt];
		return ;
	}
	int mid=(lt+rt)>>1;
	build(cur*2,lt,mid);
	build(cur*2+1,mid+1,rt);
	pushup(cur);
}
int query(int cur, int lt, int rt, int qx, int qy)
{
	if(qy<lt||qx>rt)
	{
		return 0;
	}
	if(lt>=qx&&rt<=qy)
	{
		return tree[cur];
	}
	pushdown(cur,lt,rt);
	int mid=(lt+rt)>>1;
	return query(cur*2,lt,mid,qx,qy)+query(cur*2+1,mid+1,rt,qx,qy);
}
void update(int cur, int lt, int rt, int qx, int qy, int val)
{
	if(qy<lt||qx>rt)
	{
		return ;
	}
	if(lt>=qx&&rt<=qy)
	{
		addtag(cur,lt,rt,val);
		return ;
	}
	pushdown(cur,lt,rt);
	int mid=(lt+rt)>>1;
	update(cur*2,lt,mid,qx,qy,val);
	update(cur*2+1,mid+1,rt,qx,qy,val);
	pushup(cur);
}
bool cmp(node x, node y)
{
	return x.r<y.r;
}
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(tree,0,sizeof tree);
		memset(tag,0,sizeof tag);
		memset(aa,0,sizeof aa);
		cin>>n>>k;
		for(int i=1;i<=n;i++){cin>>a[i];aa[i]=a[i];}
        sort(a+1,a+1+n);
		build(1,1,n);
		for(int i=1;i<=k;i++) 
		{
			cin>>s[i].l>>s[i].r>>s[i].t;
			s[i].l=lower_bound(a+1,a+n+1,s[i].l)-a;
			s[i].r=upper_bound(a+1,a+n+1,s[i].r)-a-1;
			if(s[i].r==0)k--, i--;
		}
		sort(s+1,s+1+k,cmp);
		for(int i=1;i<=k;i++)
		{
			int l=s[i].l,r=s[i].r;
			if(query(1,1,n,l,r)>=s[i].t)
			{
				continue;
			}
			if(r-l+1==s[i].t)
			{
				update(1,1,n,l,r,1);
				continue;
			}
			int lt=l, rt=r-1;
			while(lt<rt)
			{
				int mid=(lt+rt)>>1;
				int x=query(1,1,n,l,mid);
				if(x+r-mid>s[i].t)
				{
					lt=mid+1;
				}
				else rt=mid;
			}
			update(1,1,n,lt+1,r,1);
		}
		cout<<n-query(1,1,n,1,n)<<"\n";
	}
	
}
2025/1/13 19:50
加载中...