CF1717 D. Madoka and The Corruption Scheme [思维题?]

传送门:CF

[前题提要]:近期在集中刷1900+的题,原本感觉这类题的思维难度对自己来说似乎没什么大问题,拿到手之后就开始乱贪心,然后就Wa4了,狠狠地被这道题给教育了,故记录一下


看了题解之后感觉这种做法之前在某道题中碰到过类似的,但是想不起来了…

我个人认为这道题的关键点在于得出下面这个结论:对于本题来说,我们将原题简化为固定左边的选手胜利,然后可以随意排列选手的位置.个人感觉有了这个结论之后,后面的组合数问题简直不要太简单(可以说根本没有解释的必要),但是可惜的是,几乎所有题解都直接我们不妨假设每次比赛均选择靠左侧的选手赢.根本没有人解释这一点.

下面简单来说明一下上述结论为什么是对的.考虑随便选取一棵树,类似于下图(红线代表胜利,黑线表示失败):
在这里插入图片描述
假设上述序列是一种最优方案,此时满足不是所有红线都在左边.但是因为我们的序列是可以随便排列的,我们完全可以将红线在右边的子树和左边的子树进行一个调换,此时就将一个在右边的红线换到了左边,并且上述操作是不会影响 k k k次换边的,因为假设原本 < u , v 1 > <u,v_1> <u,v1>是红线,我们想将其换成 < u , v 2 > <u,v_2> <u,v2>,此时我们调换了 v 1 , v 2 v_1,v_2 v1,v2,此时的 v 1 , v 2 v_1,v_2 v1,v2依旧存在,此时我们依旧可以将红线改为 < u , v 2 > <u,v_2> <u,v2>.类似的,对于任意一颗不是所有红线都在左边的决策树,我们可以采取以下策略将其改为一颗红线都在左边的决策树:对于任意一条红线在右边的 < u , v > <u,v> <u,v>,我们可以将 v v v整颗子树和左子树进行交换,然后递归解决 v v v子树的红线分布问题.


在上述简化的前提下.我们会发现对于给定的 k k k,最终胜利的位置是可以确定的.逆转一下,也就是说对于任意的位置,我们都可以求出该位置成为最终胜利者需要的最小的k.举例来说,对于上述的 a 1 a_1 a1,我们会发现其需要的 k k k为0, a 2 a_2 a2需要1, a 3 a_3 a3需要1, a 4 a_4 a4需要2.(此时的 a 3 a_3 a3是原本的 a 4 a_4 a4).设 w [ k ] w[k] w[k]最少需要 k k k次改变才能成为胜利者的人数.我们会发现此时是 1 , 2 , 1 1,2,1 1,2,1.贪心的想,显然我们需要将编号小的选手放在需要的 k k k小的节点上,因为我们要尽量让编号小的选手胜利.

那么我们现在的问题就变成了怎么解决每个叶子节点需要的 k k k.其实不难发现,对于每个节点来说,他们的状态都是可以通过上一层的节点的状态递推过来的.如果一个节点,它相对于父亲节点位于左儿子的位置,那么它所需要的k和父节点相同,否则它需要的k是父节点+1.也就说每一个节点都会引出一个和本身权值相同的点以及一个权值+1的点,这个现象其实就是杨辉三角.当然通过手模多画几层也不难发现分布是杨辉三角.

那么我们现在的答案显然就是杨辉三角第 n n n层的前 k k k个数字之和.求一下组合数即可.


下面是具体的代码部分;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
inline void print(__int128 x){
	if(x<0) {putchar('-');x=-x;}
	if(x>9) print(x/10);
	putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const int mod=1e9+7;
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int qpow(int a,int b) {
	int ans=1;
	while(b) {
		if(b&1) ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}
int fac[maxn],in_fac[maxn];
void init(int limit=2e5) {
	fac[0]=1;
	for(int i=1;i<=limit;i++) {
		fac[i]=fac[i-1]*i%mod;
	}
	in_fac[limit]=qpow(fac[limit],mod-2);
	for(int i=limit-1;i>=0;i--) {
		in_fac[i]=in_fac[i+1]*(i+1)%mod;
	}
}
int C(int a,int b) {
	return fac[a]*in_fac[b]%mod*in_fac[a-b]%mod;
}
signed main() {
	init();
	int n=read();int k=read();
	if(k>=n) {
		cout<<qpow(2,n)<<endl;
		return 0;
	}
	int ans=0;
	for(int i=0;i<=k;i++) {
		ans+=C(n,i);ans%=mod;
	}
	cout<<ans<<endl;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时间管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

打印日志(JAVA)

1、通过导入包的形式 package com.example.demo;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RequestMapping("/log&q…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑灵活性供需平衡的新型电力系统长短期储能联合规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

垄断与商品化背景下的网络安全三大整合策略

我国的网络安全产业已经发展了20余年&#xff0c;大大小小的企业几乎覆盖了网络安全的所有领域。随着安全需求的逐渐递增&#xff0c;安全产品也朝着平台化、规模化发展&#xff0c;这就倒逼着安全厂商需要整合越来越多的安全能力&#xff0c;并与其产品相融合。这个过程&#…

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

【算法集训】基础算法:前缀和 | 概念篇

前缀和就是对于顺序表&#xff08;数组、列表&#xff09;来说&#xff0c;计算前面某一段元素的和。 1、部分和 给定一个数组&#xff0c;求某一段子数组的和。 2、朴素做法 int partialSum(int *a, int l, int r) {int i;int s 0;for(i l; i < r; i) {s a[i];}retu…

2020年吉林省玉米种植分布数据/作物分布数据

吉林省&#xff0c;位于中国东北中部&#xff0c;北接黑龙江省&#xff0c;南接辽宁省。东南部高&#xff0c;西北部低&#xff0c;中西部是广阔的平原。吉林省气候属温带季风气候&#xff0c;有比较明显的大陆性。吉林省素有“黑土地之乡”之称&#xff0c;土地肥沃&#xff0…

NMS 系列:soft,softer,weighted,iou-guided, Diou, Adaptive

系列文章目录 IOU 系列&#xff1a;IOU,GIOU,DIOU,CIOU 文章目录 系列文章目录一、NMS简介&#xff08;一&#xff09;为什么要使用NMS&#xff08;二&#xff09;NMS的算法流程&#xff08;三&#xff09;NMS的置信度重置函数&#xff08;四&#xff09;NMS的局限性&#xff…

【研究】光场相机测速技术中景深方向不确定性的改进方法

本项研究详细介绍了一种基于光场相机的粒子追踪测速&#xff08;PTV&#xff09;算法&#xff0c;旨在对三维速度场的三分量进行精细化测量。算法核心在于利用相机视角的多样性&#xff0c;辅以三角化测量和粒子追踪技术&#xff0c;有效优化了光场粒子图像测速&#xff08;PIV…

Linux——线程控制

目录 前言 一、线程创建 1.创建线程 2.线程传递结构体 3.创建多线程 4.收到信号的线程 二、线程终止 三、线程等待 四、线程分离 五、取消线程 六、线程库管理的原理 七、站在语言角度理解pthread库 八、线程的局部存储 前言 前面我们学习了线程概念和线程创建&…

异地文件如何共享访问?

异地文件共享访问是一种让不同地区的用户能够快速、安全地共享文件的解决方案。人们越来越需要在不同地点之间共享文件和数据。由于复杂的网络环境和安全性的问题&#xff0c;实现异地文件共享一直是一个挑战。 为了解决这个问题&#xff0c;许多公司和组织研发了各种异地文件共…

Spring Boot接收从前端传过来的数据常用方式以及处理的技巧

一、params 传参 参数是会拼接到url后面的请求 场景规范:url后面的key值<=3个参数的时候,使用params 传参 支持的请求方式:get(正规的是get方式)、post 都行 例如: http://localhost:8080/simpleParam?name=Tom&age=10 在postman里面的体现为 后端接收的接口…

20240402,<<,>>,控制流:while语句 ,for语句

……学很少&#xff0c;学很慢还是比不学强点是吧&#xff0c;救命 昨天不是很懂<<,>> 输入输出 iostream, 输入流 istream 输出流ostream&#xff0c;COUT,CIN,CERR,CLOG #include <iostream> int main() {std::cout << "enter two numbers:&…

成员变量、局部变量

变量分类 定义位置不同 成员变量定义在类中&#xff0c;成员方法之外 局部变量定义在局部范围内&#xff0c;如方法参数&#xff0c;方法内部&#xff0c;循环结构中等 作用范围不同&#xff08;空间&#xff09; 成员变量在整个类内有效&#xff0c;与声明位置无关 局部变…

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图神经网络实战&#xff08;7&#xff09;——图卷积网络详解与实现 前言1. 图卷积层2. 比较 GCN 和 GNN2.1 数据集分析2.2 实现 GCN 架构 小结系列链接 前言 图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出&#xff0c;其理念是创建一…

未来画卷:当AI短片撼动视界,虚拟与现实的界限模糊

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

IDEA中连接SQLserver数据库(DataGrip相同连接)

IDEA中连接SQLserver数据库(DataGrip相同连接) 1. 打开IDEA-database组件 2. 新建SQL server连接 3. 填写信息进行连接 填写连接名称&#xff0c;连接主机IP&#xff0c;端口&#xff0c;默认端口1433&#xff0c;数据库用户名密码&#xff0c;默认数据库用户名是sa 第一次连接…

Spark 部署与应用程序交互简单使用说明

文章目录 前言步骤一&#xff1a;下载安装包Spark的目录和文件 步骤二&#xff1a;使用Scala或PySpark Shell本地 shell 运行 步骤3:理解Spark应用中的概念Spark Application and SparkSessionSpark JobsSpark StagesSpark Tasks 转换、立即执行操作和延迟求值窄变换和宽变换 S…

Redis高可用与持久化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

智能视频翻译和配音处理工具:Pyvideotrans

pyVideoTrans&#xff1a;一键字幕识别翻译配音带新语言字幕和配音的视频 - 精选真开源&#xff0c;释放新价值。 概览 Pyvideotrans是一款卓著的智能化视频处理系统&#xff0c;专精于视频翻译与配音艺术&#xff0c;以其卓越的技术实力实现对原始视频中音频信息的精准捕捉、…