jzoj3512-游戏节目【树状数组,双向dfs】
正题
大意
有n个节目,每个节目对3个东西贡献不同,要求选择至少k个让第一个东西的值最大。求方案数
解题思路
至少k个我们可以计算选择任何个数的结果减去选择k个的结果。由于k比较小,我们考虑直接暴搜
数据不是很大,我们可以将节目分成两段进行搜索所有结果。
然后第一部分计算第1个东西的值减去第2个东西的值ab1iab1iab1_i,和减去第3个东西的值ac1iac1iac1_i。
第二部分一样计算ab2iab2iab2_i,ac2iac2iac2_i。
问题就变成了选择两个数iii,j" role="presentation">jjj使得
ab1_i-ab2_j>0
and
ac1_i-ac2_j>0
然后我们将两个中的 ababab合在一起进行离散化,之后用一个树状数组或权值线段数进行第二部分查询每个区间内数的个数,这样就可以 n log nnlognn\ \ log\ n查询了。
总共时间复杂度
O(2^{17} \times log\ \ 2^{17} + 1676116)
代码
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 131080*4
#define lobit(x) x&(-x)
using namespace std;
struct ansnode{ll c,b;bool f;
}ans[N];
ll n,k,a[51],b[51],c[51],t,nz;
long long sum,tr[N],ans1;
void dfs(ll dep,ll w,ll sum1,ll sum2,ll sum3)//暴力处理k以内的结果
{if (w>=k) return;if (w<k) {if (sum1>sum2&&sum1>sum3)ans1++;}for (ll i=dep+1;i<=n;i++) dfs(i,w+1,sum1+a[i],sum2+b[i],sum3+c[i]);
}
void dfs1(ll dep,ll sum1,ll sum2,ll sum3)//第一部分搜索
{ans[++t].b=sum1-sum2;ans[t].c=sum1-sum3;ans[t].f=0;for (ll i=dep+1;i<=nz;i++) dfs1(i,sum1+a[i],sum2+b[i],sum3+c[i]);
}
void dfs2(ll dep,ll sum1,ll sum2,ll sum3)//第二部分搜索
{ans[++t].b-=sum1-sum2;ans[t].c-=sum1-sum3;ans[t].f=1;for (ll i=dep+1;i<=n;i++) dfs2(i,sum1+a[i],sum2+b[i],sum3+c[i]);
}
bool cmp1(ansnode x,ansnode y)//排序
{return x.c<y.c;}
bool cmp2(ansnode x,ansnode y)
{return x.b<y.b||x.b==y.b;}
void change(ll x,ll up)//树状数组——修改
{while (x<=up){tr[x]++;x+=lobit(x);}
}
long long find(ll x)//树状数组——查询
{long long ans=0;while (x>0){ans+=tr[x];x-=lobit(x);}return ans;
}
int main()
{//freopen("show.in","r",stdin);//freopen("show.out","w",stdout);scanf("%lld%lld",&n,&k);nz=n/2;for (ll i=1;i<=n;i++)scanf("%lld",&a[i]);for (ll i=1;i<=n;i++)scanf("%lld",&b[i]);for (ll i=1;i<=n;i++)scanf("%lld",&c[i]);dfs(0,0,0,0,0);//搜索dfs1(0,0,0,0);//第一部分搜索dfs2(nz,0,0,0);//第二部分搜索sort(ans+1,ans+1+t,cmp1);//离散化——排序ans[t+1].c=-2147483647;ll e=1,last=1;for (ll i=2;i<=t+1;i++){if (ans[i].c!=ans[~-i].c)//离散化——去重,标号{for (ll j=last;j<i;j++)ans[j].c=e;e++;last=i;}}e--;sort(ans+1,ans+1+t,cmp2);ll o=0,g;while (o<=t){g=ans[o].b;last=o;while (ans[o].b==g&&o<=t) o++;for (ll i=last;i<o;i++) if (!ans[i].f) sum+=find(~-ans[i].c);//查询for (ll i=last;i<o;i++) if (ans[i].f) change(ans[i].c,e);//修改}printf("%lld",sum-ans1);//输出
}
jzoj3512-游戏节目【树状数组,双向dfs】相关推荐
- Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
题意 给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1 ...
- P6015-[CSGRound3]游戏【树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P6015?contestId=25945 题目大意 nnn张牌,玩家111从顶拿若干张,之后玩家222拿若干张. 若 ...
- HDU-5877-Weak Pair(树状数组+离散化+dfs)
转载于:https://www.cnblogs.com/GrowingJlx/p/6642761.html
- bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3521 Solved: 1913 [Submit][S ...
- [虚树][树状数组][lca] Jzoj P5908 开荒
Description 题目背景: 尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门后发现有无穷无尽的师兄弟姐妹,这几天新副本开了,尊者神高达的师门作为一个 pve师门 ...
- 树状数组相关应用之多叉树子树问题
Poj-3321:Apple Tree 题意: 卡卡的房子外面有一棵苹果树.每年秋天,树上都会长出许多苹果.卡卡非常喜欢苹果,所以他一直在精心培育着这棵大苹果树. 这棵树有N个分叉,这些分叉由树枝相连 ...
- 【bzoj2434】阿狸的打字机 AC自动机+树状数组
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题解] 这是一道很神的题. 先建一个AC自动机,这里需要维护一下父结点,以便删除时 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2545 Solved: 1419 [Submit][S ...
- 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)
题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...
最新文章
- 使用VScode开发ESP32,PlatformIO开发ESP32
- java 革命_JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)
- 大专普通本科、搞算法的(蓝桥杯、ACM、天梯赛)-后续成长之路
- (五)自动化MLOps部署到Kubernetes
- 软件测试某公司面试题2014
- arcgis构建金字塔失败什么原因_天猫入驻为什么失败?知舟集团给出失败原因和解决办法...
- matlab 安装教程:matlab 2016a(matlab R2016a)
- 【无标题】曲线坐标张量分析
- 二阶系统响应指标图_一阶和二阶系统的动态特性参数
- java 出路 xls_java读取excel之xlsl超大文件
- 网络 :无线热点与网线一同连接笔记本(完结)
- Ubuntu 18.04 登录界面鼠标键盘鼠标失灵解决方法
- HP笔记本电源开关灯常亮,不能开机的处理
- 天天肝大厂面试题,邮储银行Java笔试
- 【 交换最小值和最大值 】本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。 注意:题目保证最大和最小值都是唯一的。
- Android集成FFmpeg并实现视频转码
- 使用仿射变换将一幅图像放置到另一幅图像中
- 如何在 Web 浏览器中启用 Java?
- mei yan xiao guo for android
- LED点阵屏实现文字滚动
热门文章
- k8s滚动升级_k8s deployment 滚动更新
- oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...
- idea如何导入java工程_Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!
- docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
- 8-1 回溯法实验报告 (15 分)(思路+详解)
- [Java基础]反射获取构造方法并使用
- 《C++ Primer》2.1.2节练习
- Builder(生成器)--对象创建型模式
- 静态代理模式(多线程底部原理)
- mysql文献综述_文献综述随笔(二十)