2024.12.28测试 总结

news2025/1/31 10:26:55

还是超级无敌寀啊~

目录

  • T1 赠送笔记本
  • T2 中位数
  • T3 好子集
  • T4 异或
  • 总结

T1 赠送笔记本

link

题意
n n n 个宿舍,每个宿舍 4 4 4 头奶牛,第 i i i 个宿舍有 a i a_i ai 头牛有笔记本(每头牛的笔记本都不同)。现在所有奶牛都把自己的笔记本送给与自己不同宿舍的奶牛,一头奶牛最多只能接收别人送的一本笔记本,求有多少种赠送方案,答案模 1234567891 1234567891 1234567891

  • 1 ≤ n ≤ 47 1 \le n \le 47 1n47 0 ≤ a i ≤ 4 0 \le a_i \le 4 0ai4

思路
参考了 这篇题解的T5 。
注意到是计数类问题,考虑组合数,但是很难保证 “一头奶牛只收被人的一本笔记本” 。然后放弃。但是可以是 D P DP DP ,看到赠送笔记本可以给前面的牛奶也可以给后面奶牛,担也可以等价于赠送笔记本给前面的奶牛和收下前面的奶牛送出的笔记本。所以设状态 f i , j f_{i,j} fi,j表示考虑到第 i i i 个宿舍,还剩下 j j j 本笔记本没送。

  • 首先我们考虑接收前面的,设当前这个宿舍 i i i 接收前面 k k k ( 0 ≤ k ≤ 4 ) (0 \le k \le 4) (0k4),那么贡献为 A j k × C 4 k A_j^k \times C_4^k Ajk×C4k
  • 再考虑往前送,设往前送 p p p ( 0 ≤ p ≤ a i ) ( 0 \le p \le a_i) (0pai),因为前面有 4 × ( i − 1 ) − ( ∑ d = 1 i − 1 a d − j ) 4 \times (i-1) - (\sum_{d=1}^{i-1} a_d - j) 4×(i1)(d=1i1adj) 个人还没收到笔记本 (记这个未收到笔记本的人数为 S S S),所以贡献为 A S p × C a i p A_S^p \times C_{a_i}^p ASp×Caip

综上,得出状态转移方程:
f i , j − k + a i − p = f i − 1 , j × A j k × C 4 k × A S p × C a i p f_{i,j-k+a_i-p} = f_{i-1,j} \times A_j^k \times C_4^k \times A_S^p \times C_{a_i}^p fi,jk+aip=fi1,j×Ajk×C4k×ASp×Caip
注意一下,如果组合数(如 A m n A_m^n Amn C m n C_m^n Cmn)要逆元求的话,预处理的过程中可能会爆栈,数很大但是又不能取模,但其实 m m m n n n 都很小,所以直接朴素计算即可,复杂度也就 O ( n ) O(n) O(n)

所以 D P DP DP 的总时间复杂度就为 O ( n 2 × 4 4 ) O(n^2 \times 4^4) O(n2×44)

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=50;
const ll mod=1234567891;

ll A(ll m,ll n){ ll s=1; for(int i=0;i<n;i++) (s*=(m-i))%=mod; return s; } 
ll C(ll m,ll n){ ll s=1; for(int i=0;i<n;i++) (s*=(m-i))%=mod,(s/=(i+1))%=mod; return s; }

int a[maxn];
ll f[maxn][maxn*4];
int main(){
	int n; cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	int sum=0;
	f[0][0]=1;//f[i][j]:考虑到第 i 个宿舍,还剩下 j 本笔记本没送 
	for(int i=1;i<=n;i++){
		for(int j=0;j<=sum;j++)
			for(int k=0;k<=min(4,j);k++)//k:接收前面的 k 本 
				for(int p=0;p<=a[i];p++)//p:往前面送 p 本给那些还没有接收过本子的奶牛 
					(f[i][j-k+a[i]-p]+=f[i-1][j]*C(4,k)%mod*A(j,k)%mod*C(a[i],p)%mod*A(4*(i-1)-(sum-j),p)%mod)%=mod;
		sum+=a[i];
	}
	cout<<f[n][0];
	return 0;
}

T2 中位数

link
题意
序列的中位数是指:把序列从小到大排序后,下标是 n 2 + 1 \frac{n}{2}+1 2n+1 的那个数。给定一个整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an ,对于 a a a 序列的任意一个连续子序列 a L , a L + 1 , . . . , a R a_L,a_{L+1},...,a_R aL,aL+1,...,aR 1 ≤ L ≤ R ≤ n 1 \le L \le R \le n 1LRn), 记该连续子序列的中位数为 b L , R b_{L,R} bL,R 。显然 b b b 数组共有 n × ( n + 1 ) 2 \frac{n \times (n+1)}{2} 2n×(n+1) 个整数,求 b b b 数组的中位数。

  • 1 ≤ n ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 1 \le n \le10^5,1 \le a_i \le 10^9 1n1051ai109

思路

前置指示 —— 求中位数有一个很套路的方法:二分一个数 m i d mid mid,对于原序列中 < m i d \lt mid <mid 的数标记为 − 1 -1 1;反之标记为 1 1 1。然后记所有标记求和为 s u m sum sum。若 s u m < 0 sum \lt 0 sum<0,说明中位数 < m i d \lt mid <mid ,那么向左继续二分;反之,向右二分。

对于这题,可以有一样的思路。先二分一个数 m i d mid mid,并对原序列进行标记。那么问题就转化为:统计有多少个区间,其标记和 ≥ 0 \ge 0 0
记满足条件的区间有 c n t cnt cnt 个,如果 c n t ≥ n × ( n + 1 ) 2 2 + 1 cnt≥ \frac{\frac{n \times (n+1)}{2}}{2} +1 cnt22n×(n+1)+1,那么说明 a n s ≥ m i d ans \ge mid ansmid,继续向右二分;反之向左二分。那如何计算 c n t cnt cnt ?我们考虑对标记做一个前缀和,设为 s u m sum sum,一个满足条件的区间 [ l , r ] [l,r] [l,r] 要有 s u m r − s u m l − 1 ≥ 0 sum_r − sum_{l−1} \ge 0 sumrsuml10 ,用树状数组维护即可。
时间复杂度为 O ( n l o g 2 n ) O(nlog^2 n) O(nlog2n)

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;

int n;
ll tree[maxn*2];
void Add(int x,int y){ while(x<=2*n+1) tree[x]+=y,x+=x&(-x); }
ll Query(int x){ ll sum=0; while(x) sum+=tree[x],x-=x&(-x); return sum;}

int a[maxn],c[maxn];
bool Check(int x){
	ll res=0;
	Add(n+1,1);
	for(int i=1;i<=n;i++){
		c[i]=(a[i]>=x?1:-1),c[i]+=c[i-1];
		res+=Query(c[i]+n+1);
		Add(c[i]+n+1,1);
	}
	for(int i=1;i<=n;i++)
		Add(c[i]+n+1,-1);
	Add(n+1,-1);
	return (res>=1ll*n*(n+1)/2/2/*+1*/);//注意细节!
}

int b[maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	int l=0,r=n+1,mid;
	while(l+1<r){
		mid=l+r>>1;
		if(Check(b[mid])) l=mid;
		else r=mid;
	}
	cout<<b[l];
	return 0;
}

T3 好子集

link
题意
n n n 张卡片,每张卡片上有一个整数 d i d_i di ,这些整数之间有可能相同。求有多少个卡片子集(非空)满足子集里的卡片上的数字的乘积正好等于 g o o d v a l u e goodvalue goodvalue 。多测,答案模 1 e 9 + 7 1e9+7 1e9+7

  • g ≤ 4 g \le 4 g4 1 ≤ n ≤ 100 1 \le n \le 100 1n100 1 ≤ g o o d v a l u e ≤ 2 × 1 0 9 1 \le goodvalue \le 2 \times 10^9 1goodvalue2×109 1 ≤ d i ≤ 2 × 1 0 9 1 \le d_i \le 2 \times 10^9 1di2×109

思路
首先可知选出的卡片上的数一定是 g o o d v a l u e goodvalue goodvalue 的因数。考虑 D P DP DP ,设 f i , j f_{i,j} fi,j 表示前 i 个数中选出的卡片子集的卡片数乘积恰好等于 j 的方案数。转移显而易见。发现状态的第二维 j 有存在意义的选择很少(因为 j 必为 g o o d v a l u e goodvalue goodvalue 的因数),可以用 map 压缩状态,这就可以通过了。复杂度大概为 O ( n V ) O(nV) O(nV)
有一个坑点:由于边界是f[0][1]=1 (因为不能f[0][0]=1),转移的时候又会有f[i][j]+=f[i-1][j],导致f[i][1]这一列全部多加了一个虚拟的1(1是f[0][1]的值),所以最后要记得-1。

代码

#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int maxn=105,mod=1e9+7;
ll a[maxn],b[2000005];
map<ll,ll>mp,f[maxn];
signed main(){
	int g; cin>>g;
	while(g--){
		int n2,n=0; ll gdval; cin>>n2>>gdval;
		for(int i=1,x;i<=n2;i++){
			cin>>x;
			if(gdval%x==0) a[++n]=x;
		}
		int tot=0;
		mp[1]=++tot,b[tot]=1;
		f[0][1]=1;
		for(int i=1;i<=n;i++)
			for(int j=1,m=tot;j<=m;j++){
				(f[i][j]+=f[i-1][j])%=mod;
				if(a[i]>gdval/b[j]) continue;
				if(gdval%(b[j]*a[i])!=0) continue;
				if(!mp.count(b[j]*a[i])) mp[b[j]*a[i]]=++tot,b[tot]=b[j]*a[i];
				(f[i][mp[b[j]*a[i]]]+=f[i-1][j])%=mod;
			}
		if(gdval==1) f[n][mp[gdval]]--,(f[n][mp[gdval]]+=mod)%=mod;//this!!!!!!!!
		cout<<f[n][mp[gdval]]<<"\n";
		for(int i=1;i<=n;i++)
			f[i].clear();
		mp.clear();
	}
	return 0;
}

T4 异或

link
题意
有一个长度为 n n n 的自然数序列 a a a , 要求将这个序列分成至少 m m m 个非空连续子段。每个子段的价值为该子段的所有数的按位异或。要使所有子段的价值按位与的结果最大,输出这个最大值。(多测)

  • 1 ≤ q ≤ 12 1 \le q \le 12 1q12 1 ≤ m ≤ n ≤ 1000 1 \le m \le n \le 1000 1mn1000 0 ≤ a i ≤ 2 30 0 \le a_i \le 2^{30} 0ai230

思路
对于与二进制有关的题目,考虑拆位(二进制下)处理。从高到低位依次枚举答案的二进制下的每一位为 0 / 1 0/1 0/1
如果一段数可以划分,则尽早划分,可以证明这是优的。如果划分完可以为一段的数后还剩一些数,则考虑将其拼至最后的已经被划分的那一段之中。最后如果划分完所有数且段数 ≥ m \ge m m ,那么这一位就可以为 1 1 1,否则只能为 0 0 0 。时间复杂度 O ( n ) O(n) O(n) 。就是简单贪心 (虽然我考场上不会) ,具体看代码。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int a[maxn];
int main(){
	int q; cin>>q;
	while(q--){
		int n,m; cin>>n>>m;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int ans=0;
		for(int i=30;i>=0;i--){
			ans|=(1<<i);
			int now=0,cnt=0;
			for(int j=1;j<=n;j++){
				now^=a[j];
				if((now&ans)==ans) now=0,cnt++;
			}
			if(cnt<m||((ans^now)&ans)!=ans) ans^=(1<<i);
		}
		cout<<ans<<"\n";
	}
	return 0;
}

总结

不好评价,其实这些题也很常见,分不高说明本人的积累还是太 l i t t l e little little 了。

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

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

相关文章

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法&#xff0c;并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法&#xff0c;开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型&#xff0c;在多个推理任务上表现出色&#xff0c;并开源模型推动…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

AJAX笔记入门篇

黑马程序员视频地址&#xff1a; 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.1项集&#xff08;Itemset&#xff09; 1.2规则&#xff08;Rule&#xff09; 1.3支持度&#xff08;Support&#xff09; 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略

LLMs之WebRAG&#xff1a;STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…

buu-rip-好久不见26

简单的栈溢出&#xff0c;找到后面函数和输入的个数即可

2025一区新风口:小波变换+KAN!速占!

今天给大家分享一个能让审稿人眼前一亮&#xff0c;好发一区的idea&#xff1a;小波变换KAN&#xff01; 一方面&#xff1a;KAN刚中稿ICLR25&#xff0c;正是风口上&#xff0c;与小波变换的结合还处于起步阶段&#xff0c;正是红利期&#xff0c;创新空间广阔。 另一方面&a…

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…

系统思考—蝴蝶效应

“个体行为的微小差异&#xff0c;可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说&#xff0c;小变动带来大影响&#xff0c;这种现象&#xff0c;在复杂系统理论中被称为“蝴蝶效应”&#xff1a;即使极小的变化&#xff0c;也能在动态系…

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要&#xff0c;很多项目执行程序后出现报错信息无法第一时间收到&#xff0c;因此实时预警对于监控程序还是有必要。&#xff08;仅个人观点&#xff09; 参考文档及博客&#xff1a…

【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址&#xff0c;指向另一个数据。 Rust 中最常见的指针是引用&#xff0c…

Spring AI 在微服务中的应用:支持分布式 AI 推理

1. 引言 在现代企业中&#xff0c;微服务架构 已成为开发复杂系统的主流方式&#xff0c;而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI&#xff0c;使多个服务可以协同完成 AI 任务&#xff0c;并支持分布式 AI 推理&#x…

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破&#xff1a;从零开始的推理能力进化DeepSeek R1-Zero&#xff1a;纯RL训练的“自我觉醒”DeepSeek R1&#xff1a;冷启动与多阶段训练的平衡之道 实验验证&#xff1a;推理能力的全方位跃升基准测试&#xff1a;超越顶尖闭源模型蒸馏技术&#xff1a;小模型的…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时&#xff0c;都会出现在一个对话框里面存在好多的选项&#xff0c;导致对话框变得非常长或者非常大&#xff0c;就会显现的不美观&#xff0c;在这种情况下通常是添加一个页面的滚动条来解决这个问题&#xff0c;下面我们就来介绍给MFC的对话…

php接口连接数据库

框架&#xff1a;https://www.thinkphp.cn/doc 创建网站 域名自己写 创建文件夹&#xff0c;“test”拉取框架&#xff0c;地址栏输入 composer create-project topthink/think5.1.* tp5 会自动创建一个tp5文件夹 根目录选择刚刚创建拉框架的文件夹 以test为示例 “D:\test\…

【卫星通信】链路预算方法

本文介绍卫星通信中的链路预算方法&#xff0c;应该也适用于地面通信场景。 更多内容请关注gzh【通信Online】 文章目录 下行链路预算卫星侧参数信道参数用户侧参数 上行链路预算链路预算计算示例 下行链路预算 卫星侧参数 令卫星侧天线数为 M t M_t Mt​&#xff0c;每根天线…