牛客周赛113

news/2025/10/14 14:31:20/文章来源:https://www.cnblogs.com/alij/p/19141031

(0条未读通知) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

E题

首先我们预处理每个数组从\(n\)个数中选择\(i\)个数,其和模495为\(j\)的方案数,可以使用三维\(dp[i][j][k]\)数组表示前\(i\)个数中选\(j\)个数,他们的和对495取模为\(k\)的方案数,初始化\(dp[0][0][0]=1\),可以写出转移方程:

\[dp[i][j][k]=\begin{cases}dp[i-1][j][k]&j=0,\\dp[i-1][j][k]+dp[i-1][j-1][(k-a[i]+495)\%495]&else.\end{cases} \]

这里我们可以使用滚动数组优化掉第一维,用\(dp[i][j]\)表示从\(n\)个数中选\(i\)个数,其和模495为\(j\)的方案数。

vector<vector<int>> dp(n+1,vector<int>(m,0));dp[0][0]=1;for(int i=1;i<=n;i++){auto ndp=dp;for(int j=1;j<=n;j++){for(int k=0;k<m;k++){int v=(a[i]+k)%m;ndp[j][v]=(ndp[j][v]+dp[j-1][k])%mod;}}dp=ndp;}

之后我们将\(dpa\)\(dpb\)都求出来之和,因为后面求解答案时,我们要枚举\(a\)选了\(i\)个元素,那么\(b\)的贡献为\(\sum_{j=0}^{i}{dpb[j][k]}\),所以我们再对\(b\)求一个前缀和,\(dpb[i][j]\)表示至多选\(i\)个元素时,他们的和模495为\(j\)的方案数之和。

for(int j=0;j<m;j++){for(int i=1;i<=n;i++){dpb[i][j]=(dpb[i-1][j]+dpb[i][j])%mod;}
}

这样我们就可以求解答案了,枚举从\(a\)中选择的个数\(i\),枚举\(a\)模495为\(j\),枚举\(b\)模495为\(k\),那么答案为:

vector<int> ans(m,0);for(int i=0;i<=n;i++){for(int j=0;j<m;j++){if(dpa[i][j]==0) continue;for(int k=0;k<m;k++){if(dpb[i][k]==0) continue;int v=(j+k)%m;ans[v]=(ans[v]+dpa[i][j]*dpb[i][k]%mod)%mod;}}}

但是wa掉了,只过了25%,太构思了,检查很多遍了。

不如先写F

这个提交非常不错,值得学习。

(0条未读通知) 代码查看

F题

给定一个长度为\(n\)的数组,给定\(q\)个操作,执行两种操作:

  • \(1\space x\space y\):将数组的第\(x\)为修改为\(y\)
  • \(2\space l\space r\):查询在区间\([l,r]\)内任取两个元素,其乘积是495的倍数的方案数。

很明显可以看到操作涉及单点修改区间查询,所以我们可以考虑使用树状数组来维护信息。对于区间内任选两个数,其乘积要是495的倍数,那么我们可以对495的所有因数开一个树状数组,维护这个因数的倍数的出现次数。但是会有一个问题,比如\(105=3\times 5\times 7\),既是3的倍数,又是5的倍数,也是15的倍数,那么这个数肯定只能够被算一次,所以我们取\(g=gcd(a[i],495)\)作为\(a[i]\)贡献的因数,这样保证每个数\(a[i]\)一定只会被计算一次,这样我们就可以直接做了。

预处理495的因数以及下标映射:

const int m=495;
//fac[i]表示m的第i个因数,pm[i]表示m的因数i在fac数组中的下标
vector<int> fac(13),pm(m+1);
int tot=0;//计数
for(int i=1;i<=m;i++){if(m%i==0){fac[++tot]=i;pm[i]=tot;}
}

初始化:

vecotr<Fenwick> tr(13,Fenwick(n));
for(int i=1;i<=n;i++){int g=gcd(a[i],m);tr[pm[g]].update(i,1);
}

对于\(update\)操作:我们先将原来位置\(x\)\(a[x]\)的贡献撤销,再将\(a[x]:=y\),再加上\(a[x]\)的贡献。

int g=gcd(a[x],m);
tr[pm[g]].update(x,-1);
a[x]=y;
g=gcd(a[x],m);
tr[pm[g]].update(x,1);

对于\(query\)操作:我们用\(cnt[i]\)表示第\(i\)个因数的贡献次数,求出\(cnt\)数组;之后我们枚举不同的因数组合\((i,j)\),判断\(m\mid fac[i]\times fac[j]\),然后求\(cnt[i]\times cnt[j]\)贡献即可。两个注意点:(1)注意枚举时\(i\leq j\),避免重复统计;(2)\(i=j\)时,贡献为\(cnt[i]\times(cnt[i]-1)/2\)

vector<int> cnt(13,0);
for(int i=1;i<=12;i++){cnt[i]=tr[i].query(r)-tr[i].query(l-1);
}
int ans=0;
for(int i=1;i<=12;i++){for(int j=i;j<=12;j++){int g=gcd(fac[i]*fac[j],m);if(g==m){if(i==j) ans+=cnt[i]*(cnt[i]-1)/2;else ans+=cnt[i]*cnt[j];}}cout << ans << endl;
}

这样就解决问题了,树状数组模板为:

struct Fenwick {vector<int> sum;int n;Fenwick(int size) : n(size), sum(size + 2, 0) {}int lowbit(int x){return x&-x;}void update(int pos,int x){for(int i=pos;i<=n;i+=lowbit(i))sum[i]+=x;}int query(int pos){int res=0;for(int i=pos;i;i-=lowbit(i))res+=sum[i];return res;}void init(){for(int i=0;i<=n;i++){sum[i]=0;}}
};

法二:线段树+状压

大致思路是线段树的\(node\)节点为:

struct segment{int l,r;vector<int> cnt;//3 3 5 11//假如i=13=(1101),也就表示是3*3*11倍数的数,cnt[i]表示这个状态的个数//当然这里也是和m的最大公因数
}

因为有状压,所以我们还需要一个\(encode\)函数,用来对\(a[i]\)进行转化为状态。\(pushup\)函数就将\(cnt\)数组合并就行,因为是单点修改,我们不需要\(pushdown\)函数了,\(update\)函数就是一样的先将\(a[x]\)的贡献撤销,然后使用\(encode\)\(y\)进行转换,然后加上贡献。

最关键的就是\(query\)函数了,这个和区间合并是一样的,每次我们返回的是一个\(vector<int>cnt\)数组。然后在\(op=2\)中,我们得到了\(cnt\)数组之后,在枚举状态\((i,j)\)时,需要注意这两个状态表示的数的乘积能否被\(m\)整除,然后和第一种方法一样,统计答案就好。

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

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

相关文章

如何在统信系统中将 Avalonia 软件程序打包 Deb 安装包

如何在统信系统中将 Avalonia 软件程序打包 Deb 安装包一、简介    太久没有写博客了,不是不想写,而是太忙了。最近我在使用 Avalonia UI 框架开发一个跨平台的应用程序,Avalonia 本身来说,还好了,社区很活跃…

分组密码算法工作模式

安全需求 1.机密性需求 保密工作模式:ECB模式、CBC模式、CTR模式 2.完整性、不可否认性 认证工作模式:CMAC 3.机密性、完整性、不可否认性 加密认证工作模式:EtM算法、MtE算法、GCM模式 保密工作模式 ECB模式 电子码…

2025 年山西/在职研究生培训机构推荐榜:同等学力申硕培训机构,聚焦数智化与个性化学习新范式

随着终身学习理念普及和职场竞争加剧,2025 年在职研究生教育市场呈现出 “技术驱动、精准服务” 的新趋势。政策层面,非全日制研究生与全日制同等效力的落实,叠加 AI 技术在教育领域的深度渗透,推动行业从 “规模扩…

2025 年涡街流量计厂家推荐,湖北南控仪表科技有限公司技术创新与行业应用解决方案解析

行业背景在工业自动化进程不断加快的当下,流量测量作为工业生产中的关键环节,其准确性与稳定性直接影响企业的生产效率、成本控制及安全运营。涡街流量计凭借结构简单牢固、测量精度高、应用范围广等优势,已成为众多…

2025 年超声波流量计厂家推荐,湖北南控仪表科技有限公司产品技术与行业应用解决方案解析

在工业自动化与能源管理精细化发展的双重驱动下,超声波流量计凭借非接触式测量、高精度、低维护需求等优势,成为流量测量领域的核心设备。2025 年全球超声波流量计市场规模将突破 169.31 亿元,石油化工、市政供水、…

ArcGIS 10.2.2 字符串长度为20却仅能输入3个汉字的解决方法

ArcGIS 10.2.2 字符串长度为20却仅能输入3个汉字的解决方法问题: 字符串长度为20,却仅能输入3个汉字。 原因: 长度20为字节,非字符。 解决方法: 安装补丁 链接:https://pan.baidu.com/s/1MNobUc5FLqkGloNTuu_64w…

2025 年涡轮流量计厂家推荐:湖北南控仪表科技有限公司设备供应与多行业适配解决方案

在工业生产过程中,流量测量是把控生产流程、保障产品质量的关键环节,而涡轮流量计凭借测量精度高、响应速度快、量程范围广的特点,在液体、气体等介质的流量测量场景中应用广泛,涵盖节能、环保、市政工程、化工、核…

OAuth/OpenID Connect安全测试全指南

本文详细介绍了OAuth和OpenID Connect在现代Web应用中的安全测试案例,涵盖端点侦察、开放重定向、代码重放攻击、CSRF防护、令牌生命周期管理等关键测试场景和防护建议。Web应用渗透测试:OAuth/OpenID Connect测试案…

采用虚幻引擎(UE5)打造黑夜场景氛围

采用虚幻引擎(UE5)打造黑夜场景氛围pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

2025 年电磁流量计厂家推荐:湖北南控仪表科技有限公司专业设备供应与行业适配解决方案

行业背景在工业自动化快速发展的当下,流量测量作为工业生产中的关键环节,直接关系到生产效率、成本控制与产品质量。电磁流量计凭借其能精准测量导电液体流量、不受流体密度、粘度等参数影响的特性,在节能、环保、市…

90%企业忽略的隐藏成本:Data Agent如何降低数据分析总拥有成本(TCO)

引言:数据分析的“成本冰山”与决策者的认知盲区 一个令人深思的现实是:许多企业每年在商业智能(BI)平台上投入超过10万美元,却仍在为低下的工具采用率和决策效率而苦恼。根据 Querio.ai的分析,传统BI工具的投资…

adb logcat 根据Tag 过滤日志

adb logcat根据tag获取需要指定标签(tag)和日志级别adb logcat [TAG:LEVEL ] [TAG:LEVEL ] ... LEVEL: 可以选择:[V D I W E S]中其中一个 TAG:X 的作用为: 输出标签为TAG的log级别大于X的信息. 例如: adb logcat Te…

详细介绍:Spring Boot 详细介绍

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年艺术涂料厂家最新推荐排行榜,全方位呈现优质品牌特色与竞争力

随着家居装饰与商业空间装修需求的不断升级,艺术涂料凭借丰富的纹理、多样的色彩及良好的性能,成为众多消费者与合作商的优选装饰材料。然而,当前艺术涂料市场品牌繁杂,部分品牌存在产品质量参差不齐、工艺技术落后…

爬虫遇到的问题与解

学习爬虫过程中遇到的一些问题 requests的content和text方法的区别 Requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。其中返回的网页部…

自动化测试框架选型指南:数据驱动、关键字驱动还是混合模式?

做自动化测试的同学,大概率都踩过 “框架选错” 的坑:明明花了几周搭好框架,落地时却发现用例维护比手动测试还麻烦;或者写好的脚本,换个测试场景就得大改,完全没起到 “自动化” 的作用。做自动化测试的同学,大…

直播软件搭建避坑!从直播源码选型到运维,3步搞定上线+降本60%

在数字化浪潮的推动下,直播行业早已不再是少数巨头的游戏。无论是教育机构、电商品牌、社交平台还是企业内训,拥有一个自主可控的直播平台,都成为了赋能业务、连接用户的重要战略。许多有远见的决策者正将目光投向“…

LatchUtils:简化Java异步任务同步的利器

转自https://mp.weixin.qq.com/s/p1nwmRl6-dyThqJ6StxC-A在Java应用开发中,为了提升系统性能和响应速度,我们经常需要将一些耗时操作(如调用外部API、查询数据库、复杂计算等)进行异步并行处理。当主流程需要等待所…

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

视频效果:一、前言 在AI原生应用开发的时代,传统的后端架构正在被重新定义。本文将带你体验如何使用 Qoder、阿里云ADB Supabase 和通义千问图像编辑模型(Qwen Image Edit),快速搭建一个完整的 AI 手办生图 Flutt…

实验报告2

实验1 问题1:srand(time(NULL))设置时间为随机种,保证每次随机数都不一样 问题2:在两个班中随机抽五个学号实验2 问题1:每次循环总价不清空,导致后面询问时数据出错 问题2:结束这一轮循环,跳过后面的语句;实验3 #inclu…