NOIP模拟赛 鸽巢原理 + 众数 + Trie

《合唱团》算法解析(含思路解答示意图)【牛客网编程题——JAVA实现】 【考点:动态规划】动态规划变形,难度指数上升题目描述有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?输入描述每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包... 阅读详情

Set

Set(set.cpp/c/pas, 1s, 64MB)
题目描述
你手上有N个非负整数, 你需要在这些数中找出一个非空子集, 使得它的元素之和能被N整除. 如果有多组合法方案, 输出任意一组即可.
注意: 请使用高效的输入输出方式避免输入输出耗时过大.
输入格式
第一行一个整数N, 代表数字个数.
接下来一行N个数, 代表你手上的数.
输出格式
如果无解, 输出-1.
否则, 第一行输出一个整数M, 代表你选择的数的个数.
接下来一行M个数, 代表你选中元素的下标, 这M个数必须两两不同.
M <= 1000000

题解

鸽巢原理, 所以无-1之说… 研究会不会有-1的情况也是发现题目性质的好思路.
求出前缀和, 前缀和最多只有N个取值, 但是一共有S[0], S[1]..S[N] 这N+1个值, 所以一定有某
两个S[i], S[j]相等, 找出来再把i到j输出就可以了.

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 1000005;
int n, st;
int vis[maxn], a[maxn];
long long sum;
inline const int read()
{
    register int x = 0;
    register char ch = getchar();
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x;
}
int main()
{
    freopen("set.in", "r", stdin);
    freopen("set.out", "w", stdout); 
    n = read();
    for (int i = 1; i <= n; ++ i) a[i] = read();
    for (int i = 1; i <= n; ++ i)
    {
        sum = (sum + a[i]) % n;
        if(!sum || vis[sum])
        {
            if(vis[sum]) st = vis[sum] + 1;
            else st = 1;
            printf("%d\n", i - st + 1);
            for (int j = st; j <= i; ++ j)
                printf("%d ", j);
            return 0;
        }
        vis[sum] = i;
    }
}

Read

Read(read.cpp/c/pas, 1s, 16MB)
题目描述
热爱看书的你有N本书, 第i本书的种类为A[i]. 你希望每天能够看一本书, 但是不希望连续两天看种类相同的书. 为了达成这个条件, 你需要选择一些书不看, 作为一个好学生, 你希望不看的书尽可能少, 求最少可以有多少书不看.
输入格式
为了避免输入文件过大, 我们采取如下方式生成A[i].
第一行读入两个个整数M, K.
接下来一行读入M个整数count[i], 其中 .
接下来一行读入M个整数X[i].
接下来一行读入M个整数Y[i].
接下来一行读入M个整数Z[i].
然后按照下面这段代码生成.
int N = 0, S = (1 << K) - 1;
for (int i = 1; i <= M; ++i) {
N = N + 1;
A[N] = X[i];
long long last = X[i];
for (int j = 1; j < count[i]; ++j) {
last = (last * Y[i] + Z[i]) & S;
N = N + 1;
A[N] = last;
}
}
注意:因为生成A[i]的方法不好用语言描述, 所以用代码来表达. 直接照搬代码的话后果 自负.
输出格式
输出一个整数表示答案.
N <= 50000000, M <= 1000, K <= 30

题解

可先看看bzoj2456 mode.
要想每天读书的种类都不同, 就要求每一种书的数目不超过其它书的数目+1. 所以只要看是否有一
种书超过了(N+1)/2. 本题空间限制很小, 但是N有很大, 所以不能用数组存下来, 但是我们只要找到超过
(N + 1) / 2的书, 所以我们用两个变量id, cnt, cnt初始为0. 然后生成每一个A[i], 如果cnt==0, 那么就
令id=A[i], cnt=1, 否则如果id==A[i], 则cnt++, 如果不等于, cnt–. 最后只要再扫一遍求出id的出现次
数即可.
因为如果有书超过(N+1)/2, 那么就以为这它比其他所有书的和都多, 那么cnt怎么减都不会小于
0, 如果没有那id随便是哪个都没有关系了. 最后再求这种书要减少多少个就可以了.

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long lnt;
const int maxn = 1005;
int tot, m, K, cnt, n, ans, lim, cntt[maxn];
lnt now, mor, S;
lnt x[maxn], y[maxn], z[maxn];
int main()
{
    freopen("read.in", "r", stdin);
    freopen("read.out", "w", stdout); 
    scanf("%d%d", &m, &K); 
    for (int i = 1; i <= m; ++ i) scanf("%d", &cntt[i]), n += cntt[i];  
    for (int i = 1; i <= m; ++ i) scanf("%lld", &x[i]);
    for (int i = 1; i <= m; ++ i) scanf("%lld", &y[i]);
    for (int i = 1; i <= m; ++ i) scanf("%lld", &z[i]);

    S = (1 << K) - 1;
    for (int i = 1; i <= m; ++ i)
    {
        now = x[i];
        if(!tot || mor == now) ++ tot, mor = now;
        else --tot;
        for (int j = 1; j < cntt[i]; ++ j)
        {
            now = (now * y[i] + z[i]) & S;
            if(!tot || mor == now) ++ tot, mor = now;
            else --tot;
        }
    }
    for (int i = 1; i <= m; ++ i)
    {
        now = x[i];
        if(now == mor) ++ cnt;
        for (int j = 1; j < cntt[i]; ++ j)
        {
            now = (now * y[i] + z[i]) & S;
            if(mor == now) ++ cnt;
        }
    }
    if(n & 1) lim = n / 2 + 1;
    else lim = n / 2;
    if(cnt > lim)
        printf("%d\n", 2 * cnt - n - 1);
    else puts("0");
}
/*
7 2
1 1 1 1 1 1 1
1 1 1 2 2 1 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
*/

Race

Race(race.cpp/c/pas, 1s, 256MB)
题目描述
一年一度的运动会开始了. 有N个选手参赛, 第i个选手有一个能力值Ai, 比赛一共进行了 天. 在第j天( )的比赛中, 第i个选手的得分为A[i] xor j, 然后从大到小排名, 排名为x(x从0开始)的同学会获得 的积分, 你需要求出每个同学最后总的积分和q[i]模 的结果p[i]. 为了避免输出文件过大, 你只要输出p[i]的异或和即可.
输入格式
第一行三个整数, 分别代表N, M.
接下来一行N个整数, 第i个数代表A[i].
输出格式
一个整数代表答案.
样例
race.in
race.out
3 2
0 1 2
8
数据范围
对于10%的数据, M <= 5.
对于30%的数据, N <= 100.
对于50%的数据, N <= 1000.
对于100%的数据, N <= 200000, M <= 30, A[i] < 2 ^ M

题解

可先看看bzoj管道取珠.
考虑怎么求出x的答案. 平方相当于是枚举两个人(可以相同), 把这两个人同时排在x前面的天数
计入答案. 那么对于x, 如果我们求出f[i]也就是能力值的二进制中第i+1到M-1位都和他相等且第i位不
同的人有多少个, 那么这些人是否排在他前面只由第i位确定, 一共有2^(M-1)天, 而且不需要从这些人中
枚举两个人了, 因为直接平方即可. 我们只要枚举i和j, f[i]这些人和f[j]这些人同时排在他前面的天数为
2^(M-2), 所以把2 * f[i]*f[j]*2^(M-2)计入答案. 具体实现有很多方法, 可以用trie树实现.

#include<stdio.h>
typedef long long lnt;
const int mod = 1e9 + 7; 
const int maxn = 2e5 + 5;
lnt ans, lim;
int n, m, tot;
int ch[maxn * 30][2], siz[maxn * 30];
inline const int read()
{
    register int x = 0;
    register char ch = getchar();
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x;
}
inline void insert(int x)
{
    int p = 0;
    for (int i = m - 1; ~i; -- i)
    {
        int wh = (x >> i) & 1;
        if(!ch[p][wh]) ch[p][wh] = ++ tot;
        p = ch[p][wh];
        ++ siz[p];
    }
}
void dfs(int u, lnt sum, lnt num)
{
    if (!ch[u][0] && !ch[u][1])
    {
        ans ^= sum;
        return;
    }
    lnt tmp;
    tmp = siz[ch[u][1]] * (siz[ch[u][1]] + num) % mod * lim % mod;
    if (ch[u][0]) dfs(ch[u][0], (sum + tmp) % mod, num + siz[ch[u][1]]);

    tmp = siz[ch[u][0]] * (siz[ch[u][0]] + num) % mod * lim % mod;
    if (ch[u][1]) dfs(ch[u][1], (sum + tmp) % mod, num + siz[ch[u][0]]); 
}
int main()
{
    freopen("race.in", "r", stdin);
    freopen("race.out", "w", stdout);
    n = read(), m = read();
    lim = 1 << (m - 1);
    int x;
    for (int i = 1; i <= n; ++ i) x = read(), insert(x);
    dfs(0, 0, 0);
    printf("%lld\n", ans);
} 
无人机飞控传感器全解析:从IMU到光流传感器的实战应用 本文深入解析了无人机飞控系统的核心传感器,从IMU、气压计、磁力计到光流传感器,详细阐述了其工作原理、数据融合策略及常见挑战。结合ICF5、Pixhawk 6C等主流飞控硬件,提供了从传感器校准、滤波器调优到应对室内光流定位、强磁干扰等实战场景的系统性优化指南,帮助开发者突破飞控“黑箱”,实现更稳定、可靠的飞行控制。 阅读详情

相关推荐

qmt量化交易策略小白学习笔记第67期【qmt编程之获取ETF申赎清单】

qmt编程之获取ETF申赎清单

fanglue3705的博客 1773

[CSP-S模拟测试]:Race(数学+Trie树)

题目描述 一年一度的运动会开始了。有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天。在第$j$天($0\leqslant j\leqslant 2^{m-1}$)的比赛中,第$i$个选手的得分为$A[i]\ xor\ j$,然后从大到小排名,排名为$x$($x$从$0$开始)的同学会获得的积分,你需要求出每个同学最后总的积分和$q[i]$模$...

weixin_30394251的博客 344

半导体设备微振动控制:天棚阻尼PID与SIMULINK建模实战

半导体制造设备对微振动的敏感度已进入纳米级,光刻机、量测设备等一旦遭遇超过VC-C振动准则的扰动,便会出现套刻误差或检测误判。主动隔振技术通过传感器、控制器与执行器形成闭环,能有效抑制低频共振,其中天棚阻尼控制因物理概念清晰、鲁棒性强而成为工程首选。结合MATLAB/SIMULINK建模,可在设计阶段完成系统性能边界评估与参数整定,再通过C代码生成与FMU导出实现算法向控制器和跨平台仿真迁移。本文从VC-C指标拆解出发,依次讲解天棚阻尼PID控制原理、两自由度被控对象建模、控制增益估算、仿真验证方法,并给出

weixin_29169505的博客 326

Codeforces 1133E

题目链接 http://codeforces.com/contest/1133/problem/E 题意 nnn个学生,第iii个学生能力值为aiaiai,要把他们分成不超过kkk个且至少一个不为空的组,要求每个组内学生的能力值相差不超过5,问最多能有多少个学生能加入组。 思路 先排序,这样最后分组之后同一组的人一定是相邻的 设dp[i][j]dp[i][j]dp[i][j]表示考虑前iii个学生...

roMxx 509

SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase

随着去“IOE”化的潮流,近些年来,许多与国家相关的项目不约而同到地往”国产化“方向靠拢,不可避免地,一些项目可能需要进行数据库迁移。

4622

webpack性能优化-optimization.splitChunks.chunks中的“all“、“async“和“initial“

最初,chunks(以及内部导入的模块)是通过内部 webpack 图谱中的父子关系关联的。CommonsChunkPlugin 曾被用来避免他们之间的重复依赖,但是不可能再做进一步的优化。 ——摘自 webpack 从 webpack v4 开始,移除了 CommonsChunkPlugin,取而代之的是 optimization.splitChunks。 而关于 optimization.splitChunks 中的chunks,webpack 官方文档却没有很好的进行举例解释,只说明了 async.

程序员秋风的博客 3137

合唱团_牛客网【动态规划实现】

有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 输入描述: 每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值...

ty6693的博客 469

基于YOLOv8的端面小目标计数解决方案: 多头检测器+小缺陷到大缺陷一网打尽的GiraffeDet+Wasserstein Distance Loss | 助力工业小目标缺陷检测

端面小目标计数部署解决方案 | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.936提升至0.955

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1955

阅读(Read)

没有原题 似乎来自某校模拟赛…. Description 热爱看书的你有N本书, 第i本书的种类为A[i]. 你希望每天能够看一本书, 但是不希望连续两天看种类相同的书. 为了达成这个条件, 你需要选择一些书不看, 作为一个好学生, 你希望不看的书尽可能少, 求最少可以有多少书不看. Input 为了避免输入文件过大, 我们采取如下方式生成A[i]. 第一行读入两个个整数M, K. ...

Beginner_df016 1144

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1567

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

牛客小白月赛24题解(B、C)

B题: 链接:组队 来源:牛客网 题目描述 你的团队中有 nnn 个人,每个人有一个能力值 aia_iai​,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的差值必须要小于等于 kkk ,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛? 输入描述: 第一行一个整数 TTT,表示案例组数。每个案例有两行:第一行两个正整数 n,kn,kn,k ,表示人的数量。第二行n个以空格分隔的整数 aia_iai​ ,表示每个人的能力值。 输出描述: 每个案例输出一

艾 1962

WPF在特定领域的应用:打造一款专业的图像编辑工具

WPF在特定领域的应用:打造一款专业的图像编辑工具,在软件开发的广阔领域中,Windows Presentation Foundation(WPF)以其强大的图形渲染能力和丰富的用户界面控件,为开发者提供了构建高性能、美观应用程序的平台。图像编辑工具作为一种对图形处理要求极高的应用类型,WPF 的特性使其成为理想的选择。本文将深入探讨如何使用 WPF 打造一款专业的图像编辑工具,涵盖从基础概念到实际代码实现的各个方面。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

Codeforces 626F Group Projects

题目大意 有n个学生,每个学生有一个能力值%a_i%

qq_45717538的博客 326

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

XTU-OJ 1456-分类

比如,有4个队员能力值为5,7,6,6,将其分成2个团队。如果{5,6}为一队,{6,7}为另一队,那么能力差值最大值为1;如果{5,7}一队,{6.6},那么能力差值最大值为2。上述例子中,能力差值最大值的最小为1。n个队员,编号为1∼n,第i号人的能力值为ai,现在你想把这些人分成m个团队。每个样例的第一行是两个整数n(2≤n≤10000), m(2≤m≤n),表示队员数。第二行是n整数ai, (1≤ai≤109),表示队员的能力值。第一行是一个整数T(1≤T≤100),表示样例的个数。

Jay_is_Chou的博客 969

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

11.1 T3.race(Trie+x^2的转化)

题目描述 一年一度的运动会开始了. 有N个选手参赛, 第i个选手有一个能力值Ai, 比赛一共进行了 2^M天. 在第j天(0⩽ j⩽2^M−1 )的比赛中, 第i个选手的得分为A[i] xor j, 然后从大到小排名, 排名为x(x从0开始)的同学会获得 x^2的积分, 你需要求出每个同学最后总的积分和q[i]模 1e9+7 的结果p[i]. 为了避免输出文件过大, 你只要输出p[i]的异或和

Coco_T的博客 930

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

NOIP蒟蒻组初赛攻略

蒟蒻们的过关攻略!

Qihonghao_的博客 946

2017.11.01 东北师大附中联考题目

%%%神cansult%%%Refan 吊打隔壁学长day1 T1 Set(set.cpp/c/pas, 1s, 64MB) 题目描述 你手上有N个非负整数, 你需要在这些数中找出一个非空子集, 使得它的元素之和能被N整除. 如果有多组合法方案, 输出任意一组即可. 注意:请使用高效的输入输出方式避免输入输出耗时过大. 输入格式 第一行一个整数N, 代表数字个数

A_Comme_Amour的博客 1966

2019.11.1 noip模拟赛

T1 Set 【题目描述】 你手上有 N 个非负整数, 你需要在这些数中找出一个非空子集, 使得它的元素之和能被N 整除. 如果有多组合法方案, 输出任意一组即可. 注意: 请使用高效的输入输出方式避免输入输出耗时过大. 【输入格式】 第一行一个整数 N, 代表数字个数. 接下来一行 N 个数, 代表你手上的数. 【输出格式】 如果无解, 输出-1. 否则, 第一行输出一个整数 M, 代表你选择的...

qq_43041641的博客 339

与DB某学校的联zha考chuan(11.1)(鸽巢+乱搞+x^2的转化)

这次联考,是我近年来最炸穿的一次。。。T1.set题目描述 你手上有N个非负整数, 你需要在这些数中找出一个非空子集, 使得它的元素之和能被N整除. 如果有多组合法方案, 输出任意一组即可. 注意: 请使用高效的输入输出方式避免输入输出耗时过大.输入格式 第一行一个整数N, 代表数字个数. 接下来一行N个数, 代表你手上的数. 输出格式 如果无解, 输出-1. 否则, 第一行输出一个整

Coco_T的博客 951

[CSP-S模拟测试]:Read(数学)

题目描述 热爱看书的你有$N$本书,第$i$本书的种类为$A[i]$。你希望每天能够看一本书,但是不希望连续两天看种类相同的书。为了达成这个条件,你需要选择一些书不看,作为一个好学生,你希望不看的书尽可能少,求最少可以有多少书不看。 输入格式 为了避免输入文件过大,我们采取如下方式生成$A[i]$。第一行读入两个个整数$M$,$K$。接下来一行读入$M$个整数$count[i]...

weixin_30394251的博客 263

鸽巢原理(入门) 之 poj 2356

//[3/27/2014Sjm] /* 鸽巢原理:若n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或者更多的物体 解决poj2356: 问题简化: 有n个数字,a1,a2,a3...,an,找出连续的数字串,使数字串的和可整除n。 若存在,则输出数字串个数,并依次输出数字串;否则,输出0。 分析: 依次求出sum[1]=a1,s...

weixin_30654419的博客 205

(动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积

第2关:最强战队 挑战任务 绿盟和各大名企合作,举办编程能力大赛,需要选拔一支参赛队伍。队伍成员全部来自“绿盟杯”中表现优秀的同学,每个同学都根据在比赛中的表现被赋予了一个能力值。现在被召集的N个同学已经集结完毕,他们按照编号依次站成了一排。 你需要编写一个程序,从这N个同学中选出S个同学,要求选出的同学的能力值的乘积最大,且要求被选出的相邻两个同学的编号的差不超过D。 编程要求 补全右...

Ferryman__的博客 3023

X I N的开始

Hi,未来的我,今天我在这里开垦出的这片新田地,希望你能好好耕耘呢 知识,经验,体会,生活 从X I N开始

Smiling_Morning的博客 469

【BZOJ5085】最大 鸽巢原理

【BZOJ5085】最大 Description 给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形的价值。 Input 第一行两个数n,m,接下来n行每行m个数,用来描述矩形 n, m ≤ 1000 Output 输出一个数表示答案 Sample Input 2 2 1 2 3 4 Sa...

aodanchui1057的博客 175

NOIP——鸽巢原理

或者把正方形分成四个方块,在每个方块里选择一个点,任意两个点的距离是大于根号2除以2,但是选择第五个点,无论选在哪个方块,哪个方块中的两个点都是小于对角线的一半。证明:任选7个元素,比如说选择0、1、2、3、4、5,还剩下6、7、8、9、10,在这5个元素中选择一个,那么无论选择谁都是可以和已选元素配对等于10。A个物品放入n个盒子中,A不是n的倍数,则至少有一个盒子中不少于[A/n]+1个物品。【定理1.1】 如果把N+1个物品放入N个盒子中,那么至少有一个盒子中有两个或更多的物品。

lihaoen_666的博客 333
上一篇: NOIP2009 解题报告
下一篇: 强连通分量 & 割点/桥 & 点/边双连通分量 [模板]
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值