SMU Summer 2023 Contest Round 8(2019 陕西省大学生程序设计竞赛)
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 陕西省大学生程序设计竞赛)的更多相关文章
- [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 ...
 - [贪心,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 ...
 - 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛(8/11)
		
$$2019中国大学生程序设计竞赛(CCPC)\ -\ 网络选拔赛$$ \(A.\hat{} \& \hat{}\) 签到,只把AB都有的位给异或掉 //#pragma comment(lin ...
 - 【赛后总结+部分题解】2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛
		
赛后总结: T:今天状态一般,甚至有点疲惫.然后12点比赛开始,和队友开始看题,从最后往前面看,发现数学题公式看不懂.然后发现队友已经双开做1001和1006了,我看着1007有人A,开始做1007. ...
 - 2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)
		
题目链接:https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合 ...
 - 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)
		
题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...
 - 2019河北省大学生程序设计竞赛(重现赛)J-舔狗 (拓扑排序)
		
题目链接:https://ac.nowcoder.com/acm/contest/903/J 题意:给你 n 个舔狗和他喜欢的人,让你俩俩配对(只能和喜欢它的和它喜欢的),求剩下的单身狗数量. 思路: ...
 - Contest - 中南大学第六届大学生程序设计竞赛(Semilive)
		
题1:1160十进制-十六进制 注意他给的数据范围 2^31,int是 2^31-1 #include<iostream> using namespace std; int main() ...
 - ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
		
Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...
 - 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- ...
 
随机推荐
- Mirror多人联网发布阿里云
			
Mirror多人联网发布阿里云 新建模板小书匠 将mirror网络地址和端口选为你阿里云服务器上开放的公网地址和端口 IP与端口 2. 在阿里云服务器安全组中开放你所制定的端口 开放阿里云端口 3. ...
 - onreadystatechange 属性
			
onreadystatechange 属性是 XMLHttpRequest 对象的一个事件处理器,用于在 XMLHttpRequest 对象的 readyState 属性发生变化时触发.这个属性通常用 ...
 - 更难、更好、更快、更强:LLM Leaderboard v2 现已发布
			
摘要 评估和比较大语言模型 (LLMs) 是一项艰巨的任务.我们 RLHF 团队在一年前就意识到了这一点,当时他们试图复现和比较多个已发布模型的结果.这几乎是不可能完成的任务:论文或营销发布中的得分缺 ...
 - 网络OSI七层模型及各层作用 tcp-ip
			
背景 虽然说以前学习计算机网络的时候,学过了,但为了更好地学习一些物联网协议(MQTT.CoAP.LWM2M.OPC),需要重新复习一下. OSI七层模型 七层模型,亦称OSI(Open System ...
 - P8451 题解
			
显然,题面明摆着让你写一个可持久化 AC 自动机. 但是从空间来说这是不可能的. 想起做 不强制在线 的可持久化数据结构的一种方法,建立"时光树",具体来说,假若版本 \(x\) ...
 - Redis挂了,怎么补救?谈谈如何实现redis的高可用
			
Redis挂了,怎么补救?谈谈如何实现redis的高可用! Redis实现高可用主要有三种部署模式:主从模式.哨兵模式和集群模式. 分区 分区(Partitioning)是一种最为简单的拓展方式. 在 ...
 - JS 延迟加载
			
function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; wh ...
 - 效率工具RunFlow完全手册之进阶篇
			
欢迎来到RunFlow手册的进阶篇,如果您还不了解RunFlow,建议先阅读我们的基础篇. (Solo 社区投稿) 搜索文件 按文件大小过滤,添加 len 参数,比如:len:1kb-2kb,len: ...
 - iOS开发基础100 - MDM证书申请流程
			
申请成为MDM Vendor 首先需要拥有一个 iOS Developer Enterprise Program 帐号; 申请成为MDM Vendor,iOS企业开发帐号默认不支持MDM功能,需要向苹 ...
 - 变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用
			
巴图自动化Profinet转Modbus模块(BT-MDPN10)是一种用于不同通讯协议之间互连的设备,它可以将Profinet与Modbus这两种不同的通讯协议进行转换,从而实现设备之间的通讯和数据 ...