【题解】2023牛客寒假算法基础集训营2

news2024/9/23 19:27:25

目录

  • A. Tokitsukaze and a+b=n (easy)
    • 思路
  • B. Tokitsukaze and a+b=n (medium)
    • 思路
  • Tokitsukaze and a+b=n (hard)
    • 思路
  • D. Tokitsukaze and Energy Tree
    • 思路
      • bfs
      • dfs
  • E. Tokitsukaze and Energy Tree
    • 思维
  • F. Tokitsukaze and Gold Coins (easy)
    • 思路
  • G. Tokitsukaze and Gold Coins (hard)
  • H. Tokitsukaze and K-Sequence
    • 思路
  • I. Tokitsukaze and Musynx
    • 思路
  • J. Tokitsukaze and Sum of MxAb
    • 思路
  • K. Tokitsukaze and Synthesis and Traits
    • 思路
  • L. Tokitsukaze and Three Integers
    • 思路

A. Tokitsukaze and a+b=n (easy)

思路

tag: 枚举 暴力
数据范围很小,可以直接暴力。

int n;
void solve()
{
    cin>>n;
    int l1,r1,l2,r2;
    cin>>l1>>r1>>l2>>r2;
    int res=0;
    set<PII>s;
    rep(i,l1,r1)
        if(n-i>=l2&&n-i<=r2)s.insert({i,n-i});
    cout<<s.size()<<endl;
}

B. Tokitsukaze and a+b=n (medium)

思路

tag: 贪心,二分
这题相对于A在范围上进行了扩大,所以不能采用暴力做法,不难发现,当第一个区间选取的越靠右时,则在第二个区间选取就越靠左,反之也成立,此时题目就对应了二分的两种板子做法(当然此题也可以O(1)写,这里不在赘述。

int n;
void solve()
{
    cin>>n;
    map<int,int>mp;
    int l1,r1,l2,r2;
    cin>>l1>>r1>>l2>>r2;
    int l=l1-1,r=r1;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(n-mid>=l2)l=mid;
        else r=mid-1;
    }
    int x=l;
    l=l1,r=r1+1;
    while(l<r)
    {
        int mid=l+r>>1;
        if(n-mid<=r2)r=mid;
        else l=mid+1;
    }
    int y=r;
    cout<<x-y+1<<endl;
}

Tokitsukaze and a+b=n (hard)

思路

tag :二分,容斥,哈希
B求两个区间,此题给了很多区间,有多少种选法,满足:从
m 个区间中选择两个区间 。
此时在我们面前的有两个问题:1.区间修改 2.找a=b-n
区间修改这里可以采用差分数组解决,那么a=b-n则用哈希表来解决
当我们枚举a时,判断有多少个b-n即可。
此时注意一个细节,我们这样寻找a->n-b,有可能a和b在一个区间的,这种情况怎么去除?我们可以将在同一个区间满足a=n-b的情况全部累加,再全部减去即可。

int n,m;
const int N=4e5+10;
int d[N];
const int mod=998244353;
int get(int l1,int r1,int l2,int r2)
{
    int l=l1-1,r=r1;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(n-mid>=l2)l=mid;
        else r=mid-1;
    }
    int x=l;
    l=l1,r=r1+1;
    while(l<r)
    {
        int mid=l+r>>1;
        if(n-mid<=r2)r=mid;
        else l=mid+1;
    }
    int y=r;
    return x-y+1;
}
void solve()
{
	cin>>n>>m;
	int s=0;
	rep(i,1,m)
	{
		int l,r;
		cin>>l>>r;
		s+=get(l,r,l,r);
		d[l]++,d[r+1]--;
	}
	int res=0;
	rep(i,1,N-1)d[i]+=d[i-1];
	rep(i,1,N-1)
	{
		if(n>=i)res=(res+d[i]*d[n-i]);
	}
	res=(res-s+mod)%mod;
	cout<<res<<endl;
}

D. Tokitsukaze and Energy Tree

思路

tag:贪心,dfs,bfs,树形DP
贪心的想,当一个大的权值点深度越深,则它被求sum的次数就越多,所以我们就往这个方向靠,求出每个点的深度,深度越深,则赋予其越大的权值,最后累加求和即可。

bfs

int n;
const int N=2e5+10;
int h[N],ne[N<<1],e[N<<1],idx;
int dep[N],w[N];
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void bfs(int u)
{
	queue<int>q;
	q.push(u);
	dep[u]=1;
	while(q.size())
	{
		int sz=q.size();
		for(int i=0;i<sz;i++)
		{
			auto t=q.front();
			q.pop();
			for(int i=h[t];~i;i=ne[i])
			{
				int j=e[i];
				dep[j]=dep[t]+1;
				q.push(j);
			}
		}
	} 
}
void solve()
{
	memset(h,-1,sizeof h);
	cin>>n;
	rep(i,2,n)
	{
		int a;
		cin>>a;
		add(a,i);
	}
	rep(i,1,n)cin>>w[i];
	bfs(1);
	sort(w+1,w+1+n);
	sort(dep+1,dep+1+n);
	int res=0;
	rep(i,1,n)res+=dep[i]*w[i];
	cout<<res<<endl;
}

dfs

int n;
const int N=2e5+10;
int h[N],ne[N<<1],e[N<<1],idx;
int dep[N],w[N];
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa)
{
	dep[u]=dep[fa]+1;
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa)continue;
		dfs(j,u);
	}
}
void solve()
{
	memset(h,-1,sizeof h);
	cin>>n;
	rep(i,2,n)
	{
		int a;
		cin>>a;
		add(a,i),add(i,a);
	}
	rep(i,1,n)cin>>w[i];
	dfs(1,0);
	sort(w+1,w+1+n);
	sort(dep+1,dep+1+n);
	int res=0;
	rep(i,1,n)res+=dep[i]*w[i];
	cout<<res<<endl;
}

E. Tokitsukaze and Energy Tree

思维

tag: 二分,数学,打表,找规律
在这里插入图片描述
均值不等式可得
由绝对值不等式可知,函数最小值在 n \sqrt n n 处,由于题目所求的是最小正整数,所以设g(x)是f(x)取整的函数,函数图像
在这里插入图片描述
可知我们的函数值在整数点的邻域内是保持不变的,所以此题我们求最小值并不能采用三分写法。但是二分可以啊(傲娇。
由于我们给的是一个固定的区间,所以我们求的最小值无非L,R, n \sqrt n n , ⌈ n ⌉ \lceil \sqrt n \rceil n ,四种情况,我们找到最小值的点,应该函数值相等的邻域的左端点,所以我们用求最小值的二分模板来解决

int l,r,n;
int f(int x)
{
    return n/x+x-1;
}
void solve()
{
    cin>>n>>l>>r;
    int sqrt_n=sqrtl(n);
    int f_l=f(l);
    int f_r=f(r);
    int pos=l,minv=f(l);
    if(f_l>f_r)
    {
        pos=r;
        minv=f(r);
    }
    if(sqrt_n>=l&&sqrt_n<=r&&minv>f(sqrt_n))
    {
        pos=sqrt_n;
        minv=f(sqrt_n);
    }
    sqrt_n++;
    if(sqrt_n>=l&&sqrt_n<=r&&minv>f(sqrt_n))
    {
        pos=sqrt_n;
        minv=f(sqrt_n);
    }
    int L=l,R=pos;
    while(L<R)
    {
        int mid=L+R>>1;
        if(f(mid)<=minv)R=mid;
        else L=mid+1;
    }
    cout<<R<<endl;
}

F. Tokitsukaze and Gold Coins (easy)

思路

tag:dfs,bfs,思维
求起点到终点最多可走多少格子,最简单的方法就是起点终点各跑一次bfs,然后找都可以做到的点。

const int N=5e5+10;
int n,k;
int g[N][4];
int st[N][4][2];
int dx[2][2],dy[2][2];
void bfs(PII start,bool f)
{
    queue<PII>q;
    q.push(start);
    if(f)st[start.x][start.y][f]=1;
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=0;i<2;i++)
        {
            int a=t.x+dx[i][f],b=t.y+dy[i][f];
            if(a<=0||a>n||b<=0||b>3)continue;
            if(g[a][b]==1)continue;
            if(st[a][b][f])continue;
            st[a][b][f]=1;
            q.push({a,b});
        }
    }
}
void solve()
{
    cin>>n>>k;
    dx[0][0]=0,dx[1][0]=1,dx[0][1]=0,dx[1][1]=-1;
    dy[0][0]=1,dy[1][0]=0,dy[0][1]=-1,dy[1][1]=0;
    rep(i,1,n)
        rep(j,1,3)g[i][j]=0;
    rep(i,1,n)
        rep(j,1,3)
            rep(k,0,1)st[i][j][k]=0;
    rep(i,1,k)
    {
        int x,y;
        cin>>x>>y;
        g[x][y]^=1;
    }
    bfs({1,1},0);
    bfs({n,3},1);
    int res=0;
    rep(i,1,n)
        rep(j,1,3)
            if(st[i][j][0]==st[i][j][1]&&st[i][j][0])res++;
    cout<<res<<endl;
}

G. Tokitsukaze and Gold Coins (hard)

待补。。。

H. Tokitsukaze and K-Sequence

思路

tag:哈希,差分,枚举,思维
我们发现,当前分成k组时,如果某种元素个数<=k,那么权值加上这一部分元素的个数,如果某种元素个数>k,则该种元素的造成的影响是k-1,累加即可。

int n;
const int N=1e5+10;
int a[N];
void solve()
{
	cin>>n;
	map<int,int>mp,mb;
	rep(i,1,n)cin>>a[i],mp[a[i]]++;
	for(auto x:mp)mb[x.y]++;
	vector<int>res(n+1,0);
	int s=mp.size();
	int cnt=0;
	rep(i,1,n)
	{
		s-=mb[i];
		res[i]+=(i-1)*s;
		cnt+=mb[i]*i;
		res[i]+=cnt;
	}
	rep(i,1,n)cout<<res[i]<<endl;
}

I. Tokitsukaze and Musynx

思路

tag: 贪心,哈希,容斥
贪心的想,总权值最大,可能存在一个点处于v的边界上,再看数据范围,因此我们可以枚举边界(即H),用map存一下分别对应的改变区间,最后,分别枚举不同的H求maxv即可。此题难点在于贪心的考虑H在v边界上最优。

int n,m;
const int N=2e5+10;
int x[N],a[5];
int v[10];
map<int,vector<int>>mp;
void solve()
{
	mp.clear();
	cin>>n;
	rep(i,1,n)cin>>x[i],x[i]-=1e8;
	rep(i,1,4)cin>>a[i];
	rep(i,1,5)cin>>v[i];
	rep(i,1,n)
	{
		rep(j,1,4)
		{
			mp[a[j]-x[i]+(j==4)].pb(-j);
			mp[a[j]-x[i]+(j==4)].pb(j+1);
		}
	}
	int res=v[1]*n;
	int maxv=res;
	for(auto x:mp)
	{
		for(auto y:x.y)
		{
			if(y>0)res+=v[y];
			else res-=v[-y];
		}
		maxv=max(res,maxv);
	}
	cout<< maxv<<endl;
}

J. Tokitsukaze and Sum of MxAb

思路

tag:思维
枚举每个 a i a_i ai发现,枚举到i时, r e s + = ( n + 1 ) ∗ a b s ( a [ i ] ) res+=(n+1)*abs(a[i]) res+=(n+1)abs(a[i]),之后每个循环,都加一个 a b s ( a [ i ] ) ( n − 1 )次 abs(a[i])(n-1)次 abs(a[i])n1)次,所以对于每个 a [ i ] , r e s + = 2 ∗ n ∗ a b s ( a [ i ] ) a[i],res+=2*n*abs(a[i]) a[i]res+=2nabs(a[i])

int n;
const int N=1e5+10;
int a[N];
void solve()
{
    cin>>n;
    int res=0;
    rep(i,1,n)cin>>a[i];
    rep(i,1,n)res+=2*n*abs(a[i]);
    cout<<res<<endl;
}

K. Tokitsukaze and Synthesis and Traits

思路

tag:图论
给出的图是无向不连通图,题目实际要求给k个点,判断图中有多少个出现过。
我们可以将图转换成有向无环图,转换方法是:度少的->度多的,度一样,编号小的->编号大的。
然后暴力搜索一下即可,时间复杂度 m \sqrt m m

int n,m,q;
const int N=2e5+10;
int h[N],e[N<<1],ne[N<<1],idx;
int d[N];
int times[N];
vector<PII>edg;
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void solve()
{
	cin>>n>>m>>q;
	memset(h,-1,sizeof h);
	rep(i,1,m)
	{
		int a,b;
		cin>>a>>b;
		d[a]++,d[b]++;
		edg.pb({a,b});	
	}
	rep(i,0,m-1)
	{
		int a=edg[i].x,b=edg[i].y;
		if(d[a]<d[b])add(a,b);
		else
		{
			if(d[a]>d[b])add(b,a);
			else
			{
				if(a<b)add(a,b);
				else add(b,a);
			}
		}
	}
	vector<int>vec;
	while(q--)
	{
		int k;
		cin>>k;vec.clear();
		rep(i,1,k)
		{
			int x;
			cin>>x;
			vec.pb(x);
			times[x]=1;
		}
		int res=0;
		rep(u,0,k-1)
		{
			for(int i=h[vec[u]];~i;i=ne[i])
			{
				int j=e[i];
				if(times[j])res++;
			}
		}
		cout<<res<<endl;
		for(auto x:vec)times[x]=0;
	}
}

L. Tokitsukaze and Three Integers

思路

tag: 容斥,哈希,预处理
这题思路不难,难在预处理上去重,定义f[i][j]:a或b选取v[i]时a*b(j)的个数。

int n,p;
const int N=5e3+10;
int a[N];
int f[N][N];
int cnt[N];
void solve()
{
	cin>>n>>p;
	rep(i,1,n)cin>>a[i];
	rep(i,1,n)
	{
		rep(j,1,n)
		{
			if(i==j)continue;
			cnt[a[i]%p*a[j]%p]++;
			f[i][a[i]%p*a[j]%p]+=2;
		}
	}
	rep(i,0,p-1)
	{
		int res=0;
		rep(j,1,n)
		{
			int t=a[j]%p;
			int v=(i-t+p)%p;
			res+=cnt[v]-f[j][v];
		}
		cout<<res<<' ';
	}
}

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

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

相关文章

高效团队的gitlab flow最佳实践

当前git是大部分开发团队的首选版本管理工具&#xff0c;一个好的流程规范可以让大家有效地合作&#xff0c;像流水线一样有条不紊地进行团队协作。 业界包含三种flow&#xff1a; Git flowGithub flowGitlab flow 下面我们先来分析&#xff0c;然后再基于gitlab flow来设计一…

19、Javaweb案例-登录功能

项目导入 选择travel项目的pom.xml文件&#xff0c;点击ok&#xff0c;完成项目导入。需要等待一小会&#xff0c;项目初始化完成。 启动项目 方式一&#xff1a; 方式二&#xff1a;配置maven快捷启动 技术选型 Web层 Servlet&#xff1a;前端控制器html&#xff1a;视图Fi…

【c语言】数据结构-顺序表

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、顺序表是什么&#xff1f; 二、项目功能的逐一实现&#xff08;基本&a…

Python-Flask-2023.1.22

1、WSGIweb server gateway interface一个框架定义的简单通用的接口Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;缩写为WSGI&#xff09;是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。flask框架内有默认的…

手写vue及源码解析一 rollup环境的搭建

开篇 都手写源码了&#xff0c;那就顺便分析一下源码吧。 rollup环境的搭建 作为了解就行。需要使用rollup来编译我们自己手写的vue代码。 需要安装rollup,rollup的babel插件&#xff0c;以及babel核心和babel预设&#xff08;可以理解为初始化模板&#xff09;。 mkdir vu…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中&#xff0c;主要利用final关键字&#xff0c;&#xff08;在Java类中灵活使用static关键字&#xff09;来定义常量。 当常量被设定后&#xff0c;一般情况下就不允许在进行更改了&#xff0c;如可以利用以下的形式来定义常量&#xff1a;…

仿写Dubbo-Java Socket

概念 socket 被翻译为“套接字”&#xff0c;socket是计算机之间进行通信的一种方式。通过socket可以实现端(端口)到端通信。Java的java.net包中提供了进行socket通信的类。主要使用ServerSocket和Socket类实现通信。 ServerSocket 服务端应用使用java.net.ServerSocket类来获取…

Node.js 操作MongoDB (Mongoose) 数据库

在讲Node.js通过使用mongoose模块来操作MongoDB数据库之前首先是关于MongoDB数据库的安装和MongoDB服务以及对MongoDB命令行的操作和可视化工具MongoDBCompass的一个基本使用&#xff1b;那么在这里已经准备好了关于MongoDB数据库的内容了&#xff1a; MongoDB数据库安装详细 &…

学习shell与shell编程

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

06-jquery函数

2.6函数 .6.1第一组函数 1 val():操作dom函数的value值 val()&#xff1a;没有参数&#xff0c;获取dom数组中第一个dom对象的value值。 val(参数)&#xff1a;有参数&#xff0c;给dom数组中所有dom对象的value属性赋值。 2 text()&#xff1a;操作标签文本内容&#xff0c;…

springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

一、目的 如今2023了&#xff0c;大多数javaweb架构都是springboot微服务&#xff0c;一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能&#xff0c;js转发到后台网关gateway服务&#xff0c;然后到鉴权spring-sercurity服务&#xff0c;然后到业务…

【实操案例十一】使用try-except手动捕获异常 实例代码及运行效果图!

任务一&#xff1a; 编写程序输入学员成绩 异常捕获忘了的同学&#xff0c;可以参考这个&#xff1a;Bug的常见类型及异常处理机制 # 任务一&#xff1a; 编写程序输入学员成绩iint(input(请输入学员成绩&#xff1a;)) if 0<i<100:print(i) else:raise Exception(分数…

产品设计-基础控件-信息输入控件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 产品设计-基础控件-信息输入控件1.1.文本框一、1.1.11.1.2、占位符文本1.1.3 输入框1.1.4 帮助文本1.1.5 初始默认值1.1.6 输入文本1.1.7 跟踪图标1.1.8 格式化标记1.2 单选按…

java枚举类2023028

一个类的对象是有限而且固定的&#xff0c;比如季节类&#xff0c; 它只有4个对象&#xff1b;再比如行星类&#xff0c;目前只有8个对象。这种实例有限而且固定的类&#xff0c;在Java里被称为枚举类。在早期代码中&#xff0c;可能会直接使用简单的静态常量来表示枚&#xff…

设计模式 - 六大设计原则之OCP(开闭原则)

文章目录概述Case接口定义接口实现Bad ImplBetter Impl概述 Open-Close Principle 在面向对象编程领域中&#xff0c;开闭原则规定软件中的类、对象、模块和函数对扩展应该是开放的&#xff0c;但对修改是封闭的。 这意味着 应该用抽象定义结构&#xff0c;用具体实现扩展细节…

使用 AJAX+JSON 实现用户查询/添加功能

实现用户查询/添加功能1. 查询功能准备selectAllServlet&#xff1a;brand.html&#xff1a;2. 添加功能addBrand.html&#xff1a;表单&#xff1a;<script&#xff1a;addServlet&#xff1a;1. 查询功能 需求&#xff1a;在onload&#xff08;页面加载完成&#xff09;事…

SSM项目实战【从 0 到 1】:个人博客

文章目录前言一、项目简介二、项目技术栈三、准备工作1、Spring Boot 项目创建2、mybatis 配置3、数据库创建四、基本框架搭建1、实体层&#xff08;model&#xff09;2、控制器层&#xff08;controller&#xff09;3、服务层&#xff08;service&#xff09;4、持久层&#x…

Liunx相关服务无法启动,带你一步一步找出问题和解决问题

liunx服务无法开启的原因有各种各样&#xff0c;首先我们需要找到我们究竟是为什么不能能够开启这个服务&#xff0c;这里我们先要去考虑到的一个非常重要的问题就是我们的防火墙有没有启动&#xff0c;防火墙有没有把我们的要开启相关服务的端口给封禁掉。这个是无论如何都要第…

学习记录668@项目管理之项目沟通管理和干系人管理

书上这部分的内容很无趣、很花里花哨、很杂乱&#xff0c;所以本文只摘取我认为比较有用和有意义的片段。 沟通方式 在发送方自认为已经掌握了足够的信息&#xff0c;有了自己的想法且不需要进一步听取多方意见时&#xff0c;往往选择控制力极强、参与程度最弱的“叙述方式”&a…

ES学习看这一篇文章就够了

第一章 ES简介 第1节 ES介绍 1 2 3 41、Elasticsearch是一个基于Lucene的搜索服务器 2、提供了一个分布式的全文搜索引擎,基于restful web接口 3、Elasticsearch是用Java语言开发的&#xff0c;基于Apache协议的开源项目&#xff0c;是目前最受欢迎的企业搜索引擎 4、Elastics…