目录
B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
模拟,找点,把点前面的截出来判断
代码:
#include<iostream>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, cnt=0;
string str[N];
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> str[i];
for (int i = 1; i <= n; i++)
{
int c = str[i].find('.');
int k = 0;
int flag = 1;
int flags = 1;
while (flags==1)
{
string s = str[i].substr(0, c);
if (c == -1)
s = str[i],flags=0;
str[i].erase(0, c+1);
if (s > "255"&&s.size()>=3)
{
flag = 0;
break;
}
k++;
c = str[i].find('.');
}
if (k == 4 && flag == 1)
cnt++;
}
cout << cnt;
return 0;
}
C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
多画几个,找规律
代码:
#include<iostream>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, cnt=0,t;
string str[N];
void slove()
{
cin>>n;
if(n==0)
{
cout<<1<<" ";
return;
}
cout << n * (n - 1) + 2 << " ";
}
signed main()
{
cin >> t;
while (t--)
{
slove();
}
return 0;
}
E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
线段树求区间子段
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, q;
int a[N];
struct Node
{
int l, r;
int len, lmax, rmax; //len 代表的就是长度
int tmax; //最大连续子段和
}tr[N << 2];
void pushup(Node& u, Node& l, Node& r)
{
u.len = l.len + r.len;
if (l.len == l.lmax)
u.lmax = l.len + r.lmax;
else
u.lmax = l.lmax;
if (r.len == r.rmax)
u.rmax = r.len + l.rmax;
else
u.rmax = r.rmax;
u.tmax = max({ l.tmax, r.tmax, l.rmax + r.lmax });
}
void pushup(int u)
{
pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r)
{
if (l == r)
tr[u] = { l ,r, 1, 1, 1, 1 };
else
{
tr[u] = { l, r };
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int x)//更新
{
if (tr[u].l == x && tr[u].r == x)
{
if (tr[u].lmax == 1)
tr[u] = { x, x, 1, 0, 0, 0 };
else
tr[u] = { x, x, 1, 1, 1 ,1 };
}
else
{
int mid = tr[u].l + tr[u].r >> 1;
if (mid >= x)
modify(u << 1, x);
else
modify(u << 1 | 1, x);
pushup(u);
}
}
Node query(int u, int l, int r)//询问
{
if (l <= tr[u].l && r >= tr[u].r)
return tr[u];
else
{
int mid = tr[u].l + tr[u].r >> 1;
if (r <= mid)
return query(u << 1, l, r);
else if (l > mid)
return query(u << 1 | 1, l, r);
else
{
auto left = query(u << 1, l, r);
auto right = query(u << 1 | 1, l, r);
Node res;
pushup(res, left, right);
return res;
}
}
}
signed main()
{
cin >> n >> q;
build(1, 1, n);
int op;
while (q--)
{
int x, l, r;
cin >> op;
if (op == 1)
{
cin >> x;
modify(1, x);
}
else
{
cin >> l >> r;
cout << query(1, l, r).tmax << endl;
}
}
return 0;
}
F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
0加到x,二进制第0位上每加1就变化一次,第1位上每加2就变化一次,...,第i位上每加2^i就会变化一次,即第i位上变化次数为x/(2^i),每个位上累加的和就是从0加到x变化的次数 算一下0到x和0到x+y的次数,作差就是x加到x+y变化的次数
代码:
#include<iostream>
#include<vector>
#include<map>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, t, x, y;
void slove()
{
cin >> x >> y;
int n = x + y;
int sum1 = 0, sum2 = 0;
while (x)
{
sum1 += x;
x /= 2;
}
while (n)
{
sum2 += n;
n /= 2;
}
cout << sum2 - sum1 << "\n";
}
signed main()
{
cin >> t;
while (t--)
{
slove();
}
return 0;
}
I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
先跑一遍从1到n,求出最短路径
再跑一遍先到k再到n的最短路径
两者比较,求出最短路
代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
#define int long long
#define inf 1e18
using namespace std;
const int N = 1e6+10;
int n, m,t,k;
struct node
{
int v,c, d;
};
priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>>q;
vector<node> g[N];
int dis[N];
int book[N];
int bfs(int s,int e,int f)
{
for(int i=1;i<=n;i++)
{
book[i]=0;
dis[i]=inf;
}
dis[s] = 0;
q.push({ 0,s });
while (!q.empty())
{
int z = q.top().first, u = q.top().second;
q.pop();
if (book[u])
continue;
book[u] = 1;
for (auto x : g[u])
{
int v = x.v, c = x.c, d = x.d;
if (book[v])
continue;
if (f == 0)
{
if (d)
{
if (dis[v] > c + z)
{
dis[v] = c + z;
q.push({ dis[v],v });
}
}
}
else
{
if (dis[v] > c + z)
{
dis[v] = c + z;
q.push({ dis[v],v });
}
}
}
}
return dis[e];
}
void slove()
{
cin >> n >> m >> k;
int a, b, c, d;
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> c >> d;
g[a].push_back({ b,c,d });
g[b].push_back({ a,c,d });
}
int tmp1 = bfs(1, n, 0);
int tmp2 = bfs(1, k, 0);
int tmp3 = bfs(k, n, 1);
int ans = min(tmp1, tmp2 + tmp3);
if (ans < inf)
cout << ans << "\n";
else
cout << "-1\n";
}
signed main()
{
t=1;
while (t--)
{
slove();
}
return 0;
}
J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
模拟即可
代码:
#include<iostream>
#define int long long
using namespace std;
const int N = 1e2;
int n, m;
int a[N][N], b[N][N], c[N][N];
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
cin >> b[i][j];
int t = m - n + 1;
for (int i = 1; i <= t; i++)
{
for (int d = 1; d <= t; d++)
{
c[i][d] = 0;
for (int k = 1; k <= n; k++)
{
for (int j = 1; j <= n; j++)
{
c[i][d] += a[k][j] * b[k + i - 1][j + d - 1];
}
}
}
}
for (int i = 1; i <= t; i++)
{
for (int j = 1; j <= t; j++)
cout << c[i][j] << " ";
cout << "\n";
}
return 0;
}
L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:
用map简单的模拟
代码:
#include<iostream>
#include<vector>
#include<map>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, k,q, cnt=0,t;
string str[N];
map<string, string>mp1;
map<string, map<string,vector<string>>>mp2;
void slove()
{
cin >> m >> n >> q;
for (int i = 1; i <= m; i++)
{
string pub, pri;
cin >> pub >> pri;
mp1[pri] = pub;
}
for (int i = 1; i <= n; i++)
{
string str;
cin >> str >> k;
for (int j = 1; j <= k; j++)
{
string name;
int d;
cin >> name >> d;
for (int c = 1; c <= d; c++)
{
string s;
cin >> s;
mp2[str][name].push_back(s);
}
}
}
while (q--)
{
string name, id, pwd;
cin >> name >> id >> pwd;
string fpwd = mp1[pwd];
int flag = 0;
for (auto i : mp2[id][name])
{
if (i == fpwd)
{
flag = 1;
cout << "Yes\n";
break;
}
}
if (flag == 0)
cout << "No\n";
}
}
signed main()
{
t = 1;
while (t--)
{
slove();
}
return 0;
}