https://codeforces.com/contest/1467/problem/C
还好用没用算分号打这场。。。又是找规律又是计数又是阅读理解题,极不友好
这题本质就是每个数字最后前面是正号还是负号的问题
找规律可以发现要么最后所在的那个集合,他原本的数字都可以全是正号,然后另外两个集合分别选最小的为负号,其他都是正号
然后坑点是我们其实可以让一个集合全是负号,一个集合全是正号,再转移到最后所在的集合
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
const int inf=2e9;
int n[4],m,k,cnt,tot,cas;ll ans;
int a[4][maxl],mi[4],sec[4];
ll sum[4];
bool vis[maxl];
char s[maxl];
inline void f(int &a,int &b,int x)
{
if(x<a || a==0)
b=a,a=x;
else if(b==0 || x<b)
b=x;
}
inline void prework()
{
for(int i=1;i<=3;i++)
scanf("%d",&n[i]);
for(int i=1;i<=3;i++)
{
mi[i]=sec[i]=0;
for(int j=1;j<=n[i];j++)
{
scanf("%d",&a[i][j]),sum[i]+=a[i][j];
f(mi[i],sec[i],a[i][j]);
}
}
}
inline void mainwork()
{
ans=1ll<<60;ans=-ans;
ll s=sum[1]+sum[2]+sum[3];
for(int i=1;i<=3;i++)
{
ll tmp=s;
for(int j=1;j<=3;j++)
if(i!=j)
{
ans=max(ans,s-2*sum[j]);
tmp-=2*mi[j];
}
ans=max(ans,tmp);
}
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}