题意:给你一个多重集,求(x+y)×(cntx+cnty)(x+y)\times(cnt_x+cnt_y)(x+y)×(cntx​+cnty​)的最大值,其中x!=yx!=yx!=y且有mmm对(x,y)(x,y)(x,y)是不能选的
首先枚举(x,y)(x,y)(x,y)是O(N2)O(N^2)O(N2)的,我们考虑枚举(cntx,cnty)(cntx,cnty)(cntx,cnty),因为不同的cntxcntxcntx是O(N)O(\sqrt N)O(N​)的,先枚举(cntx,cnty)(cnt_x,cnt_y)(cntx​,cnty​)。对于出现次数为cntxcnt_xcntx​数量的数字可以从大到小贪心选取。
构建一个优先队列,初始push(1,1)push(1,1)push(1,1),表示cntxcnt_xcntx​集合中最大的数和cntycnt_ycnty​集合中最大的数。(这个过程和那个轮廓线+优先队列的过程非常像),如果(1,1)(1,1)(1,1)非法就继续放入(1,2)和(2,1)(1,2)和(2,1)(1,2)和(2,1)重复该操作直到找到第一个合法的,就是cntxcnt_xcntx​和cntycnt_ycnty​的最大值。这样就可以O(N+Mlog(M))O(N+Mlog(M))O(N+Mlog(M))完成。
其实感觉下来还是很简单写意的,写起来可能稍微有一些细节。
D题太简单就不水了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{int x,y;int val;bool operator<(const node &ths)const{return val<ths.val;}
};
int main()
{int T;scanf("%d",&T);while(T--){int n,m;scanf("%d%d",&n,&m);vector<int>a(n+1);map<int,int>mp;for(int i=1;i<=n;i++){scanf("%d",&a[i]);mp[a[i]]++;}set<pair<int,int>>bad;for(int i=1;i<=m;i++){int tu,tv;scanf("%d%d",&tu,&tv);if(tu>tv)swap(tu,tv);bad.insert({tu,tv});}for(int i=1;i<=n;i++)bad.insert({a[i],a[i]});int N=sqrt(n);vector<pair<int,int>>huge;vector<vector<int>>small(N+1);for(auto [fi,se]:mp){if(se<N)small[se].push_back(fi);else huge.push_back({fi,se});}for(int i=1;i<N;i++)sort(small[i].begin(),small[i].end(),greater<int>());ll ans=-1e18;for(int size=2;size<=2*N-2;size++){for(int sizex=1;sizex<min(size,N);sizex++){int sizey=size-sizex;if(sizey<N&&sizex<=sizey){int mark1=0,mark2=0;set<pair<int,int>>vis;priority_queue<node>q;if(mark1<small[sizex].size()&&mark2<small[sizey].size())q.push({mark1,mark2,small[sizex][mark1]+small[sizey][mark2]});vis.insert({mark1,mark2});while(!q.empty()){auto [x,y,val]=q.top();int tx=small[sizex][x],ty=small[sizey][y];if(tx>ty)swap(tx,ty);if(bad.count({tx,ty})){if(x+1<small[sizex].size()&&vis.count({x+1,y})==0){q.push({x+1,y,small[sizex][x+1]+small[sizey][y]});vis.insert({x+1,y});}if(y+1<small[sizey].size()&&vis.count({x,y+1})==0){q.push({x,y+1,small[sizex][x]+small[sizey][y+1]});vis.insert({x,y+1});}}else{ans=max(ans,1LL*size*val);break;}q.pop();}}}}for(int i=0;i<huge.size();i++){for(int j=i+1;j<huge.size();j++){auto [num1,cnt1]=huge[i];auto [num2,cnt2]=huge[j];if(bad.count({num1,num2})==0)ans=max(ans,1LL*(1LL*num1+num2)*(1LL*cnt1+cnt2));}}for(int i=0;i<huge.size();i++){auto [NUM,cnt]=huge[i];for(int j=1;j<N;j++){for(auto num:small[j]){if(bad.count({min(num,NUM),max(num,NUM)})==0){ans=max(ans,1LL*(1LL*NUM+num)*(1LL*cnt+j));break;}}}}printf("%lld\n",ans);}return  0;
}

CF1637E Best Pair相关推荐

  1. CF1637E. Best Pair

    Link 题意 对于一个数组 ,设元素 xxx 在其中出现了 cntxcnt_xcntx​ 次.SSS 是一些禁止选择的二元组形如(x,y)(x, y)(x,y),表示不能取(x,y)(y,x)(x, ...

  2. C++:vector容器中使用pair该如何访问成员

    (显然,vector 的索引从 0 开始,这和普通数组一样.通过使用索引,总是可以访问到 vector 容器中现有的元素.) 如果是简单的访问vector里边的成员的话,是这样的: #include ...

  3. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  4. C++中标准模板库std::pair的实现

    以下用C++实现了标准模板库中的std::pair实现,参考了 cplusplus 和 vs2013中的utility文件. 关于std::pair的介绍和用法可以参考: https://blog.c ...

  5. C++_volatile限定修饰符 Pair类型

    Volatile限定修饰符 =========================================================== 当一个对象的值可能会在编译器的控制或检测之外被改变时 ...

  6. 推荐 | Pair,医学图像标注神器

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在AI新基建时代,智能化医疗成为一种潮流趋势,其中医学影像标注为智 ...

  7. PPF(Point Pair Features)原理及实战技巧

    简介 基于Point Pair Features(PPF)的6D姿态估计方法PPF,Drost et al., 2010(https://ieeexplore.ieee.org/document/5 ...

  8. 6D位姿估计Point Pair Feature (PPF)算法详解

    作者丨丁洪凯@知乎 来源丨https://zhuanlan.zhihu.com/p/94952276 编辑丨3D视觉工坊 一.论文解读 论文: Drost et al. Model Globally, ...

  9. R语言配对图可视化:配对图(pair plot)可视化(根据分类变量的值为散点图上的数据点添加颜色和形状、Add color and shape by variables)

    R语言配对图可视化:配对图(pair plot)可视化(根据分类变量的值为散点图上的数据点添加颜色和形状.Add color and shape by variables) 目录

最新文章

  1. 1×pbs缓冲液配方_PBS缓冲液的配制
  2. 牛客题霸 [判断回文] C++题解/答案
  3. 是银弹吗?业务基线方法论
  4. 国科大prml13-概率图(CRF,HMM)
  5. Java 项目开发及管理常用工具收集
  6. 高平二中2021高考成绩查询,录取信息
  7. vsftp 配置参数详解
  8. roboguide程序导出_FANUC ROBOGUIDE下载-FANUC ROBOGUIDE(发那科机器人编程软件)下载v9.1-西西软件下载...
  9. 小程序毕设作品之微信校园维修报修小程序毕业设计成品(4)开题报告
  10. 基于Springboot实现高校社团管理系统
  11. Android常用设置
  12. 聊天斗图微信表情包小程序源码下载支持长按发送好友
  13. STM32+MLX90614红外测温
  14. C++编程技巧:内码的转换技术
  15. win7系统服务print spooler 无法启动解决方法(开启及关闭方法)
  16. asp微信登陆源码,实现asp网站授权微信登录(获取用户信息,微信名头像openid等)
  17. 水果姿态估计论文、数据集汇总
  18. Openlayers中的比例尺(scale)和分辨率(resolution)
  19. 在Word中输入带圈的数字字符
  20. Zuul多路径访问时报404问题

热门文章

  1. Linux学习之定时任务调度
  2. Linux虚拟机CentOS7挂机问题
  3. 第二章 @Entity实例里常用的注解详解
  4. java发送会议邀请邮件模板_使用java发送每封电子邮件的日历邀请
  5. 网络爬虫讲解(附java实现的实例)
  6. 添加fiddler证书到手机根目录
  7. 国产spfa瞎几把嗨
  8. vps搭建代理ip服务
  9. Holy Grail 2019南京网络赛
  10. 基于Web SCADA平台构建数字化车间的MES系统