板子求条
查看原帖
板子求条
788951
TLE_AK楼主2024/7/29 11:22
#include<bits/stdc++.h>
using namespace std;

namespace acac
{
	unordered_map<int,int>mp;
	int tree[8000010];
	int n,m,sum,tot;
	int lowbit(int x)
	{
		return x&(-x);
	}
	void c(int x,int num)
	{
		for(int i=x;i<=tot;i+=lowbit(i))
		{
			tree[i]+=num;
		}
	} 
	
	int q(int x)
	{
		int ans=0;
		for(int i=x;i;i-=lowbit(i))
		{
			ans+=tree[i];
		}
		return ans;
	}
	
	int ls[8000010],Ans[8000010];
	int cnt=0;
	
	struct node
	{
		int x,y,y2,op;
	}A[8000010];
	
	bool cmp(node a,node b)
	{
		if(a.x==b.x)return a.op<b.op;
		return a.x<b.x;		
	}
	
	int read()
	{
		char ch=getchar();
		int ans=0;
		while(ch<'0'||ch>'9')
		{
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar();
		}
		return ans;
	}
	
	int main()
	{
		n=read(),m=read();
		for(int i=1;i<=n;i++)
		{
			A[i].y=read();
			A[i].x=i;
			A[i].op=0;
			ls[++cnt]=A[i].y;
		}
		sum=n;
		for(int i=1;i<=m;i++)
		{
			A[n+i].x=read(),A[n+m+i].x=read(),A[n+m+i].y2=read();
			A[n+i].y=1;
			A[i+n].x--;
			A[i+n].op=i;
			A[i+n+m].op=i+m;
			A[n+i].y=A[i+m+n].y=A[i+n].y-1;
			A[n+i].y2=A[i+m+n].y2=A[i+n+m].y2;
			sum+=2;
		//	ls[++cnt]=A[i+n].y;
			ls[++cnt]=A[i+n+m].y2;
		//	cout<<i+m+n<<' '<<sum<<endl;
		}
		ls[++cnt]=1;
		sort(ls+1,ls+1+cnt);
		ls[0]=-1;
		for(int i=1;i<=cnt;i++)
		{
			if(ls[i]!=ls[i-1])tot++;
			mp[ls[i]]=tot;
		}
		sort(A+1,A+1+sum,cmp);
		
		for(int i=1;i<=sum;i++)
		{
		//	if(A[i].op==22||A[i].op-m==22)cout<<A[i].op<<' '<<q(mp[A[i].y])<<endl;

			if(!A[i].op)c(mp[A[i].y],1);
			else if(A[i].op<=m)Ans[A[i].op]-=q(mp[A[i].y2]);
			else Ans[A[i].op-m]+=q(mp[A[i].y2]);
		}
		for(int i=1;i<=m;i++)
		{
			cout<<Ans[i]<<'\n';
		}
		return 0;
	}
}

int main()
{
//	freopen("data.in","r",stdin);
	acac::main();
	return 0;
}

从园丁的烦恼搬过来的,不知道为啥一直Tle on #5 (

2024/7/29 11:22
加载中...