【LGR-176-Div.2】[yLCPC2024] 洛谷 3 月月赛 I(A~C and G<oeis>)

[yLCPC2024] A. dx 分计算

前缀和提前处理一下区间和,做到O(1)访问就可以过。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){string s;cin>>s;int a[s.length()+1];a[0]=0;per(i,0,s.length()-1){if(s[i]=='P')a[i+1]=3;else if(s[i]=='p')a[i+1]=2;else if(s[i]=='G')a[i+1]=1;else a[i+1]=0;if(i>=1)a[i+1]+=a[i];}int q;cin>>q;per(i,1,q){int l,r;cin>>l>>r;cout<<a[r]-a[l-1]<<endl;}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

[yLCPC2024] B. 找机厅

可以走四个方向,从左上角到右下角,问最少步数,和输出任意一条最短路径。

第一次BFS,把到每个点的步数都求一下,即下一个点.step=前一个点.step+1

如果终点有最短步数,那么有解,再根据最短步数BFS一次,四个方向的下一步必须步数比当前刚好大1,再走,顺便输出方向即可。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n,m;cin>>n>>m;int a[n+1][m+1],step[n+1][m+1];string s[n+1];per(i,1,n)cin>>s[i];per(i,1,n){per(j,0,m-1){if(s[i][j]=='0')a[i][j+1]=0;else a[i][j+1]=1;}}per(i,1,n){per(j,1,m){step[i][j]=INT_MAX;}}bool vis[n+1][m+1];per(i,1,n){per(j,1,m){vis[i][j]=false;}}struct Node{int x,y,val;};queue<Node>q;//终点开始BFS(起点应该一样的)q.push({n,m,1});auto inSec=[&](Node x){return x.x>=1 and x.x<=n and x.y>=1 and x.y<=m;};int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};char dc[4]={'R','L','D','U'};map<pair<int,int>,char>d;per(i,0,3){d[{dx[i],dy[i]}]=dc[i];}while(q.size()){Node now=q.front();q.pop();if(vis[now.x][now.y])continue;vis[now.x][now.y]=true;step[now.x][now.y]=min(step[now.x][now.y],now.val);//四个方向per(i,0,3){Node next={now.x+dx[i],now.y+dy[i],now.val+1};//是否越界if(!inSec(next))continue;//是否可走if(a[next.x][next.y]==a[now.x][now.y])continue;q.push(next);}}//    per(i,1,n){
//        per(j,1,m){
//            cout<<step[i][j]<<" ";
//        }cout<<endl;
//    }if(vis[1][1]){cout<<step[1][1]-1<<endl;Node now={1,1};Node END={n,m};while(true){if(now.x==END.x and now.y==END.y)break;per(i,0,3){Node next={now.x+dx[i],now.y+dy[i]};if(!inSec(next))continue;if(step[next.x][next.y]==step[now.x][now.y]-1){cout<<d[{dx[i],dy[i]}];now=next;break;}}}cout<<endl;}else cout<<-1<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

[yLCPC2024] C. 舞萌基本练习

via z01prime.某某最大值里面的最小值,分成几段是否可行,没有思路的话就要考虑是二分答案了。

直接从二分不优美度入手,如果大优美度可以,那就往小的接着试。

线段树系数太大了过不了这道题,只能过第一个测试点。(要用树状数组)

每次加入一个数,访问比当前大的数已经存在了几个(即逆序对),根据这个去写check函数,分出组,如果组<=k 即合理,显然组越多 不优美度才有可能更小,让组更贴近k即为答案。

维护的时候记得离散化。

再加上不优美度最大极限可以达到1e10左右,所以这道题r至少要1e11才保险,也就是开long long。线段树基本上就似了。

比如下面这个线段树TLE

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n,k;cin>>n>>k;int a[n+1];per(i,1,n)cin>>a[i];struct{int val;}seg[n<<2];auto init=[&](){per(i,1,(n<<2)-1){seg[i].val=0;}return;};auto lc=[&](int i){return i<<1;};auto rc=[&](int i){return i<<1|1;};auto update=[&](int i){seg[i].val=seg[lc(i)].val+seg[rc(i)].val;};function<void(int l,int r,int i,int x)>insert=[&](int l,int r,int i,int x){if(l==r){if(l==x)seg[i].val=1;return;}int mid=(l+r)>>1;if(x<=mid)insert(l,mid,lc(i),x);if(x>mid)insert(mid+1,r,rc(i),x);update(i);};function<int(int l,int r,int i,int x,int y)>query=[&](int l,int r,int i,int x,int y){int ans=0;if(l>=x and r<=y)return seg[i].val;int mid=(l+r)>>1;if(x<=mid)ans+=query(l,mid,lc(i),x,y);if(y>mid)ans+=query(mid+1,r,rc(i),x,y);return ans;};function<void(int l,int r,int i,int x)>del=[&](int l,int r,int i,int x){if(l==r){if(l==x)seg[i].val=0;return;}int mid=(l+r)>>1;if(x<=mid)del(l,mid,lc(i),x);if(x>mid)del(mid+1,r,rc(i),x);update(i);};int b[n+1];per(i,1,n)b[i]=a[i];sort(b+1,b+1+n);//离散化map<int,int>f;//原数值,对应离散化per(i,1,n)f[b[i]]=i;init();auto check=[&](int x){int cnt=0,res=0,nxd=0;per(i,1,n){//划分res++;if(res==1){insert(1,n,1,f[a[i]]);}else{int add=query(1,n,1,f[a[i]]+1,n);if(nxd+add>x){cnt++;per(j,i-res,i-1){del(1,n,1,f[a[j]]);}nxd=0;res=0;}else{nxd+=add;insert(1,n,1,f[a[i]]);}}}per(i,n-res+1,n){del(1,n,1,f[a[i]]);}return cnt+1;};int l=0,r=INT_MAX;while(l<r){int mid=(l+r)>>1;int cnt=check(mid);if(cnt<=k){// mid越大  cnt越少r=mid;//合理的时候 cnt越多越好}else{l=mid+1;}}cout<<r<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

所以我们只需要稍加(全部)修改,把线段树的内容改成树状数组的内容。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=1e5+5;int a[N],n,k,c[N],b[N];
unordered_map<int,int>f;//原数值,对应离散化void solve(){cin>>n>>k;per(i,1,n)cin>>a[i];per(i,1,n)b[i]=a[i];sort(b+1,b+1+n);//离散化f.clear();per(i,1,n)f[b[i]]=i;auto lowbit=[&](int x){return x&-x;};auto insert=[&](int x){while(x<=n){c[x]++;x+=lowbit(x);}};auto del=[&](int x){while(x<=n){c[x]--;x+=lowbit(x);}};auto sum=[&](int i){int res=0;while(i>=1){res+=c[i];i-=lowbit(i);}return res;};auto check=[&](int x){int cnt=0,res=0,nxd=0;per(i,1,n){//划分res++;if(res==1){insert(f[a[i]]);}else{int add=sum(n)-sum(f[a[i]]);if(nxd+add>x){cnt++;per(j,i-res+1,i-1){del(f[a[j]]);}i--;nxd=0;res=0;}else{nxd+=add;insert(f[a[i]]);}}}per(i,n-res+1,n){del(f[a[i]]);}return cnt+1;};int l=0,r=1e11;while(l<r){int mid=(l+r)>>1;int cnt=check(mid);if(cnt<=k){// mid越大  cnt越少r=mid;//合理的时候 cnt越多越好}else{l=mid+1;}}cout<<r<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

即可AC。

离散化的时候使用unordered_map,插入和查询的复杂度都是O(1),当然,如果出题人对着STL的散列表的内部哈希值出数据,能把复杂度卡到O(n),当然这道题没这么毒瘤,用散列表即可AC(map过不了的,查询插入复杂度都是logn)当然就算出题人不卡散列表离散化,也有可能会超时。

763ms为散列表,178ms就是正常的离散化。

但是如果你很担心的话,就使用正常版本的。

首先复制一份你要离散化的数组,如c[i]=a[i]。

对c 先升序排序,然后去重(unique,返回值是压缩后的末尾迭代器,即新end)。

遍历 a 数组,在 c 数组中 lower_bound 自身值(即二分定位)在 c 中的排名。

总复杂度为nlogn,显然查询为稳定的O(1)

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=1e5+5;int a[N],n,k,c[N],b[N];void solve(){cin>>n>>k;per(i,1,n)cin>>a[i];per(i,1,n)b[i]=a[i];sort(b+1,b+1+n);int p=unique(b+1,b+1+n)-b;//离散化per(i,1,n)a[i]= lower_bound(b+1,b+1+p,a[i])-b+1;auto lowbit=[&](int x){return x&-x;};auto insert=[&](int x){while(x<=n){c[x]++;x+=lowbit(x);}};auto del=[&](int x){while(x<=n){c[x]--;x+=lowbit(x);}};auto sum=[&](int i){int res=0;while(i>=1){res+=c[i];i-=lowbit(i);}return res;};auto check=[&](int x){int cnt=0,res=0,nxd=0;per(i,1,n){//划分res++;if(res==1){insert(a[i]);}else{int add=sum(n)-sum(a[i]);if(nxd+add>x){cnt++;per(j,i-res+1,i-1){del(a[j]);}i--;nxd=0;res=0;}else{nxd+=add;insert(a[i]);}}}per(i,n-res+1,n){del(a[i]);}return cnt+1;};int l=0,r=1e11;while(l<r){int mid=(l+r)>>1;int cnt=check(mid);if(cnt<=k){// mid越大  cnt越少r=mid;//合理的时候 cnt越多越好}else{l=mid+1;}}cout<<r<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

最后实测线段树打上所有178ms里面的优化,照样过不了第一个点,会TLE。(系数太大了)

[yLCPC2024] G. 系ぎて

直接上暴力!

void solve(){int n;cin>>n;auto cul=[&](int x){int res=0;per(i,1,x){per(j,1,x){per(k,1,x){if(i*j*k==x)res++;}}}return res;};int ans=0;per(i,1,n){ans+=cul(i);}cout<<ans<<endl;
}

100算的就有点慢了,显然i*j*k==x可以变成,x%(i*j)==0优化掉一个循环

void solve(){int n;cin>>n;auto cul=[&](int x){int res=0;per(i,1,x){per(j,1,x){if(x%(i*j)==0)res++;}}return res;};int ans=0;per(i,1,n){ans+=cul(i);}cout<<ans<<endl;
}

但是这样1e5的数据都跑不出来,1e10更是天方夜谭(,哪怕遍历每个数就得出res,也要遍历到1e10,差不多可以得出结论这是一道数学题,或许有可能是一个有规律的数列。

直接把前10个答案放到oeis网站上让网站帮忙找规律(

拉到下面有一个Python版本的代码

然后让Chat8帮忙改成C++代码,然后提交,AC..

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;int ans(int n){int m = cbrt(n);int sum = 0;for (int i = 1; i <= m; ++i) {int r = n / i;int s = sqrt(r);int term1 = -s * s;int term2 = 0;for (int k = 1; k <= s; ++k) {term2 += r / k;}term2 *= 2;int term3 = 0;for (int j = 1; j <= m; ++j) {term3 += n / (i * j);}sum += term1 + term2 - term3;}return m * m * m + 3 * sum;
}void solve(){int n;cin>>n;cout<<ans(n)<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}

正解移步P10239 [yLCPC2024] G. 系ぎて - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

邪∩写法仅供参考。

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

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

相关文章

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因&#xff1a; 在高并发场景下&#xff0c;传统关系型数据库的并发能力相对比较薄弱&#xff08;QPS不能太大&#xff09;&#xff1b; 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…

【C/C++ 学习笔记】运算符

【C/C 学习笔记】运算符 视频地址: Bilibili 算术运算符 运算符含义备注 加号 − - −减号 ∗ * ∗乘号 / / /除号整数相除结果依然是整数&#xff08;直接舍去小数部分&#xff09;&#xff0c;小数相除还是小数 % 取模小数无法进行取模运算&#xff1b;对 0 取模会报错 …

Windows下同一电脑配置多个Git公钥访问不同的账号

前言 产生这个问题的原因是我在Gitee码云上有两个账号,为了方便每次不用使用http模式推拉代码,于是我就使用了ssh的模式,起初呢我用两台电脑分别连接两个账号,用起来也相安无事,近段时时间台式机在家里,我在外地出差了,就想着把ssh公钥同时添加到不同的账号里,结果却发现不能用…

超网、IP 聚合、IP 汇总分别是什么?三者有啥区别和联系?

一、超网 超网&#xff08;Supernet&#xff09;是一种网络地址聚合技术&#xff0c;它可以将多个连续的网络地址合并成一个更大的网络地址&#xff0c;从而减少路由表的数量和大小。超网技术可以将多个相邻的网络地址归并成一个更大的网络地址&#xff0c;这个更大的网络地址…

【Vue3 组合式 API: reactive 和 ref 函数】

文章目录 1. 什么是组合式 API&#xff1f;2. reactive 函数3. ref 函数4. reactive vs ref 1. 什么是组合式 API&#xff1f; 组合式 API 是 Vue 3 中的一种新特性&#xff0c;它允许我们通过函数来组织组件的逻辑&#xff0c;而不是依赖于选项式 API 中的选项对象。这使得代…

Git使用教程:入门到精通

Git使用教程&#xff1a;入门到精通 一、Git安装根据需求选择电脑位数安装&#xff1b;20231023210945建议这里先新建一个文件夹如&#xff1a;D:/Git&#xff1b;专门来存放Git安装包和后续Git代码&#xff0c;方便管理&#xff1b; 二、Git使用前的配置需要先创建自己的Gitee…

贪心算法(蓝桥杯 C++ 题目 代表 注解)

介绍&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望最终能够得到全局最好或最优的结果的算法。它通常用来解决一些最优化问题&#xff0c;如最小生…

❤ Vue3项目搭建系统篇(二)

❤ Vue3项目搭建系统篇&#xff08;二&#xff09; 1、安装和配置 Element Plus&#xff08;完整导入&#xff09; yarn add element-plus --savemain.ts中引入&#xff1a; // 引入组件 import ElementPlus from element-plus import element-plus/dist/index.css const ap…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

CPU卡学习

外部认证主要流程&#xff1a; 1. 选卡 2. 发送RATS指令(0xe0 0x51 0x35 0xb4) 3. 成功后返回ATS &#xff1a;0x10 0x78 0x80 0xa0 0x2 0x20 0x90 0x0 0x0 0x0 0x0 0x0 0x38 0xc1 0x5f 0x3e 4. 发送选择MF指令(0xa 0x1 0x0 0xa4 0x0 0x0 0x2 0x3f 0x0 0xbf 0xeb) 5. 成功…

VMware虚拟机安装Ubuntu kylin22.04系统教程(附截图详细步骤)

一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚拟机版本&#xff1a;17.0.0 build-20800274 ISO映像文件&#xff1a;ubuntukylin-22.04-pro-amd64.iso 二、安装步骤 打开虚拟机&#xff0c;点击创建新的虚拟机&#xff1a; 选择自定义&#xff1a; 硬…

HarmonyOS NEXT应用开发之MpChart图表实现案例

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

嘉绩咨询:搭建品牌招商桥梁,提供卓越讲师与会议服务

当下&#xff0c;品牌成功的关键在于强大的渠道支撑和高效的招商能力&#xff0c;在这一背景下&#xff0c;嘉绩咨询&#xff0c;这一专注于渠道招商全案系统孵化的知名平台型企业&#xff0c;今日宣布&#xff0c;将进一步加强其在品牌招商桥梁搭建上的服务功能&#xff0c;通…

HTML 学习笔记——标签创建小技巧

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Emmrt工具</title></head><body>&…

未来 AI:引领研发技术的关键

2024 年 AI 辅助研发趋势 2024年&#xff0c;随着人工智能技术的不断发展&#xff0c;AI辅助研发正成为科学研究和创新的重要驱动力。在这一年&#xff0c;我们预见到以下几个重要的AI辅助研发趋势。 首先&#xff0c;自动化实验将成为研发领域的主流。AI将在实验室中扮演越来…

XS2185:八通道PSE控制器产品

八通道PSE控制器产品-XS2185 芯片特性 八通道PSE 支持标准PD供电 支持非标PD供电 每个端口功率最大30W 12位端口电流监测 12位电源电压监测 支持直流负载断开检测 支持LED供电状态指示 支持过流保护 支持短路保护 Sifos基本测试通过 32-PIN…

L1-030 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&#xff0c;在当前尚未分组的学生中&#xff0c;将名次最靠前的学…

每日一问之Java中的类加载机制

Java中的类加载过程分为 加载、链接、初始化 三个步骤 加载&#xff1a;将类的字节码文件加载到内存中 链接可以细化分成 验证、准备、解析 验证&#xff1a;检查类的字节码是否符合Java的语法规范 准备&#xff1a;为类的静态变量分配内存并设置初始值 解析&#xff1a;将类…

自动备份数据到异地服务器(另一台电脑)

我们经常遇到需要将数据备份到另一台服务器&#xff0c;但是没有免费的软件&#xff0c;所以很苦恼&#xff0c;去网上找&#xff0c;找来找去都要收费&#xff0c;关键还是月租或年租。。。 其实没必要去买别人的&#xff1b; 下面我给大家写了一个批处理&#xff0c;即可以搞…

【Linux】CentOS网络故障排查大揭秘: 实战攻略解读

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 检查网络连接状态&#xff1a; 检查网络配置&#xff1a; 重启网络服务&#xff1a; 检查防火墙设置&#xff1a; 查看日志文…