题解:P3442 [POI2006] NAJ-The Invasion
huangjinxiu · · 题解
代码如下(马蜂有点抽象
#include<bits/stdc++.h>
#define ld int
#define pdd pair<ld,ld>
#define pii pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define cmax(a,b) ((a)=max((a),(b)))
using namespace std;
namespace IO{
const int maxn=(1<<20);char *p1,*p2,buf[maxn];
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)?EOF:*p1++)
int read(){
int f=1,k=0;char c;
while(!isdigit(c=gc()))if(c=='-')f=-1;
while(isdigit(c))k=k*10+c-48,c=gc();
return f*k;
}
void write(int k,char c){
if(k<0){putchar('-');k=-k;}
char st[21];int top=0;
do{st[++top]=(k%10)|48,k/=10;}while(k);
while(top)putchar(st[top--]);
putchar(c);
}
}using namespace IO;
const int N=605,M=1e4+10;
int f[N][N],corner[N],x,y,z,n,m,sum,ans=-0x3f3f3f3f;
pdd P[N],center;map<pdd,int> mp;
struct V{pdd pos;int val;}v[M];
inline int Cross(pdd x,pdd y){
return (x.fi-center.fi)*(y.se-center.se)-(x.se-center.se)*(y.fi-center.fi);
}
inline bool cmp(V x,V y){return Cross(x.pos,y.pos)<0;}//y位于x的顺时针方向
inline int nxt(int x){return x==n?1:x+1;}
void pre_solve(int id){
center=P[id];
int val=0,l=1;
sort(v+1,v+1+m,cmp);
for(int j=nxt(id);j!=id;j=nxt(j)){
while(l<=m&&Cross(P[j],v[l].pos)>0)val+=v[l++].val;//v[l].pos位于P[j]的逆时针方向
f[id][j]=val;
}
}
int solve(){
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
for(int k=j+1;k<=n;++k)
cmax(ans,sum-f[i][j]-f[j][k]-f[k][i]+corner[i]+corner[j]+corner[k]);
return ans;
}
signed main(){
n=read();
for(int i=1;i<=n;++i){
P[i].fi=read(),P[i].se=read();
mp[P[i]]=i;
}
m=read();
for(int i=1;i<=m;++i){
x=read(),y=read(),z=read();
v[i]={{x,y},z};
corner[mp[{x,y}]]+=z;
if(mp[{x,y}])--i,--m;
else sum+=z;
}
for(int i=1;i<=n;++i)pre_solve(i);
write(solve(),'\n');
return 0;
}