2024.12.28测试 总结

还是超级无敌寀啊~

目录

  • 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 了。

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

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

相关文章

ZYNQ-IP-AXI-GPIO

AXI GPIO 可以将 PS 端的一个 AXI 4-Lite 接口转化为 GPIO 接口&#xff0c;并且可以被配置为单端口或双端口&#xff0c;每个通道的位宽可以独立配置。 通过使能三态门可以将端口动态地配置为输入或输出。 AXIGPIO 是 ZYNQ PL 端的一个 IP 核&#xff0c;可以将 AXI-Lite Mas…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

为什么应用程序是特定于操作系统的?[计算机原理]

你把WINDOWS程序复制到MAC上使用&#xff0c;会发现无法运行。你可能会说&#xff0c;MAC是arm处理器&#xff0c;而WINDWOS是X86 处理器。但是在2019年&#xff0c;那时候MAC电脑还全是Intel处理器&#xff0c;在同样的X86芯片上&#xff0c;运行MAC和WINDOWS 程序还是无法互相…

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的开发模式&#xff0c;但是也具有其特色的侦听函数&#xff0c;那么当LigerUI作为View层的时候&#xff0c;他所发送后端的必然是表单的数据&#xff0c;在此我们以俩个div为例&#xff1a; {Layout "~/View…

BurpSuite--暴力破解

一.弱口令 1. 基本概念 介绍&#xff1a;弱口令&#xff08;weak password&#xff09;是指那些容易被他人猜测或通过工具破解的密码。虽然弱口令没有严格的定义&#xff0c;但通常它指的是由简单的数字、字母、常用词语或规律性组合构成的密码。 特点&#xff1a; 密码容易被…

深入探讨防抖函数中的 this 上下文

深入剖析防抖函数中的 this 上下文 最近我在研究防抖函数实现的时候&#xff0c;发现一个耗费脑子的问题&#xff0c;出现了令我困惑的问题。接下来&#xff0c;我将通过代码示例&#xff0c;深入探究这些现象背后的原理。 示例代码 function debounce(fn, delay) {let time…

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊…

RocketMQ消息是如何存储的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ消息是如何存储的&#xff1f;】面试题。希望对大家有帮助&#xff1b; RocketMQ消息是如何存储的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…

MongoDB平替数据库对比

背景 项目一直是与实时在线监测相关&#xff0c;特点数据量大&#xff0c;读写操作大&#xff0c;所以选用的是MongoDB。但按趋势来讲&#xff0c;需要有一款国产数据库可替代&#xff0c;实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…

电力晶体管(GTR)全控性器件

电力晶体管&#xff08;Giant Transistor&#xff0c;GTR&#xff09;是一种全控性器件&#xff0c;以下是关于它的详细介绍&#xff1a;&#xff08;模电普通晶体管三极管进行对比学习&#xff09; 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管&#xff08;BJT&am…

蓝桥杯python语言基础(4)——基础数据结构(上)

目录 一、列表与元组 &#xff08;一&#xff09;列表 &#xff08;二&#xff09;操作列表 &#xff08;三&#xff09;元组 习题P502 习题P497 二、字符串 &#xff08;一&#xff09;字符串的基本操作 &#xff08;二&#xff09;字符串的常用方法 &#xff08;三&…

langchain基础(三)

Chain&#xff1a; 关于三个invoke&#xff1a; 提示模板、聊天模型和输出解析器都实现了langchain的runnable接口&#xff0c; 都具有invoke方法&#xff08;因为invoke方法是Runnable的通用调用方法&#xff09; 所以可以一次性调用多次invoke直接得到最终结果&#xff1a;…

数据分析和AI丨应对AI实施挑战,工程领域AI应用的五大方法

工程领域的人工智能 &#xff08;AI&#xff09; 已经开始发挥价值&#xff0c;低代码和无代码工具正在使曾经仅属于专业数据科学家的 AI 能力变得大众化。 然而&#xff0c;并非工程领域的每个人都能从中受益&#xff0c;使用新的便捷的 AI 工具提高工作效率并不难&#xff0c…

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…

games101-(5/6)

光栅化 投影完成之后&#xff0c;视图区域被确定在从[-1,1]的单位矩阵中&#xff0c;下一步就是光栅化 长宽比&#xff1a;ratio 垂直的可视角度&#xff1a;fild-of-view 可以看到的y 轴的范围&#xff0c;角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1&#xff09;所有者分类&#xff08;谁&#xff09; 2&#xff09;所有者的表示方法 ① u(the user who owns it)&#xff08;属主权限&…

oracle比较一下统计信息差异吧

统计信息发生了哪些变化&#xff1f; 从上次收集到最近一次收集有什么不同&#xff1f; set long 999999 longc 99999 line 100 select report, maxdiffpct from table(dbms_stats.diff_table_stats_in_history(SYS,T1,to_timestamp(2025-01-22 09:01:46,YYYY-MM-DD hh24:mi:s…

【现代深度学习技术】深度学习计算 | 参数管理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

用WinForm如何制作简易计算器

首先我们要自己搭好页面 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace _7_简易计算…

spring入门其实特别简单,也可以做单机。

直接在官网配置 点右边的"ADD DEPENDENCIES",选“Spring Web” 然后点“GENERATE”&#xff0c;会自动下载一个demo.zip。解压demo.zip&#xff0c;用IntelliJ IDEA打开就能用了。 IntelliJ IDEA打开之后&#xff0c;你得配置你的