SMU Summer 2023 Contest Round 8(2019 陕西省大学生程序设计竞赛)

B - Grid with Arrows(欧拉图)

题意:一个总规模为\(n × m\)的矩阵,矩阵上的每个位置有其下一位置的信息,询问是否存在一种解法从某一点出发,使得整个矩阵的每个位置都被访问到,如果越界或者遇到重复访问位置的解法被认为失败

题解:想要遍历所有的位置,那么只有两种情况

  • 由唯一的位置出发,最后能遍历所有位置
  • 由任意点位置出发,最后能回到该点

把每个格子看做有向图中的一个节点,那么每个节点至多向别的节点连一条边.如果有入度为 \(0\) 的节点,那么必须从该节点出发并检查(否则不可能经过其它点访问入度为 \(0\) 的节点);否则整张图可能是一个或多个环,随便挑一个节点出发并检查即可。复杂度 \(\mathcal{O}(nm)\)。

#include <bits/stdc++.h>
#define int long long using namespace std;
typedef pair<int,int> PII; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); const int mod = 1e9 + 7;
int T;
cin >> T;
while(T--){ int n,m;
cin >> n >> m;
vector<string> s(n + 1);
for(int i = 1;i <= n;i ++) cin >> s[i];
vector<int> a(1),deg((n + 1) * (m + 1)); for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j ++){
int step,now = (i - 1) * m + j;//将二维的转换成一维的方便遍历
int x = i, y = j;
cin >> step;
if(s[i][j - 1] == 'u'){
now -= step * m;
x -= step;
}else if(s[i][j - 1] == 'd'){
now += step * m;
x += step;
}else if(s[i][j - 1] == 'l'){
now -= step;
y -= step;
}else {
now += step;
y += step;
}
if(x < 1 || x > n || y < 1 || y > m)
now = -1;
if(now != - 1) deg[now]++;
a.emplace_back(now);
}
} vector<bool> vis((n + 1) * (m + 1));
auto dfs = [&](auto self,int x,int sum) ->bool{
if(sum == n * m) return 1;
if(x == -1 || vis[x]) return 0;
vis[x] = 1;
return self(self,a[x],sum + 1);
}; int num = 0, start = 1;
for(int i = 1;i <= n * m;i ++){
if(!deg[i]){
num ++;
start = i;
}
} if(num > 1){
cout << "No" << endl;
}else{
if(dfs(dfs,start,1)) cout << "Yes" << endl;
else cout << "No" << endl;
}
} return 0;
}

C. 0689(前缀和)

首先总共有\(\frac{(n+1) \times n}{2}\)个子串,其次,只要它包含了\(0,8,69\)这样的就一定能够变回原来的字符串,所以我们可以再\(+1\),

所以最开始答案为\(\frac{(n+1) \times n}{2}+1\)种.

  • 如果原字符串存在 \(0\)和 \(8\),那么只要翻转这个长度为 \(1\) 的区间,仍然还是原字符串。我们要去重,减去\(num_0,num_8\)

  • 如果原字符串里都是 \(6\),那么翻转任何一个区间都会把 \(6\) 变成 \(9\),不可能得到原字符串。原字符串都是 \(9\) 的情况同理。所以这种要\(-1\)

  • 如果原字符串由 \(6\) 和 \(9\) 组成。这样的字符串一定存在子串 \(69\) 或者 \(96\),翻转这个长度为 \(2\) 的区间,仍然还是原字符串

  • 如果一个子串为\(0890\),那么它和翻转\(89\)是一样的,若为两边为\(8\)同理

    所以答案就是左右端点不是\(00,88,69,96\)的区间数量,我们可以用前缀和来解决这个问题

#include <bits/stdc++.h>
#define int long long using namespace std;
typedef pair<int,int> PII; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); int T;
cin >> T;
while(T--){
string s;
cin >> s; int n = s.size();
s = " " + s;
vector<int> a(n + 1),b(n + 1),c(n + 1),d(n + 1);
for(int i = 1;i <= n;i ++){
if(s[i] == '0') a[i] = a[i - 1] + 1;
else a[i] = a[i - 1]; if(s[i] == '8') b[i] = b[i - 1] + 1;
else b[i] = b[i - 1]; if(s[i] == '6') c[i] = c[i - 1] + 1;
else c[i] = c[i - 1]; if(s[i] == '9') d[i] = d[i - 1] + 1;
else d[i] = d[i - 1];
} int ans = (n + 1) * n / 2 + 1;
if(n == c[n] || n == d[n]) ans --; ans -= (a[n] + b[n]);
for(int i = 1;i <= n;i ++){
if(s[i] == '0') ans -= a[n] - a[i];
else if(s[i] == '8') ans -= b[n] - b[i];
else if(s[i] == '9') ans -= c[n] - c[i];
else ans -= d[n] - d[i];
}
cout << ans << endl;
} return 0;
}

E. Turn It Off(二分+枚举)

直接二分+枚举扫一遍,复杂度\(\mathcal{O}(nlogn)\).

#include <bits/stdc++.h>
#define int long long
#define endl '\n' using namespace std; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); int T;
cin >> T;
while(T--){
int n,k;
cin >> n >> k;
string s;
cin >> s; auto check = [&](int x){
int sum = 0;
auto str = s;
for(int i = 0;i < str.size(); i ++){
if(str[i] == '1'){
int cnt = i;
while(i < x + cnt && i < str.size())
str[i++] = '0';
sum ++;
}
}
return sum <= k;
}; int l = 0, r = n;
while(l <= r){
int mid = (l + r) >> 1;
if(check(mid)) r = mid - 1;
else l = mid + 1;
} cout << l + 1<< endl;
} return 0;
}

F. K-hour Clock

分类讨论:

  • 如果\(x+y = z\),那任何\(k>z\)都可以.
  • 如果\(y\le z\),说明不能从\(x\)点到达\(z\)点.
  • 如果\(x+y\le z + z\),说明不能过一天后到达\(z\)点.
  • 其余情况直接输出\(x+y-z\)就好了,就当作只过了一天,或者还不到一天
#include <bits/stdc++.h>
#define int long long using namespace std;
typedef pair<int,int> PII; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); const int mod = 1e9 + 7;
int T;
cin >> T;
while(T--){ int x,y,z;
cin >> x >> y >> z;
int cha = x + y - z;
if(!cha)
cout << z + 1 << endl;
else if(y <= z || x + y <= z + z)
cout << -1 << endl;
else cout << cha << endl;
} return 0;
}

L. Digit Product

只要区间不在同一个\(10\)的倍数的区间内,则说明它们一定会经过一个末尾带有\(0\)的数,这时不管乘什么都为\(0\),其余情况正常乘即可

#include <bits/stdc++.h>
#define int long long using namespace std;
typedef pair<int,int> PII; signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); const int mod = 1e9 + 7;
int T;
cin >> T;
while(T--){ auto getnum = [&](int x){
int res = 1;
while(x){
res *= x % 10 % mod;
x /= 10;
}
return res % mod;
}; int l,r;
cin >> l >> r;
if(l / 10 != r / 10){
cout << 0 << endl;
}else{
int ans = 1;
for(int i = l;i <= r;i ++){
ans = ans * getnum(i) % mod;
}
cout << ans % mod << endl;
}
}
return 0;
}

SMU Summer 2023 Contest Round 8(2019 陕西省大学生程序设计竞赛)的更多相关文章

  1. [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others)    Mem ...

  2. [贪心,dp] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master (Problem - 6709)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6709 Fishing Master Time Limit: 2000/1000 MS (Java/Othe ...

  3. 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛(8/11)

    $$2019中国大学生程序设计竞赛(CCPC)\ -\ 网络选拔赛$$ \(A.\hat{} \& \hat{}\) 签到,只把AB都有的位给异或掉 //#pragma comment(lin ...

  4. 【赛后总结+部分题解】2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛

    赛后总结: T:今天状态一般,甚至有点疲惫.然后12点比赛开始,和队友开始看题,从最后往前面看,发现数学题公式看不懂.然后发现队友已经双开做1001和1006了,我看着1007有人A,开始做1007. ...

  5. 2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)

    题目链接:https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合 ...

  6. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  7. 2019河北省大学生程序设计竞赛(重现赛)J-舔狗 (拓扑排序)

    题目链接:https://ac.nowcoder.com/acm/contest/903/J 题意:给你 n 个舔狗和他喜欢的人,让你俩俩配对(只能和喜欢它的和它喜欢的),求剩下的单身狗数量. 思路: ...

  8. Contest - 中南大学第六届大学生程序设计竞赛(Semilive)

    题1:1160十进制-十六进制 注意他给的数据范围 2^31,int是 2^31-1 #include<iostream> using namespace std; int main() ...

  9. ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)

    Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...

  10. ACM学习历程—SNNUOJ 1116 A Simple Problem(递推 && 逆元 && 组合数学 && 快速幂)(2015陕西省大学生程序设计竞赛K题)

    Description Assuming a finite – radius “ball” which is on an N dimension is cut with a “knife” of N- ...

随机推荐

  1. 认真学习css3-2-css的选择器

    关于有哪些选择器,具体可以查看w3school. 本文写了一个考卷的例子,带有部分js,jquery.不会针对每个选择器做示例,只练习了一些常用的,有意思的. 先看html/js代码: <!DO ...

  2. 一些自托管(self hosted)服务的使用笔记

    opengrok oracle的opengrok是一个项目代码查找工具,自建索引,类似工具有source insight 官方已经提供好了docker镜像,傻瓜式安装.不过增加新的项目源码时需要手动更 ...

  3. Linux内核驱动:cdev、misc以及device三者之间的联系和区别

    Linux内核驱动:cdev.misc以及device三者之间的联系和区别 背景 我想在cdev中使用dev_err等log打印函数,但是跟踪了一下cdev中的原型,发现并不是我想要的. 常见的驱动是 ...

  4. 如何免费在 arm 官网上下载合适的手册

    背景 有时候搞底层配置的时候(尤其是uboot),需要查阅文档. 这里介绍如何在arm 官网进行查找下载,这样就可以不用去 CSDN 了. 实际上CSDN上的一些文档就是这样下载下来二次收费的,强烈谴 ...

  5. Java for循环倒序输出

    1.实现一个for循环的倒序输出 在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现.下面,我将给出一个详细 ...

  6. 你有对 Vue 项目进行哪些优化?

    (1)代码层面的优化 v-if 和 v-show 区分使用场景 computed 和 watch 区分使用场景 v-for 遍历必须为 item 添加 key,且避免同时使用 v-if 图片资源懒加载 ...

  7. Spring的IOC容器类别概述

    Spring的IOC该如何理解呢? 平常在一个方法当中,若要用到外部另一个类里的非静态方法,首先,需要先通过new一个对象,再根据这个对象去调用其方法.若只需要一两个对象还好,一旦涉及的外部对象多了, ...

  8. 洛谷P5020

    水一道绿题... #include<iostream> #include<utility> #include<algorithm> using namespace ...

  9. Vscode控制台乱码的最终解决方案

    Vscode控制台乱码的最终解决方案 vscode运行项目时控制台打印日志乱码.网上也有许多解决办法. 方法一[管用]推荐,避免过多设置 Java项目时,像Springboot微服务项目默认使用的是l ...

  10. 内部网关协议RIP

    RIP协议的特点:仅和相邻路由器交换信息:交换自己现在的路由表:按固定的时间周期. 对每一个相邻路由器发送的RIP报文,执行以下步骤: 1.对地址为x的相邻路由器发来的报文,修改此报文中的所有项目,把 ...