题目
代码
#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的时候非常好骗