文章目录

  • 问题 A: 起名废柴
  • 问题 B: 可视消息
  • 问题 C: 虫洞旅行
  • 问题 D: 整数化简分析
  • 问题 E: 向量选取
  • 问题 F: 勤劳的扫地机器人

问题 A: 起名废柴

根据题意,判断字符串 T T T 是否为字符串 S S S 加上任意字符得到即可
代码如下:

#include <bits/stdc++.h>
using namespace std;
signed main() {string s,t;cin>>s>>t;int n=s.size(),flag=1;for(int i=0;i<n;i++)flag&=(s[i]==t[i]);cout<<(flag?"Yes":"No");return 0;
}

问题 B: 可视消息

根据题意,若字符串 S S S 长度大于 k k k 则输出字符串前 k k k 个字符,末尾输出 . . . ... ...
若字符串 S S S 长度小于等于 k k k 则输出字符串
代码如下:

#include <bits/stdc++.h>
using namespace std;
signed main()
{int k,n;string s;scanf("%d",&k);cin>>s;n=s.size();if(n<=k)cout<<s;else {for(int i=0;i<k;i++)cout<<s[i];puts("...");}
}

问题 C: 虫洞旅行

首先看数据范围: 1 ≤ K ≤ 1 0 18 1 \leq K \leq 10^{18} 1≤K≤1018 直接模拟和暴力枚举肯定是不可以的,我们需要寻找规律
无论 K K K 多大,经过一定次数的跳转后,操作过程必定会进入循环,这时所有的操作都是固定的,因此我们没有必要直接枚举很多次,只需要判断循环前的操作次数与进入循环后对循环轮数进行取模即可
代码如下:

#include <bits/stdc++.h>
const int N = 2e5 + 5;
using namespace std;
int n,a[N],f[N]={0};
long long k;
signed main() {scanf("%d%lld",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]);int now=1,cnt=0;k++;while(!f[now]&&cnt<k){f[now]=++cnt;if(cnt<k)now=a[now];}if(cnt<k){k=(k-f[now]+1)%(cnt-f[now]+1);if(!k)k=cnt-f[now]+1;cnt=1;while(cnt<k)now=a[now],cnt++;}printf("%d\n",now);return 0;
}

问题 D: 整数化简分析

首先对于 N N N ,统计每个质因子的最高次数
根据算术基本定理, N = P 1 a 1 × P 2 a 2 × P 3 a 3 × . . . × P n a n N=P_{1}^{a_{1}} \times P_{2}^{a_{2}}\times P_{3}^{a_{3}}\times ... \times P_{n}^{a_{n}} N=P1a1​​×P2a2​​×P3a3​​×...×Pnan​​
对于每个质因子 P i P_{i} Pi​ ,可分别对于其指数 a i a_{i} ai​ 进行讨论,则问题转换为对于每个 a i a_{i} ai​ ,可取多少种不同的正整数使得这些正整数之和小于 a i a_{i} ai​
显然此时最佳方案为每次选择可选择的最小数,即按照 1 , 2 , 3 , . . . 1,2,3,... 1,2,3,... 逐步进行选择,则对应 a i a_{i} ai​ 的方案数为 m m m 满足 ∑ j = 1 m ≤ a i \sum_{j=1}^{m} \leq a_{i} ∑j=1m​≤ai​ ,最后对于所有 a i a_{i} ai​ 对应的 m m m进行求和即可
代码如下:

#include <bits/stdc++.h>
using namespace std;
int cnt[50];
signed main() {int now=1,summ=0,ans=0;long long n;for(int i=1;i<=50;i++)//对于每种可能出现的质因子指数a[i]预处理出其答案{if(i>summ){now++;summ+=now;}cnt[i]=now-1;}scanf("%lld",&n);for(long long i=2;i*i<=n;i++)if(n%i==0){now=0;while(n%i==0)now++,n/=i;ans+=cnt[now];}if(n>1)ans++;printf("%d\n",ans);return 0;
}

问题 E: 向量选取

向量垂直:若向量 X i ⃗ ( a i , b i ) \vec{X_{i}}(a_{i},b_{i}) Xi​ ​(ai​,bi​)与向量 X j ⃗ ( a j , b j ) \vec{X_{j}}(a_{j},b_{j}) Xj​ ​(aj​,bj​)垂直,则 X i ⃗ ⋅ X j ⃗ = a i × a j + b i × b j = 0 \vec {X_{i}} \cdot \vec {X_{j}} = a_{i} \times a_{j}+b_{i} \times b_{j} = 0 Xi​ ​⋅Xj​ ​=ai​×aj​+bi​×bj​=0 (完整复习版本)
等式处理一下可以得到,每个集合中任意两点满足: a i b i ≠ − b j a j \frac{a_{i}}{b_{i}} \neq -\frac{b_{j}}{a_{j}} bi​ai​​​=−aj​bj​​
因此第一步,我们根据每个向量 a i × b i a_{i} \times b_{i} ai​×bi​ 的正负对向量进行分类,用桶进行计数,且无法共存的两个向量在同一位置分开计数
若 a i × b i > 0 a_{i} \times b_{i}>0 ai​×bi​>0 则将 ( a i , b i ) (a_{i},b_{i}) (ai​,bi​) 存入桶对应位置的第一部分;
若 a i × b i ≤ 0 a_{i} \times b_{i} \leq 0 ai​×bi​≤0 ,假设保证 b i ≥ 0 b_{i} \geq 0 bi​≥0(对 a i a_{i} ai​ 与 b i b_{i} bi​ 进行预处理,注意需保证处理过程不改变 a i × b i a_{i} \times b_{i} ai​×bi​ 的正负性) 则将 ( b i , − a i ) (b_{i},-a_{i}) (bi​,−ai​) 存入桶对应位置的第二部分
此时桶中每一个位置对应的第一部分与第二部分内向量无法共存,桶中各个部分选取方案不互相影响,故可运用乘法定理,总方案数为桶中各个位置上不同方案数乘积
则问题转换为每个位置上已知共有 x + y x+y x+y 个物品,其中 x x x 个物品与另外 y y y 个物品无法共存,求 x + y x+y x+y 个物品选取若干个的物品的选取方案数
由于 x x x 个物品与另外 y y y 个物品无法共存,故总方案数为 x x x 个物品的选取方案数与另外 y y y 个物品的选取方案数之和 − - − 空集重复计算了一次,即该位置上对应方案数为 2 x + 2 y − 1 2^{x}+2^{y}-1 2x+2y−1
注意

  • 上述计数过程中未排除桶中所有位置均不取数情况,故最后答案需要 − 1 -1 −1
  • 若 a i = b i = 0 a_{i}=b_{i}=0 ai​=bi​=0 ,则向量 X i ⃗ \vec{X_{i}} Xi​ ​不能与其他任何向量进行共存,但可单独成为一种集合的选择方案,故与其他数分开进行计数

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
const int MOD=1000000007;
int n,fa[100005]={0},cnt=0;
int pow2[N]={0};
map<pair<int,int>,pair<int,int> >ma;
signed main()
{pow2[0]=1;for(int i=1;i<=N-5;i++)pow2[i]=pow2[i-1]*2%MOD;int g,a,b;scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld%lld",&a,&b);if(a==0&&b==0){cnt++;continue;}g=__gcd(a,b);a/=g;b/=g;if(b<0)a=-a,b=-b;if(a<=0)ma[{b,-a}].second++;else ma[{a,b}].first++;}int ans=1;for(auto i:ma)ans=ans*(pow2[i.second.first]+pow2[i.second.second]-1+MOD)%MOD;ans=(ans+cnt-1+MOD)%MOD;cout<<ans;
}

问题 F: 勤劳的扫地机器人

大模拟
统计所有的 x x x 坐标进行排序编号,统计所有的 y y y 坐标进行排序编号,以编号代表网格线处理边界
接着进行 B F S BFS BFS 搜索,首先找到机器人所在位置最近的左边界,查看其上下左右是否有编号代表所在直线可到达且未访问过,如果有则压入栈中
由于城堡面积无限大,在排序编号重新定义网格线过程中需加入正无穷与负无穷
若最终 ( − I N F , − I N F ) (-INF,-INF) (−INF,−INF) 或 ( I N F , I N F ) (INF,INF) (INF,INF) 可访问,则表明扫地机器人可无穷无尽地进行工作
代码如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=5000+5;
const int MOD=1000000007;
int n,m,a[N],b[N],c[N],d[N],e[N],f[N];
bool g[N][N][4]={0},vis[N][N]={0};
int dx[4]={0,0,+1,-1},dy[4]={+1,-1,0,0};
vector<int>xx,yy;
signed main()
{int aa,bb,cc,dd,ee,ff;xx.push_back(LONG_LONG_MIN);xx.push_back(LONG_LONG_MAX);yy.push_back(LONG_LONG_MIN);yy.push_back(LONG_LONG_MAX);scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);xx.push_back(a[i]);xx.push_back(b[i]);yy.push_back(c[i]);}for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&d[i],&e[i],&f[i]);xx.push_back(d[i]);yy.push_back(e[i]);yy.push_back(f[i]);}sort(xx.begin(),xx.end());xx.resize(unique(xx.begin(),xx.end())-xx.begin());sort(yy.begin(),yy.end());yy.resize(unique(yy.begin(),yy.end())-yy.begin());for(int i=1;i<=n;i++){aa=lower_bound(xx.begin(),xx.end(),a[i])-xx.begin();bb=lower_bound(xx.begin(),xx.end(),b[i])-xx.begin();cc=lower_bound(yy.begin(),yy.end(),c[i])-yy.begin();for(int j=aa;j<bb;j++)g[j][cc-1][0]=1,g[j][cc][1]=1;}for(int i=1;i<=m;i++){dd=lower_bound(xx.begin(),xx.end(),d[i])-xx.begin();ee=lower_bound(yy.begin(),yy.end(),e[i])-yy.begin();ff=lower_bound(yy.begin(),yy.end(),f[i])-yy.begin();for(int j=ee;j<ff;j++)g[dd-1][j][2]=1,g[dd][j][3]=1;}int x,y,tx,ty;x=lower_bound(xx.begin(),xx.end(),0)-xx.begin();x--;y=lower_bound(yy.begin(),yy.end(),0)-yy.begin();y--;queue<pair<int,int>>que;que.push({x,y});vis[x][y]=1;while(que.size()){x=que.front().first;y=que.front().second;que.pop();for(int i=0;i<4;i++)if(!g[x][y][i]){tx=x+dx[i];ty=y+dy[i];if(tx<0||tx>=xx.size()-1||ty<0||ty>=yy.size()-1||vis[tx][ty])continue;else {que.push({tx,ty});vis[tx][ty]=1;} }}if(vis[0][0]||vis[xx.size()-1][yy.size()-1]){puts("INF");return 0;}long long ans=0;for(int i=0;i<xx.size()-1;i++)for(int j=0;j<yy.size()-1;j++)if(vis[i][j])ans+=(long long)(xx[i+1]-xx[i])*(yy[j+1]-yy[j]);cout<<ans;
}

北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(11)题解相关推荐

  1. 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(8)题解

    文章目录 问题 A: 鬼抓人 问题 B: 坠落之前 问题 C: 数据结构:树的子结点计数 问题 D: 糖果合并 问题 E: 幼儿园排座 问题 F: 简单路径计数 (((糖豆人小专题( •̀ ω •́ ...

  2. 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 B: 跳蛙 - 题解

    传送门 分割 题目描述 输入描述 数据范围: 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:12 ...

  3. BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛(10)题解

    Bob和Alice(1) 思路: 模拟即可模拟即可模拟即可 时间复杂度:O1O1O1 #include <bits/stdc++.h> #define fer(i,a,b) for(int ...

  4. 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 C: 剪切 - 题解

    传送门 分割 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:128M 题目描 ...

  5. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 D: 点外卖 - 题解

    题意: 有 nnn 道菜,mmm 张券,券的作用是将任意一道菜的价格变为原来的一半(下取整),且允许叠加使用,问最少花费多少钱. 思路: 每一张券最优的使用方法一定是对当前价格最高的菜使用,那么这道题 ...

  6. 北京化工大学 2022-2023-1 ACM集训队每周程序设计竞赛(7)题解

    问题 A: 幸运数字 思路:直接把N当成字符串读入,循环判断是否有一位是7就可以了. #include <bits/stdc++.h>//#include<iostream>/ ...

  7. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 E: 祖玛的复仇 - 题解

    题意: 在长度为 n n n 的原字符串 S S S 找到中出现两次或两次以上的.相互之间没有重叠的连续子字符串的最大长度. 思路: 这道题的解法其实挺多的,大家可以之后多想下,我这里就只写一个最容易 ...

  8. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 A: 排火车 - 题解

    题意: S u n n y Sunny Sunny之后接 C l o u d y Cloudy Cloudy, C l o u d y Cloudy Cloudy之后接 R a i n y Rainy ...

  9. 2021-2022-2 ACM集训队每周程序设计竞赛(10) - 问题 A: 还原撕碎的字条,哄笑生气的毛毛 - 题解

    传送门 还原撕碎的字条,哄笑生气的毛毛 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 样例三 输入 输出 题目分析 AC代码 还原撕碎的字条,哄笑生气的毛毛 还原撕碎的字条,哄 ...

最新文章

  1. python bool类型_Python 的内置数值类型
  2. 设计模式(三) | 为别人做嫁衣---代理模式
  3. 数据在java中加时间,如何在Or.jFr.DATA时间中设置RealTimeMead时期的Java数据
  4. 程序员公司选择:创业公司、中等规模公司、大公司
  5. 容器技术之快速了解K8S各抽象资源及组件架构
  6. 奥斯卡公布最佳动画长片初选名单 《哪吒》等32部动画入选
  7. 如何成为Java高级工程师?
  8. multisim14
  9. Field属性(域)
  10. 华为ensp cloud(云)中没有网卡,缺失网卡,网卡地址错误解决方法
  11. undefined symbol 问题解决记录
  12. Windows 10快捷键入门(会更新)
  13. windwos服务器网站504,打开网站出现504 gateway time-out的原因及解决方法
  14. DTI处理工具包PANDA小白记录
  15. C#应用程序退出后托盘图标(notify…
  16. Lesson 1. 线性回归模型的一般实现形式
  17. 2022年全球及中国手术感控行业头部企业市场占有率及排名调研报告
  18. 【统计学】详解 A/B 测试
  19. WLAN从入门到精通—STA接入过程
  20. XDF php 图形计数器 v1.1

热门文章

  1. 【倾斜目标检测】PP-YOLOE-R
  2. dorado:AutoForm中的灵活布局!
  3. ubuntu18.04 muduo编译安装
  4. 300. 最长递增子序列
  5. 新浪付稳:揭秘微博如何10分钟快速应对百亿级访问量
  6. Unity三屏全屏方法
  7. 北京邮电大学803计算机学科基础综合考试大纲
  8. JS判断是苹果系统(ios)还是安卓系统(Android)或者PC端
  9. 树莓派2的内核编译与安装
  10. elasticsearch系列-子条件查询