比赛 |
20160415 |
评测结果 |
WAAAAWWWWW |
题目名称 |
能量网络 |
最终得分 |
40 |
用户昵称 |
mikumikumi |
运行时间 |
0.138 s |
代码语言 |
C++ |
内存使用 |
0.31 MiB |
提交时间 |
2016-04-15 10:30:41 |
显示代码纯文本
#include<cstdio>
#include<set>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int SIZEN=1010;
int N,M;
set<pair<int,int>,greater<pair<int,int> > > s[SIZEN];
int A[SIZEN],B[SIZEN];
int sa[SIZEN],mx=0,id;
void calc(int x)
{
set<pair<int,int>,greater<pair<int,int> > >::iterator it,en;
it=s[x].begin();
pair<int,int> P=*it;
it++;
if(it==s[x].end()) return;
pair<int,int> Po=*it;
sa[P.second]+=P.first-Po.first;
}
void make_sa()
{
memset(sa,0,sizeof(sa));
for(int i=1;i<=N;i++) calc(i);
}
void sa_d()
{
mx=0;
for(int i=1;i<=N;i++)
{
sa[i]-=B[i];
if(sa[i]>mx) mx=sa[i],id=i;
}
}
void read()
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++) scanf("%d",&A[i]);
for(int i=1;i<=N;i++) scanf("%d",&B[i]);
for(int i=1;i<=N;i++) s[i].insert(make_pair(0,0));
int fr,to;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&fr,&to);
s[fr].insert(make_pair(A[to],to));
}
make_sa();
sa_d();
}
void Era(int id)
{
set<pair<int,int>,greater<pair<int,int> > >::iterator it;
for(int i=1;i<=N;i++)
{
it=s[i].lower_bound(make_pair(A[id],id));
pair<int,int> P=*it;
if(P.first==A[id]&&P.second==id) s[i].erase(it);
}
}
void work()
{
int ans=0;
for(int i=1;i<=N;i++)
{
if(mx<=0) break;
ans+=B[id];
Era(id);
A[id]=0;
make_sa();
sa_d();
//for(int j=1;j<=N;j++) cout<<sa[i]<<" ";
//cout<<endl;
}
make_sa();
for(int i=1;i<=N;i++) ans+=sa[i];
printf("%d\n",ans);
}
int main()
{
freopen("energynet.in","r",stdin);
freopen("energynet.out","w",stdout);
read();
work();
return 0;
}