2019牛客暑期多校训练营(第四场)k题、j题
k题:
题意:
给你一串由数字构成的字符串,你从这个字符串中找子字符串使这个字符串是300的倍数
题解:
这道题和第三场的B题极其相似
首先可以把是三百的倍数分开,必须要是100和3的倍数
是100的倍数就要求后面必须有两个0
是3的倍数就可以通过这个子字符串的数字之和是3的倍数来判断
那么暴力来计算子字符串肯定会超时,所以这个3的倍数这里要优化
首先我们要对这个字符串进行初始化,计算它的前缀和取余3后的结果
首先对一个0的出现要特判,因为题目上说了0也算300的倍数
其次大家想一下如果字符串两个位置取余3后的结果一样(假设结果为2),那么这两个位置中间一段就是3的倍数
因为我们预处理的是前缀和取余3后的结果,那么如果第一个位置之前取余3后的结果2,后面还有一个位置取余后也是2,那么让这后一个位置的前缀减去前一个位置的前缀,那么不就把这个2给消了吗,因此可以通过这样把复杂度降低
还有上边只是说了是3的倍数,并没有说是300的倍数,因此还要判断这个位置和前边那个位置是不是0
上代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1e5+10;
7 char str[maxn];
8 int w[maxn],v[maxn];
9 int main()
10 {
11 scanf("%s",str+1);
12 int len=strlen(str+1);
13 int ans=0;
14 for(int i=1;i<=len;++i)
15 {
16 ans=ans+str[i]-'0';
17 ans%=3;
18 v[i]=ans;
19 }
20 long long sum=0;
21 for(int i=1;i<=len;++i)
22 {
23 if(str[i]=='0')
24 {
25 sum++;
26 if(str[i-1]=='0')
27 {
28 sum+=w[v[i]];
29 }
30 }
31 w[v[i-1]]++; //这一点就是来限制子字符串的个数要大于1, //因为一个0的已经特判了
32 }
33 printf("%lld\n",sum);
34 return 0;
35 }
j题:
这道题时遇到分层图最短路问题,我原来是想通过记录最短路路径,然后在对这个最短路路径上的最大边剔除,但是一直RE,只好拿出来分层最短路模板了
分层最短路讲解---->传送门
我在这里就把他的模板拿过来^_^
第一种(加点)
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 using namespace std;
7 const int INF=0xffffff;
8 const int maxn=1e7+10;
9 int n,m,nnn[maxn],fir[maxn],to[maxn],val[maxn],cnt,dis[maxn],d[maxn],w[maxn],q[maxn];
10 //int flag[maxn][maxn];
11 struct shudui1
12 {
13 int start,value;
14 bool operator <(const shudui1 q)const
15 {
16 return value>q.value;
17 }
18 } str1;
19 priority_queue<shudui1>r;
20 void JK()
21 {
22 memset(dis,0,sizeof(dis));
23 while(!r.empty())
24 {
25 str1=r.top();
26 r.pop();
27 int x=str1.start;
28 if(dis[x]) continue;
29 dis[x]=1;
30 for(int i=fir[x]; i!=-1; i=nnn[i])
31 {
32 if(!dis[to[i]] && d[to[i]]>d[x]+val[i])
33 {
34 str1.value=d[to[i]]=d[x]+val[i];
35 str1.start=to[i];
36 r.push(str1);
37 }
38 }
39 }
40 }
41 void init()
42 {
43 memset(d,0x3f,sizeof(d));
44 memset(fir,-1,sizeof(fir));
45 cnt=0;
46 }
47 void add_edge(int x,int y,int z)
48 {
49 nnn[++cnt]=fir[x];
50 fir[x]=cnt;
51 to[cnt]=y;
52 val[cnt]=z;
53 }
54 int main()
55 {
56 int s,t,k;
57 //memset(path,-1,sizeof(path));
58 scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
59 init();
60 while(m--)
61
62 {
63
64 int u, v, w;
65
66 scanf("%d%d%d",&u, &v, &w);
67
68 for(int i = 0; i <= k; i++)
69
70 {
71
72 add_edge(u + i * n, v + i * n, w);
73
74 add_edge(v + i * n, u + i * n, w);
75
76 if(i != k)
77
78 {
79
80 add_edge(u + i * n, v + (i + 1) * n, 0);
81
82 add_edge(v + i * n, u + (i + 1) * n, 0);
83
84 }
85
86 }
87
88 }
89 str1.start=s;
90 d[s]=0;
91 str1.value=0;
92 r.push(str1);
93 JK();
94 int ans=INF;
95 for(int i = 0; i <= k; i++)
96 ans = min(ans, d[t + i * n]);
97 printf("%d\n",ans);
98 return 0;
99 }
第二种(增加维度)
1 #include <iostream>
2
3 #include <string.h>
4
5 #include <stdio.h>
6
7 #include <algorithm>
8
9 #include <queue>
10
11 #include <vector>
12
13 #define ll long long
14
15 #define inf 0x3f3f3f3f
16
17 #define pii pair<int, int>
18
19 const int mod = 1e9+7;
20
21 const int maxn = 1e5+7;
22
23 using namespace std;
24
25 struct node{int to, w, next, cost; } edge[maxn];
26
27 int head[maxn], cnt;
28
29 int dis[maxn][15], vis[maxn][15];
30
31 int n, m, s, t, k;
32
33 struct Dijkstra
34
35 {
36
37 void init()
38
39 {
40
41 memset(head,-1,sizeof(head));
42
43 memset(dis,127,sizeof(dis));
44
45 memset(vis,0,sizeof(vis));
46
47 cnt = 0;
48
49 }
50
51
52
53 void add(int u,int v,int w)
54
55 {
56
57 edge[cnt].to = v;
58
59 edge[cnt].w = w;
60
61 edge[cnt].next = head[u];
62
63 head[u] = cnt ++;
64
65 }
66
67
68
69 void dijkstra()
70
71 {
72
73 priority_queue <pii, vector<pii>, greater<pii> > q;
74
75 dis[s][0] = 0;
76
77 q.push({0, s});
78
79 while(!q.empty())
80
81 {
82
83 int now = q.top().second; q.pop();
84
85 int c = now / n; now %= n;
86
87 if(vis[now][c]) continue;
88
89 vis[now][c] = 1;
90
91 for(int i = head[now]; i != -1; i = edge[i].next)
92
93 {
94
95 int v = edge[i].to;
96
97 if(!vis[v][c] && dis[v][c] > dis[now][c] + edge[i].w)
98
99 {
100
101 dis[v][c] = dis[now][c] + edge[i].w;
102
103 q.push({dis[v][c], v + c * n});
104
105 }
106
107 }
108
109 if(c < k)
110
111 {
112
113 for(int i = head[now]; i != -1; i = edge[i].next)
114
115 {
116
117 int v = edge[i].to;
118
119 if(!vis[v][c+1] && dis[v][c+1] > dis[now][c])
120
121 {
122
123 dis[v][c+1] = dis[now][c];
124
125 q.push({dis[v][c+1], v + (c + 1) * n});
126
127 }
128
129 }
130
131 }
132
133 }
134
135 }
136
137 }dj;
138
139
140
141 int main()
142
143 {
144
145 while(~scanf("%d%d%d%d%d", &n, &m,&s,&t &k))
146
147 {
148
149 dj.init(); //scanf("%d%d",&s,&t);
150
151 while(m--)
152
153 {
154
155 int u, v, w;
156
157 scanf("%d%d%d",&u, &v, &w);
158
159 dj.add(u, v, w);
160
161 dj.add(v, u, w);
162
163 }
164
165 dj.dijkstra();
166
167 int ans = inf;
168
169 for(int i = 0; i <= k; i++)
170
171 ans = min(ans, dis[t][i]);
172
173 printf("%d\n", ans);
174
175 }
176
177 }
2019牛客暑期多校训练营(第四场)k题、j题的更多相关文章
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- 【JavaWeb】JavaScript 基础
JavaScript 基础 事件 事件是指输入设备与页面之间进行交互的响应. 常用的事件: onload 加载完成事件:页面加载完成之后,常用于页面 js 代码初始化操作: onclick 单击事件: ...
- LeetCode200 岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...
- JavaFX之班级未交作业统计
前言 最近转移了系统平台,用上了Ubuntu1804版本系统,原来用C#写的Windows窗体软件也不能用了,而且自己在班级上每周都需要收作业,所以写了这个软件.这篇博客主要记录这个JavaFX应用的 ...
- WEB开发框架性能排行与趋势分析2-三大惊喜变化
WEB开发框架性能排行与趋势分析2-三大惊喜变化 Web框架性能排名 上一次基于TechEmpower的<Web Framework Benchmarks>性能基准测试的解读之后,时隔两年 ...
- puppetlabs地址
https://yum.puppetlabs.com/el/6Server/products/i386/ rpm -Uvh http://yum.puppetlabs.com/el/6Server/ ...
- 【Oracle】win7安装报错
在WIN7上安装oracle 10g时,提示如下信息: 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: 失败 &l ...
- UI测试框架
1. 从上到下共分成4层: 用例层 组件管理层 元素管理层 公共数据层 2. 用例层: 将每条用例使用参数化, 公共参数存储到"公共数据层", 中间参数通过组件层传递 3. ...
- Py其他内置函数,文件修改
其他内置函数 1.abs函数,取绝对值 print(abs(-1)) 2.all函数,判断可迭代对象是否全为真,有假直接假 假:0,'',None print(all([1,2,'1'])) prin ...
- 在Ubuntu下安装Jenkins
一.安装Jenkins 1. 确保Java环境已经安装配置好 java -version 2. 将存储库密钥添加到系统 wget -q -O - https://pkg.jenkins.io/debi ...
- nginx常用功能和配置
nginx常用功能和配置 1.nginx常用功能和配置 1.1 限流 1.2 压力测试工具--Ab 1.2.1安装 1.2.2 测试 1.2.3 返回值 1.3 limit_conn_zone 1.4 ...