2022ICPC杭州站

news2024/11/19 22:42:16

A. Modulo Ruins the Legend

题目链接:Problem - A - Codeforces

样例1输入:

6 24
1 1 4 5 1 4

 样例1输出:

1
0 5

样例2输入:

7 29
1 9 1 9 8 1 0

样例2输出:

0
0 0

题意:给你一个长度为n的数组a[],现在让找到一个长度为n的等差序列b[],使得\sum_{i=1}^{n}(a[i]+b[i])对m取余后的结果尽可能小。输出等差序列的首项s和公差d。

分析:由于我们是想要使得a数组和b数组的和对m的取余结果尽可能小,而a数组的和是已知的,不妨设为sum,b数组的和可以用首项和公差直接表示出来,就是n*s+n*(n+1)/2*d.那么我们就是要使得sum+n*s+n*(n+1)/2*d对m的取余结果尽可能较小。我们发现只有等式n*s+n*(n+1)/2*d=k*gcd(n,n*(n+1)/2)有解,这是由于扩展欧几里得可以得到的。不妨假设g=gcd(n,n*(n+1)/2),不妨假设对m取余的结果最小为ans,那么就有等式sum+k2*g=-k1*m+ans,也就是g*k2+m*k1=ans-sum,由于ans是属于区间[0,m-1]的,那么ans-sum就是属于区间[-sum,m-1-sum]的,那么我们就可以在这个区间内找到一个最小的值val使得g*k2+m*k1=val有解,那么我们由扩展欧几里得可以知道val只要是gcd(g,m)的倍数即可,那么不妨假设gcd(g,m)=gg,那么我们就是找到一个最小的l使得l*gg属于区间[-sum,m-1-sum],这是很容易找的,过程就不说了,找到l之后我们就能够得到ans-sum的值,那么ans的值就可以得到了,通过等式g*k2+m*k1=ans-sum我们可以反解出k1和k2,那么我们将k1代入到等式sum+n*s+n*(n+1)/2*d=-k1*m+ans可以得到n*s+n*(n+1)/2*d=ans-k1*m-sum,那么我们就可以直接用扩展欧几里得直接反解出s和d,但是s和d可能不在区间[0,m-1]中,因为s增加m就会使得总和增加m*n,d增加m就会使得总和增加n*(n+1)/2*m,所以不会影响答案,所以可以直接将s和d对m取余。

 代码:(注意开__int128)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
ll gcd(ll x,ll y)
{
	if(!x) return y;
	return gcd(y%x,x);
}
ll exgcd(ll a,ll b,__int128 &x,__int128 &y)
{
    if(a==0)
    {
        x=0;y=1;
        return b;
    }
    ll d=exgcd(b%a,a,y,x);
    x-=b/a*y;
    return d;
}
int main()
{
	ll n,m,t,sum=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&t);
		sum+=t;
	}
	ll g=gcd(n,n*(n+1)/2);
	ll gg=gcd(g,m);
	ll l=-sum/gg;
	ll ans_sum=l*gg;
	ll ans=ans_sum+sum;
	__int128 k1,k2;
	exgcd(m,g,k1,k2);
	k1*=l;
	k2*=l;
	__int128 s,d;
	exgcd(n,n*(n+1)/2,s,d);
	s*=(ans_sum-k1*m)/g;
	d*=(ans_sum-k1*m)/g;
	s=(s%m+m)%m;
	d=(d%m+m)%m;
	printf("%lld\n",(ll)ans);
	printf("%lld %lld\n",(ll)s,(ll)d);
	return 0;
}

C. No Bug No Game

题目链接:Problem - C - Codeforces

样例输入: 

4 5
2 1 3
2 1 1
2 3 1
2 1 3

样例输出:

9

题意:有n个物品,背包容量为k,每个物品重量为pi,取的重量不同,获得的价值也不同,从1到pi分别为wij,如果当前背包容量足够,则必须取完整的重量,否则才可以取部分重量来填满剩余的背包容量,问能取得的最大价值是多少?

分析:通过思考我们可以发现一个特点就是最多只能有一个物品取部分价值,因为一个物品取部分价值的前提是当前背包剩余容量是不能把当前物品全部装下的,那么取完这个物品后背包就装满了,无法再容纳其余物品了,所以我们可以直接枚举哪个物品会被取部分价值,然后再枚举取的价值,那么除了装部分物品占用的体积外,其余的体积装的货物都是完全装入的,不存在部分的问题,所以也就是一个背包问题,但是我们不可能每次考虑一个物品取部分价值时都重新用背包处理一遍其余物品所能获得的最大价值,所以我们考虑使用前后缀背包优化,这个时候加入我们取第i个物品的体积为j,那么剩余的背包体积就是k-j,我们可以枚举前i-1个物品所占用的体积p,那么i+1个物品及其之后所占用的体积就是k-j-p,而这两部分我们都可以事先通过背包预处理出来,所以总的复杂度就是O(n*10*k).

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=3e3+10;
int f[2][N][N];
int p[N];
vector<int> v[N];
int main()
{
	int n,m;
	cin>>n>>m;
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&p[i]);
		sum+=p[i];
		for(int j=1;j<=p[i];j++)
		{
			int t;
			scanf("%d",&t);
			v[i].push_back(t);
		}
	}
	if(sum<m)
	{
		int ans=0;
		for(int i=1;i<=n;i++)
			ans+=v[i].back();
		printf("%d\n",ans);
		return 0;
	}
	memset(f,-1,sizeof f);
	f[0][0][0]=0;
	f[1][n+1][0]=0;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=m;j++)
	{
		f[0][i][j]=f[0][i-1][j];
		if(j>=p[i]&&f[0][i-1][j-p[i]]!=-1)
			f[0][i][j]=max(f[0][i][j],f[0][i-1][j-p[i]]+v[i].back());
	}
	for(int i=n;i>=1;i--)
	for(int j=0;j<=m;j++)
	{
		f[1][i][j]=f[1][i+1][j];
		if(j>=p[i]&&f[1][i+1][j-p[i]]!=-1)
			f[1][i][j]=max(f[1][i][j],f[1][i+1][j-p[i]]+v[i].back());
	}
	int ans=0;
	for(int i=1;i<=n;i++)//枚举选取部分的商品
	for(int j=1;j<=p[i];j++)//枚举选取的部分 
	{
		int res=m-j;//剩余部分 
		for(int l=0;l<=res;l++)//枚举左半部分商品的
		{
			int r=res-l;
			if(f[0][i-1][l]!=-1&&f[1][i+1][r]!=-1)
				ans=max(ans,v[i][j-1]+f[0][i-1][l]+f[1][i+1][r]);
		}
	}
	printf("%d\n",ans);
	return 0;
} 

D. Money Game

题目链接:Problem - D - Codeforces

样例输入:

2
4 2

样例输出:

4.00 2.00

题意:给你一个长度为n的数组a,在每轮循环会依次执行下列操作:

a[2]+=0.5*a[1]

a[3]+=0.5*a[2]

……

a[n]+=0.5*a[n-1]

a[1]+=0.5*a[n]

现在问经过2022的1204次方轮循环后的数组的值是多少

分析:容易发现,每轮循环后数组的和是不变的,而且只有当a[1]=2*a[2],且a[2]=a[3]=……=a[n],时数组就会固定,而给定的操作次数近似于无穷大,所以数组会趋于稳定,那么不妨设加和为sum,那么a[1]=2/(n+1)*sum,而a[2]=a[3]=……=a[n]=sum/(n+1).

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin>>n;
	long long sum=0;
	for(int i=1;i<=n;i++)
	{
		long long t;
		scanf("%lld",&t);
		sum+=t;
	}
	printf("%.12lf",2.0*sum/(n+1));
	for(int i=2;i<=n;i++)
		printf(" %.12lf",1.0*sum/(n+1));
	return 0;
}

F. Da Mi Lao Shi Ai Kan De

题目链接:Problem - F - Codeforces

样例输入: 

6
1
biebie
1
adwlknafdoaihfawofd
3
ap
ql
biebie
2
pbpbpbpbpbpbpbpb
bbbbbbbbbbie
0
3
abie
bbie
cbie

样例输出:

biebie
Time to play Genshin Impact, Teacher Rice!
Time to play Genshin Impact, Teacher Rice!
bbbbbbbbbbie
Time to play Genshin Impact, Teacher Rice!
abie
bbie
cbie

题意:有n组字符串每组中有m个字符串,要求输出含有"bie"的字符串,同一字符串只输出第一次,如果一组字符串中都没有能输出的字符串,则输出"Time to play Genshin Impact, Teacher Rice!"

分析:这个是签到题,直接模拟即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
string s;
int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	map<string,int> mp;
	while(T--)
	{
		int n;
		cin>>n;
		bool flag=false;
		for(int i=1;i<=n;i++)
		{
			cin>>s;
			int len=s.size();
			for(int j=0;j+2<len;j++)
			{
				if(s[j]=='b'&&s[j+1]=='i'&&s[j+2]=='e')
				{
					if(mp[s]) break;
					mp[s]=1;
					flag=true;
					cout<<s<<"\n";
					break;
				}
			}
		}
		if(!flag) cout<<"Time to play Genshin Impact, Teacher Rice!\n";
	}
	return 0;
}

K. Master of Both

题目链接:Problem - K - Codeforces

样例输入: 

5 3
aac
oiputata
aaa
suikabudada
aba
abcdefghijklmnopqrstuvwxyz
qwertyuiopasdfghjklzxcvbnm
aquickbrownfxjmpsvethlzydg

样例输出:

4
3
4

题意:给定n个字符串,然后给定m种字典序规则,在这m种字典序规则下求出这n个字符串的逆序对数目。

分析:发现m很大,所以我们没法对每一种排序规则都去求一遍逆序对数目。显然是要先预处理出来一些东西用来求解逆序对数目。我们判断两个字符串的字典序大小关系可以发现他们的字典序大小关系只取决于一对字母的字典序大小关系,不妨我们现在要判断字符串s1和字符串s2的字典序大小关系,那么假设他们前i个字符是相同的,第i+1个字符是不同的,那么无论他们前i个字符的字典序规则是怎样的,都无法直接判断出这两个字符串的字典序大小关系,只有第i+1个字符的字典序关系才能决定这两个字典序的大小关系。可以发现两个字符的对应关系最多有26*26种,所以我们可以预处理出来每种对应关系从而对于每种规则我们只需要统计一下每种关系增加的逆序对数量即可。具体是什么意思呢,不妨假设cnt[a][b]代表由字符对(a,b)影响的且a所在字符串的编号小于b所在字符串的编号的字符串对数目,那么一旦在新的字典序规则下a的字典序大于b的字典序,那么(a,b)就会为答案贡献出cnt[a][b],这都是由这对字符所产生的贡献,我们按照这样的方法统计一下即可得到每种字符排序规则下的逆序对数目。怎么统计cnt数组呢,这个可以在建tire树的时候统计,加入当前字符串,则对于当前字符串的每一位都可以遍历其他字母,这个时候其他字母都是在当前字符之前出现的,而且出现次数已知,所以我们就可以用这个直接更新。

有一点需要注意,由于可能会出现字符串  abc和字符串abcd比较字典序的情况,所以我们可以给每个字符串后面加一个字典序比较小的字符,这里用‘a’-1来表示,然后就可以正常求解了。

细节见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=2e6+10;
int son[N][30],idx,sum[N][30];
long long cnt[1003];
char s[N];
void insert()
{
	int p=0;
	for(int i=0;s[i];i++)
	{
		int k=s[i]-'a'+1;
		if(!son[p][k]) son[p][k]=++idx;
		for(int j=0;j<27;j++)
			cnt[(j+1)*27+k+1]+=sum[p][j];
		sum[p][k]++;
		p=son[p][k];
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s);
		int len=strlen(s);
		s[len]='a'-1;//往末尾添加一个小于小写字母的字符
		s[len+1]=0;
		insert();
	}
	int pos[30];
	while(m--)
	{
		scanf("%s",s+1);
		s[0]='a'-1;
		for(int i=0;i<27;i++)
			pos[s[i]-'a'+1]=i;
		long long ans=0;
		for(int i=0;i<27;i++)
		for(int j=0;j<27;j++)
			if(pos[i]>pos[j])//i的字典序大于j的字典序,那么i在j前面出现多少次就会增加多少逆序对
				ans+=cnt[(i+1)*27+j+1];
		printf("%lld\n",ans);
	}
	return 0;
}

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

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

相关文章

【NI Multisim 14.0原理图的设计——原理图分类】

目录 序言 一、原理图的设计 &#x1f34a;知识点&#xff1a; 二、原理图分类 &#x1f349;1.平坦式电路 &#x1f349; 2.层次式电路图 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和…

【用JS自制表格软件玩数据】10. 为表格脚本设计一个语法解析器

设计脚本语言的语法解析器概述脚本源码语法预览运行效果如下图设计计算符号的优先级定义一些关键词生成一份关键词的map方便引用枚举关键词的类型错误异常的捕获字符匹配代码的字符转化成迭代器关键词标记器词法分析器设计一个队列处理器源代码字符串迭代器代码的块级运行环境脚…

【HTML基础篇003】前端基础之CSS选择器大全

✨一、CSS的基本介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 ✨二、CSS的几种引入方式 &#x1f338;2.1、方法一&am…

连接查询之内连接(等值连接、非等值连接和自连接)

1、等值连接&#xff1a;表连接条件是等值关系&#xff0c;我们称为等值连接。 需求&#xff1a;查询每个员工所在部门名称&#xff0c;显示员工名和部门名&#xff1a; 查看员工表的ename和deptno字段信息&#xff1a; 查看部门表中的deptno和dname字段信息 SQL92语法&#x…

2023年最值得关注的机器人趋势TOP10

新兴的机器人技术趋势和预测满足了对工业自动化、数字化和可持续性的需求。仓库中的材料处理由自动移动机器人&#xff08;AMR&#xff09;和自动引导车辆&#xff08;AGV&#xff09;实现自动化。相关机构对8949家全球初创企业和2023年机器人趋势规模的样本进行了研究&#xf…

Linux的安装(云服务器专讲)

一、Linux环境的安装有一下几种方式&#xff1a;双系统或则将自己的笔记本搞成Linux系统——严重不推荐&#xff0c;这样安装成本高、并且容易把自己电脑弄坏。虚拟机推荐wmware player这是免费的&#xff0c;并且推荐是打在了centos7.x版本的&#xff0c;这个的好处就是不需要…

微信接入 ChatGPT(学习笔记,不作教程)

微信接入 ChatGPT前置条件接入前提去Linux虚拟机&#xff08;必须有go环境&#xff09;安装前先配置下ssh密钥生成新的ssh密钥检查将 SSH 密钥添加到 ssh-agent将 SSH 密钥添加到您在 GitHub 上的帐户上去github上将密钥复制在里面然后点击添加ssh密钥安转部署最后直接go run m…

【JavaSE】Java序列化详解

【JavaSE】Java序列化详解 文章目录【JavaSE】Java序列化详解一&#xff1a;什么是序列化和反序列化?二&#xff1a;序列化协议对应于 TCP/IP 4 层模型的哪一层&#xff1f;三&#xff1a;常见序列化协议有哪些&#xff1f;四&#xff1a;JDK 自带的序列化方式1&#xff1a;序…

广告业务系统 之 数据桥梁 —— “日志中心-曝光数据流转结算”

文章目录广告业务系统 之 数据桥梁 —— “日志中心-曝光数据流转结算”曝光数据流转结算管道式架构助力高可用管道式架构模式图流式链路中特殊的缓存设计一、二级缓存Nosql 数据型缓存组件s2s 监测上报广告业务系统 之 数据桥梁 —— “日志中心-曝光数据流转结算” 曝光数据…

SpringCloud微服务项目实战 - 5.自媒体文章审核

愤怒归根结底是为了达成目的的一种工具和手段&#xff0c;大声呵斥乃至拍桌子&#xff0c;目的都是通过震慑对方&#xff0c;进而使其听自己的话&#xff0c;因为他们也找不到更好的办法。 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff…

68.多尺度目标锚框的代码实现

在之前&#xff0c;我们以输入图像的每个像素为中心&#xff0c;生成了多个锚框。 基本而言&#xff0c;这些锚框代表了图像不同区域的样本。 然而&#xff0c;如果为每个像素都生成的锚框&#xff0c;我们最终可能会得到太多需要计算的锚框。 想象一个 561728 的输入图像&…

UG/NX 二次开发(C#)自动出2D零件图(标准件配置Bata版)

一、前言 昨天分享了自动出2D零件图的思路&#xff08;UG/NX 二次开发(C#)自动出2D零件图思路&#xff09;&#xff0c;今天整理了Q群里各位大佬的意见&#xff0c;结合当前实际项目情况&#xff0c;做了一个可配置的半自动出图版本&#xff0c;暂且称之为标准件配置Bata版。 虽…

steam/csgo搬砖项目详解

steam搬砖项目简单来说&#xff0c;就是在steam平台购买游戏装备到网易BUFF平台出售&#xff0c;赚取汇率差和装备差价。 我今天也就给大家讲解一下steam项目的原理&#xff0c;还有存在什么样的风险。 做steam搬砖需要什么准备&#xff1a; 1.手机 2.电脑 3.美服steam账号 4.…

【hcip】多点双向重发布实验

目录 1.拓扑图 2.要求 3.主要配置 4.测试 1.拓扑图 2.要求 达到所有目标最优&#xff0c;互有备份 3.主要配置 左边区域配置rip&#xff0c;右边区域配置ospf&#xff0c;以r2为例 [r2]rip [r2-rip-1]version 2 [r2-rip-1]network 12.0.0.0 [r2-rip-1]network 2.0.…

堆排序详细说明及实现-python

先了解什么是堆&#xff1a; 堆的定义 n个元素的序列 [ k1&#xff0c;k2&#xff0c;...&#xff0c;kn ]&#xff0c;满足以下的性质时称之为堆&#xff1a; ki≥k2i 且 ki≥k2i1 (1≤i≤ ) 或 ki≤k2i 且 ki≤k2i1 (1≤i≤ ) 如果采用顺序方式即用一维数组存储这个序列&…

《回眸2022·圆满收官||展望2023·砥砺奋发》

系列文章目录 文章目录系列文章目录寄言和CSDN相遇大学生活从小白到千粉博主回眸2022|圆满收官展望2023|砥砺奋发致每一个追梦人寄言 岁月不距&#xff0c;时节如流&#xff01;站在岁末的门槛前&#xff0c;回望2022这一年&#xff0c;不知你是否已经完美的书写完2022的答卷&…

计算机工作过程(超详细)

文章目录一、计算机组成框图二、思维导图三、部件剖析&#xff08;1&#xff09;存储器&#xff08;2&#xff09;运算器&#xff08;3&#xff09;控制器四、案例剖析&#xff08;重点&#xff09;&#xff08;1&#xff09;a2&#xff08;2&#xff09;a*b&#xff08;3&…

vscode配置Markdown snippet 的快捷键

Snippet 是&#xff1f; 不同文件的模板语法/代码片段&#xff0c;可以设置好后在不同类型文件快速插入&#xff0c;提高效率。 例如&#xff1a;可以在Markdown使用快捷键生成自己想要的模板内容&#xff0c;自定义输入时tab的跳转位置 具体设置 官方文档 生成snippet的在…

Apache Spark 机器学习 数据源 2

数据源 数据源作为机器学习的数据输入&#xff0c;以供给Spark进行机器学习&#xff0c;Spark技术框架除了支持Parquet、CSV、JSON以及JDBC这些常用的数据源&#xff0c;还提供一些特殊数据源的支持&#xff0c;例如&#xff0c;图像或者LIBSVM。 Parquet数据源 该数据源是a…

2023什么蓝牙耳机值得入手?值得入手的半入耳蓝牙耳机推荐

毫无疑问&#xff0c;近年来蓝牙耳机的外出使用频率越来越高&#xff0c;这是由于其外出携带的便捷性以及配置越来越高端、先进&#xff0c;而半入耳式蓝牙耳机又凭借更舒适的佩戴体验以及便携性受到用户的喜爱。但&#xff0c;面对形形色色的蓝牙耳机&#xff0c;不同价位、不…