jzoj3512-游戏节目【树状数组,双向dfs】

正题


大意

有n个节目,每个节目对3个东西贡献不同,要求选择至少k个让第一个东西的值最大。求方案数


解题思路

至少k个我们可以计算选择任何个数的结果减去选择k个的结果。由于k比较小,我们考虑直接暴搜
数据不是很大,我们可以将节目分成两段进行搜索所有结果。
然后第一部分计算第1个东西的值减去第2个东西的值ab1iab1i,和减去第3个东西的值ac1iac1i
第二部分一样计算ab2iab2i,ac2iac2i
问题就变成了选择两个数ii,j使得

ab1iab2j>0ab1i−ab2j>0

andand

ac1iac2j>0ac1i−ac2j>0

然后我们将两个中的 abab合在一起进行离散化,之后用一个树状数组或权值线段数进行第二部分查询每个区间内数的个数,这样就可以 n  log nnlogn查询了。
总共时间复杂度
O(217×log  217+1676116)O(217×log217+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);//输出
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最全最详细】使用publiccms实现动态可维护的首页轮播

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f481;‍♂️前言 前几天&#xff0c;分享了一篇关于publiccms的教程&#xff0c;在这里&#xff1a;【最全最详细】publiccms使用教程&#xff0c;不…

汇编语言(七)之字符串转大写

输入一串字符&#xff0c;将字符串的小写字母转成大写字母 程序运行&#xff1a; 代码&#xff1a; datas segmentoriginalCaseMaxLength db 0ffh,0originalCase db 100h dup(?)uppercase db 100h dup(?)inputPrompt …

基于.NET CORE微服务框架 -谈谈surging API网关

1、前言 对于最近surging更新的API 网关大家也有所关注&#xff0c;也收到了不少反馈提出是否能介绍下Api网关&#xff0c;那么我们将在此篇文章中谈谈surging Api 网关 开源地址&#xff1a;https://github.com/dotnetcore/surging 2. API网关 简介 API 网关是服务提供者…

2018/7/18-纪中某C组题【jzoj3508,jzoj3509,jzoj3510,jzoj3512】

前言 这是比赛的一天后了&#xff0c;第4题调了我超久&#xff0c;其他的都还好。还有LZHdalao给我们讲的第二题超强。 今日分数 Rankperson分数3zyc1253xjq12510蒟蒻9515hjq7515hzb7515lrz7515xxy7525lw15 正题 T1&#xff1a;jzoj3508-好元素【hash,优雅的暴力】 博客链接…

汇编语言(八)之删除数组中为零的元素

删除数组中为零的元素 程序运行&#xff1a; 无输出 代码&#xff1a; datas segmentmem dw 10 dup(0h,34h,0h,56h,32h,10h,3h,13h,0h,0h)memCount dw ($-mem)/2datas endsstacks segment stackdb 100h dup(?)stacks endscodes segmentassume …

【最全最详细】使用publiccms实现动态可维护的导航菜单栏

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;????**雄雄的小课堂????。”????‍????前言昨天&#xff0c;给大家整理的是通过publiccms实现动态可维护的轮播图&#xff0c;有需要的小伙伴可以点击这里&#xff1a;publiccms实现动…

golang学习笔记

Panic异常 1、使用defer recover处理 2、或者程序启动时就让他出错 &#xff08;初始化全局变量和 init&#xff09;&#xff08;军哥亲授&#xff09; Json Age int json:"age,omitempty" 序列化时忽略0值或空值type People struct {Name string json:"…

【上海】关于云计算,你想学习哪些知识,快让我来满足你

超高人气、干货十足的 免费云计算课堂 Microsoft Cloud Day云思塾 2017下半年再出发&#xff01; 即将开启上海之旅&#xff0c;微软诚邀您参加&#xff01; Microsoft Cloud Day是个啥&#xff1f; 这是为时一天的结合用户培训与经验分享的云计算免费研讨会&#xff0c;通…

jzoj3461-小麦亩产一千八【斐波那契数列】

正题 大意 第零个格1个&#xff0c;第一格有p个&#xff0c;之后第i格就是第i-1格加i-2格。知道第a格有x个&#xff0c;求第b格有多少个。 解题思路 我们推一下 12345678ppp+1" role="presentation">p+1p+12p12p13p23p25p35p38p58p513p813p821p1321p13不难…

【最全最详细】publiccms实现将公共部分提取成单独模块引入

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f9d8;‍♂️往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&a…

汇编语言(九)之十六进制数值转二进制

输入四位十六进制的数值&#xff0c;将十六进制数值转二进制输出 程序运行&#xff1a; 代码&#xff1a; datas segmentmaxLength db 5hexLength db 0hex db 5 dup(?)bin db 100h dup(?)inputPr…

goland

快捷键 command —ctrl option —alt 文件内搜索&#xff1a; command F ctrl F 前进回退&#xff1a; command option </> ctrl alt </> gofmt&#xff1a; command option L ctrl alt L

.NET Core 2.0 单元测试中初识 IOptionsMonitoramp;lt;Tamp;gt;

在针对下面设置 CookieAuthenticationOptions 的扩展方法写单元测试时遇到了问题。 public static IServiceCollection AddCnblogsAuthentication(this IServiceCollection services, IConfigurationSection redisConfiguration, Action<CookieAuthenticationOptions> …

汇编语言(十)之最小偶数

在数组中查找最小的偶数&#xff0c;并输出 程序运行&#xff1a; 代码&#xff1a; datas segmentminEven dw 0DATA dw 10 dup(101,1,21,81,5,261,3,421,4,541)DATACount dw ($-DATA)/type DATAoutputPrompt db min eve…

jzoj3462-休息【归并排序,逆序对】

正题 大意 一个序列&#xff0c;每次将一个单调下降的区间翻转&#xff0c;求最少次数将这个序列变成单调上升。 解题思路 考虑将O(n2)O(n2)的暴力转换。 我们先将开始时单调下降的区间翻转&#xff0c;然后我们会发现只有每个区间的边界才会需要交换&#xff0c;因为每个区…

【最全最详细】publiccms常用的代码片段

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f9d8;‍♂️往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&a…

Remoting核心类库RealProxy迁移

在学习.net core的过程中&#xff0c;我们已经明确被告知&#xff0c;Remoting将不会被支持。官方的解释是&#xff0c;.net framework 类型包含了太多的Runtime的内容&#xff0c;是一个非常重量级的服务实现&#xff0c;已被确定为一项有问题的体系结构。说白了就是迁移的难度…

【最全最详细】publiccms其他常用代码片段(内容、站点)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 ✍往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&#xff08;使用方式…

jzoj3464-秀姿势【hash】

正题 给出n个数&#xff0c;删去k种数&#xff0c;使一种数连续的最长。 解题思路 用hash表储存每种数在leftleft到ii这个区间内没种数的个数,然后如果这个区间内的种数超过k+1个那么就移动left" role="presentation">leftleft指针并没次从hash中弹出一个…

汇编语言(十一)之统计非数字字符个数

输入以$结尾的字符串&#xff0c;统计并输出非数字字符的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentstring db 100h dup(?)nonNumberCount dw 0inputPrompt db input string and end by $:inputPromptLen …