题意:x轴-100和+100的有敌人飞船,纵坐标由输入数据给出,我方有2飞船在x轴0,y坐标待定。0时刻时敌人同时向我方2飞船发出光线,光线会穿透飞船打到敌人自己,问2飞船放在哪敌人损失最大?

假如-100有飞船a,+100有飞船b,那么在两者y坐标和/2的位置放飞船,就炸掉2个。数据是60*60最多3600,将所有的和涉及的左飞船,右飞船或起来(位运算|)。然后二重循环和,或起来看数量。

//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <bitset>
using namespace std;
const int SZ=,INF=0x7FFFFFFF;
bitset<> bt1[SZ],bt2[SZ]; int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
//for(;scanf("%d",&n)!=EOF;)
{
int n,m;
cin>>n>>m;
vector<int> v1(n),v2(m);
for(int i=;i<n;++i)cin>>v1[i];
for(int i=;i<m;++i)cin>>v2[i];
set<int> st;
for(int i=;i<n;++i)
{
for(int j=;j<m;++j)
{
int val=v1[i]+v2[j]+;
bt1[val][i]=;
bt2[val][j]=;
st.insert(val);
}
}
int res=;
for(auto it=st.begin();it!=st.end();++it)
{
int cur=*it;
for(auto j=st.begin();j!=st.end();++j)
{
//if(j==it)continue;
int tmp=(bt1[cur]|bt1[*j]).count()+(bt2[cur]|bt2[*j]).count();
res=max(res,tmp);
}
}
cout<<res<<endl;
}
return ;
}
05-06 04:49