//1.AC:return cmul(sub(c,a),sub(b,a));
// WA:return cmul(sub(b,a),sub(c,a));
//2.AC:sum[k]=sum[ls[k]]+sum[rs[k]]+c[k];
// WA:sum[k]=sum[ls[k]]+sum[rs[k]];
#include<algorithm>
#include<iostream>
#include<cstdio>
#define N 2005
using namespace std;
struct point{int x,y,id,c;}p[N];
int n,m,x,y,q,root,size,ans,tmp,f[N][N],mark[N],b[N],ls[N],rs[N],rnd[N],num[N],sum[N],c[N];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline int sqr(int x){return x*x;}
inline int dis(point a,point b){return sqr(a.x-b.x)+sqr(a.y-b.y);}
inline point sub(point a,point b){return (point){a.x-b.x,a.y-b.y,0,0};}
inline int cmul(point a,point b){return a.x*b.y-b.x*a.y;}
inline int turn(point a,point b,point c){return cmul(sub(c,a),sub(b,a));}
inline bool cmp(point a,point b){return turn(p[0],a,b)==0?dis(p[0],a)<dis(p[0],b):turn(a,p[0],b)>0;}
void update(int k){sum[k]=sum[ls[k]]+sum[rs[k]]+c[k];}
void lturn(int &k){int t=rs[k];rs[k]=ls[t];ls[t]=k;sum[t]=sum[k];update(k);k=t;}
void rturn(int &k){int t=ls[k];ls[k]=rs[t];rs[t]=k;sum[t]=sum[k];update(k);k=t;}
void insert(int &k,int id){
if(!k){
k=++size;
ls[k]=rs[k]=0;rnd[k]=rand();
num[k]=id;sum[k]=c[k]=p[id].c;
return;
}
sum[k]+=p[id].c;
if(turn(p[x],p[num[k]],p[id])>0){
insert(ls[k],id);
if(rnd[ls[k]]<rnd[k])rturn(k);
}
else{
insert(rs[k],id);
tmp+=sum[ls[k]]+c[k];
if(rnd[rs[k]]<rnd[k])lturn(k);
}
}
void pre(){
sort(p+1,p+n+m+1,cmp);
for(int i=1;i<=n+m;i++)
mark[p[i].id]=i;
for(x=1;x<n+m;x++){
root=size=0;
for(y=x+1;y<=n+m;y++){
tmp=0;
insert(root,y);
f[x][y]=f[y][x]=tmp;
}
}
}
void getans(){
int e=read();
for(int i=1;i<=e;i++)
b[i]=mark[read()];
b[e+1]=b[1];ans=0;
for(int i=1;i<=e;i++)
if(turn(p[0],p[b[i]],p[b[i+1]])>0)
ans+=f[b[i]][b[i+1]];
else ans-=f[b[i]][b[i+1]];
if(ans<0)ans=-ans;
printf("%d\n",ans);
}
int main(){
n=read();m=read();
p[0].x=-20000;p[0].y=-20000;
for(int i=1;i<=n;i++)
p[i]=(point){read(),read(),i,0};
for(int i=n+1;i<=n+m;i++)
p[i]=(point){read(),read(),i,read()};
pre();
q=read();
for(int i=1;i<=q;i++)
getans();
return 0;
}
2391: Cirno的忧郁
最新推荐文章于 2020-01-09 10:46:03 发布