题目链接:Lizard Era: Beginning

题意:n此输入,每次三个元素,每次选择ab,ac,bc三种组合中一种,并把对应权值加给A,B,C,求最终组合中A==B==C且最大的方案

题解:直接搜索的话无疑是O(),肯定是过不去的,因此可以选择折半搜索,复杂度降到O(),具体操作如下:设上半部分最终搜索结果为x1.x2.x3,下半部分为y1,y2,y3,因为要求最终三者相等

所以满足x1+y1==x2+y2==x3+y3;我们可以分项拆解后发现这个等式可以化成x1-x2==y2-y1,x1-x3==y3-y1.因此我们可以用一个pair来储存x1-x2,x1-x3,因为要求结果最大,我们可以用map映射pair,map储存对应的最大的x,在上半部分搜索中我们dfs查找并用map储存所有方案(相同结果的更新x为较大的),在下半部分就可以直接查找对应的上半部分(即满足等式x1-x2==y2-y1,x1-x3==y3-y1)并更新答案,在路径的储存中我们其实可以直接储存其对应的满三叉树叶子节点下标,因为我们知道树深度,所以可以不断取余确定走的是哪个分叉,储存下路径倒序输出即可

代码可能比较长(头文化长。。。。),但是注释很详细,而且写的简单易懂

#include<iostream>
#include<stack>
#include<list>
#include<set>
#include<vector>
#include<algorithm>
#include<math.h>
#include<numeric>
#include<map>
#include<cstring>
#include<queue>
#include<iomanip>
#include<cmath>
#include<queue>
#include <bitset>
#include<unordered_map>#ifndef local#define endl '\n'
#endif */
#define mkp make_pair
using namespace std;
using std::bitset;
typedef long long ll;
typedef long double ld;
const int inf=0x3f3f3f3f;
const ll MAXN=2e6+10;
const ll N=1e6+100;
const ll mod=1e9+7;
const ll hash_p1=1610612741;
const ll hash_p2=805306457;
const ll hash_p3=402653189;
//-----------------------------------------------------------------------------------------------------------------*/
// ll head[MAXN],net[MAXN],to[MAXN],edge[MAXN]/*流量*/,cost[MAXN]//费用;
/*
void add(ll u,ll v,ll w,ll s){to[++cnt]=v;net[cnt]=head[u];edge[cnt]=w;cost[cnt]=s;head[u]=cnt;to[++cnt]=u;net[cnt]=head[v];edge[cnt]=0;cost[cnt]=-s;head[v]=cnt;
}
struct elemt{int p,v;
};
struct comp{public:bool operator()(elemt v1,elemt v2){return v1.v<v2.v;}
};
-----------------------------------
求[1,MAXN]组合式和逆元
ll mi(ll a,ll b){ll res=1;while(b){if(b%2){res=res*a%mod;}    a=a*a%mod;}return res;
}
ll fac[MAXN],inv[MAXN]
fac[0]=1;inv[0]=1;
for(int i=1;i<=MAXN;i){fac[i]=(fac[i-1]*i)%mod;inv[i]=mi(fac[i],mod-2);
}
ll C(int m,int n){//组合式C(m,n); if(!n){return 1;}return fac[m]*(inv[n]*inv[m*-n]%mod)%mod;
}
---------------------------------unordered_map<int,int>mp;
//优先队列默认小顶堆 , greater<int> --小顶堆  less<int> --大顶堆
priority_queue<elemt,vector<elemt>,comp>q;set<int>::iterator it=st.begin();
*/
// vector<vector<int>>edge; 二维虚拟储存坐标
//-----------------------------------------------------------------------------------------------------------------*/
map<pair<int,int>,int>mp; //pair三维分别为x1-x2,x1-x3,mp映射的是x1
map<pair<int,int>,int>idx; //这里映射的是对应满三叉树下标
int l[30],m[30],w[30];
string s[3]={"LM","LW","MW"};//对应三种深搜选择
int ans=-1e9;//存储答案
int ansx,ansy; //存储答案对应的两个三叉树下标,用于后面求路径
void dfs1(int now,int end,int x,int y,int z,int rt){//xyz对应当前三者总和,rt对应三叉树节点下标 if(now>end){if(mp.count({x-y,x-z})){if(x>mp[{x-y,x-z}]){//取较大的一个 mp[{x-y,x-z}]=x;idx[{x-y,x-z}]=rt;} }else{mp[{x-y,x-z}]=x;idx[{x-y,x-z}]=rt;} return ;} dfs1(now+1,end,x+l[now],y+m[now],z,3*rt);//对应s中三种状态dfs1(now+1,end,x+l[now],y,z+w[now],3*rt+1);dfs1(now+1,end,x,y+m[now],z+w[now],3*rt+2);
}
void dfs2(int now,int end,int x,int y,int z,int rt){//同上 if(now>end){//只有这里和上面不同,这里查找答案 if(mp.count({y-x,z-x})){//若有解 int tmp=mp[{y-x,z-x}];if(x+tmp>ans){//取最大的可行解 ans=x+tmp;ansx=idx[{y-x,z-x}];ansy=rt;}}return;}dfs2(now+1,end,x+l[now],y+m[now],z,3*rt);//对应s中三种状态dfs2(now+1,end,x+l[now],y,z+w[now],3*rt+1);dfs2(now+1,end,x,y+m[now],z+w[now],3*rt+2);
}
vector<int>p;//储存路径的倒序
void getload(int k,int len){//根据满三叉树性质,我们可以不断取余知道路径 for(int i=1;i<=len;i++){p.push_back(k%3);//具体走的哪个分叉 k/=3;}
}
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
int n;
cin>>n;
for(int i=1;i<=n;i++){cin>>l[i]>>m[i]>>w[i];
}
int half=n/2;//分割点
dfs1(1,half,0,0,0,0);//搜上半部分并储存答案
dfs2(half+1,n,0,0,0,0);//搜下半部分并求解答案
if(ans==-1e9){//无解 cout<<"Impossible"<<endl;
}
else{getload(ansy,n-half);//先获取下半段路径 getload(ansx,half);//获取上半段路径 for(int i=p.size()-1;i>=0;i--){//倒序输出 cout<<s[p[i]]<<endl;}
}return 0;
}

如有不正希望大佬们指出

Coodeforces 585D Lizard Era: Beginning (折半搜索)相关推荐

  1. Lizard Era: Beginning

    Lizard Era: Beginning 题面翻译 有 n ( n ⩽ 25 ) n(n \leqslant 25) n(n⩽25)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使 ...

  2. Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索

    Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec  Memory Limit: 512 MB Submit: xxx  ...

  3. [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)

    传送门 Solution 折半搜索裸题,注意\(long long\) Code #include <cmath> #include <cstdio> #include < ...

  4. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

    传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...

  5. 【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

    题意:有好坏两种点共 nnn 个,每个好点有权值,把这 nnn 个点连成一棵树,一个好点为有用的当且仅当它至少与一个好点相邻,求所有有用的点的权值和不超过 limlimlim 的方案数. n≤40n\ ...

  6. 【无码专区4】幸运数字4(折半搜索+计数+结论)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  7. [折半搜索][has] Jzoj P4250 路径

    Description A国有n个城市,编号为1到n,任意两个城市之间有一条路.shlw闲得没事干想周游A国,及从城市1出发,经过且仅经过除城市1外的每个城市1次(城市1两次),最后回到城市1.由于s ...

  8. bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)

    1770: [Usaco2009 Nov]lights 燈 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1153  Solved: 564 [Sub ...

  9. HZNU2509 曲院风荷——折半搜索

    目录 题目文本 解题思路 代码 考虑去重的代码 题目文本 传送门 Description kk在刷题劳累的时候喜欢去曲院风荷听戏喝茶.kk有一个容量为x个单位的大茶杯,同时kk想喝上一下午,于是他买了 ...

  10. 【折半搜索-经典题目】中山纪念中学暑期游Day13——【GDOI2017模拟8.15】Buy

    前言 考试时有道题目用到了[折半搜索] 老师推荐了这道经典题目让大家练习[前后部分算法不同]的题目 虽然不知道我有没有时间做,好歹先把题目记录一下,免得以后找不到了qwq 题目 Input Outpu ...

最新文章

  1. SingleR包注释单细胞数据
  2. 皮一皮:双11到底买了啥...
  3. ios下获取所有实体/虚拟网卡的信息,并以此判断设备所处的网络状态
  4. JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
  5. vue垂直布局_vue实现长图垂直居上 vue实现短图垂直居中
  6. LeetCode 1779. 找到最近的有相同 X 或 Y 坐标的点
  7. 英特尔新任CEO的“开挂”人生
  8. 在线CSS美化格式化工具
  9. 威学一百_涨价通知丨威学一百VIP全年畅学卡价格即将上调!
  10. 面向客户定制化开发项目的管理重点
  11. wamp下安装php的xdebug调试的方法
  12. flash自适应屏幕 html,让Flash自适应浏览器屏幕大小的几种方法
  13. Python基础:pip的安装与卸载
  14. java山地车可以改装吗_怎么样可以把山地车改的更简单一点?
  15. 2021-2027全球与中国GPS智能手表市场现状及未来发展趋势
  16. 使用rotate()来做一个3d贺卡
  17. 微店抢票如何构造订单页面分析
  18. ROBOGUIDE软件机床上下料仿真:数控铣床运动机构制作
  19. 近三年六级作文题目汇总
  20. 看了这一篇你还不理解什么是闭包——我直播吃翔!

热门文章

  1. 全栈必备 存储基础
  2. Python爬虫实战 | (21) Scrapy+Selenium爬取新浪滚动新闻
  3. 阿狸心形表白html,qq分组心形图案一颗心
  4. dockr pull 无法拉取镜像提示找不到注册表
  5. 7-4 计算e的近似值 (10 分)
  6. ettercap dns投毒
  7. [Paddle2.0学习之第一步]实现波士顿房价预测
  8. [题解] CF 1528B Kavi on Pairing Duty
  9. 2020 高考英语高频短语
  10. 毫秒为单位产生随机数