【学校考试B】

题目

代码

#include <cstdio>
int n,m,i,x1,y1,x2,y2,t,l,a[500001],b[500001],c[500001],x,d[400001];
long long t1,t2,tot,s,s2,ss,ans[100001];
bool p[400001];
void add(int x,int y,int z)
{
	if (x>y) t=x,x=y,y=t;s+=z;
	++l;a[l]=x;b[l]=(l+1)/2;c[l]=z;
	++l;a[l]=y;b[l]=l/2;c[l]=z;
}
void kp(int l,int r)
{
	int i=l,j=r,m=a[(i+j)/2];
	while (i<=j)
	{
		while (a[i]<m) ++i;
		while (a[j]>m) --j;
		if (i<=j)
		{
			t=a[i];a[i]=a[j];a[j]=t;
			t=b[i];b[i]=b[j];b[j]=t;
			t=c[i];c[i]=c[j];c[j]=t;
			++i;--j;
		}
	}
	if (i<r) kp(i,r);if (l<j) kp(l,j);
}
int main()
{
	scanf("%d%d",&n,&m);s=0;
	for (i=1;i<=n;++i)
	{
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		if (x2>0&&y2>0) add(x2,y2,1);
		if (x1>0&&y2>0) add(x1,y2,-1);
		if (x2>0&&y1>0) add(x2,y1,-1);
		if (x1>0&&y1>0) add(x1,y1,1);
	}
	for (i=1;i<=m;++i)
	{
		scanf("%d",&x);++l;a[l]=x;b[l]=i;c[l]=0;
	}
	kp(1,l);tot=0;s2=0;a[0]=0;
	for (i=1;i<=l;++i)
	{
		t1=a[i-1];t2=a[i];ss=t2*t2-t1*t1;
		tot+=ss*s;ss=(t2-t1)*s2;tot+=ss;
		if (c[i]==0) ans[b[i]]=tot;else
		if (!p[b[i]])
		{
			s2+=a[i]*c[i];s-=c[i];p[b[i]]=true;d[b[i]]=a[i];
		} else s2-=d[b[i]]*c[i];
	}
	for (i=1;i<=m;++i) printf("%lld\n",ans[i]);
}

这道题的正解
我觉得想到几乎不可能
但是就算是想到了
细节也会出错
所以还是骗分吧
30分非常的好骗几乎是送你的
n<=1000的时候非常好骗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值