2021牛客寒假算法基础集训营1 题解

2023-05-16

2021牛客寒假算法基础集训营1 题解

比赛地址:https://ac.nowcoder.com/acm/contest/9981

官方题解:https://ac.nowcoder.com/discuss/593200

A-串

第一种:我们用 f [ i ] f[i] f[i]来表示长度为 i i i u s us us的串的数量,对于当前位置:

  • 如果之间有完整的 u s us us了,那么随便填,有 26 26 26种情况。

    f [ i ] + = f [ i − 1 ] ∗ 26 f[i] += f[i-1] * 26 f[i]+=f[i1]26

  • 如果之前没有完整的 u s us us,但是有一个 u u u,那么就必须在这个位置上添加一个 s s s。具体算法: 所 有 的 情 况 − 有 u s 的 情 况 − 没 有 u 的 情 况 = 有 一 个 u 的 情 况 所有的情况-有us的情况-没有u的情况=有一个u的情况 usu=u

    也就是 2 6 i − 1 − f [ i − 1 ] − 2 5 i − 1 26^{i-1} - f[i-1] - 25^{i-1} 26i1f[i1]25i1

整合就是: f [ i ] = f [ i − 1 ] ∗ 25 + 2 6 i − 1 − 2 5 i − 1 f[i] = f[i-1] * 25 + 26^{i-1} - 25^{i-1} f[i]=f[i1]25+26i125i1

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 1e6 + 10;
const ll mod = 1e9 + 7;
ll f[maxn];
ll qsm(ll a, ll b){
	ll res = 1;
	while(b){
		if(b & 1) res = (res * a) % mod;
		a = (a * a) % mod;
		b >>= 1;
	}
	return res % mod;
}
void solve(){
	int n; cin >> n;
	f[0] = 0; f[1] = 0;
	for(int i = 2; i <= n; i++){
		f[i] = ((qsm(26, i-1)-qsm(25, i-1) + mod) % mod + f[i-1] * 25 % mod) % mod;
	}
	ll ans = 0;
	for(int i = 0; i <= n; i++) ans = (ans + f[i]) % mod;
	cout << ans << endl;
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

第二种:动态规划

我们用 f [ i ] [ 0 / 1 / 2 ] f[i][0/1/2] f[i][0/1/2]表示长度为 i i i没有 u u u的串/有 u u u s s s的串/有 u s us us的串。

状态转移方程:

f [ i ] [ 0 ] = f [ i − 1 ] [ 0 ] ∗ 25 ; f[i][0] = f[i-1][0] * 25; f[i][0]=f[i1][0]25;

f [ i ] [ 1 ] = f [ i − 1 ] [ 0 ] + f [ i − 1 ] [ 1 ] ∗ 25 ; f[i][1] = f[i-1][0] + f[i-1][1] * 25; f[i][1]=f[i1][0]+f[i1][1]25;

f [ i ] [ 2 ] = f [ i − 1 ] [ 1 ] + f [ i − 1 ] [ 2 ] ∗ 26 ; f[i][2] = f[i-1][1] + f[i-1][2] * 26; f[i][2]=f[i1][1]+f[i1][2]26;

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 1e6 + 10;
const ll mod = 1e9 + 7;
ll f[maxn];
ll qsm(ll a, ll b){
	ll res = 1;
	while(b){
		if(b & 1) res = (res * a) % mod;
		a = (a * a) % mod;
		b >>= 1;
	}
	return res % mod;
}
/*
void solve(){
	int n; cin >> n;
	f[0] = 0; f[1] = 0;
	for(int i = 2; i <= n; i++){
		f[i] = ((qsm(26, i-1)-qsm(25, i-1) + mod) % mod + f[i-1] * 25 % mod) % mod;
	}
	ll ans = 0;
	for(int i = 0; i <= n; i++) ans = (ans + f[i]) % mod;
	cout << ans << endl;
}
*/
ll a[maxn][3];
void solve(){
	int n; cin >> n;
	a[0][0] = a[0][1] = a[0][2] = 0;
	a[1][0] = 25; a[1][1] = 1; a[1][2] = 0;
	for(int i = 2; i <= n; i++){
		a[i][0] = a[i-1][0] * 25 % mod;
		a[i][1] = (a[i-1][0] + a[i-1][1] * 25 % mod) % mod;
		a[i][2] = (a[i-1][1] + a[i-1][2] * 26 % mod) % mod;
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) ans = (ans + a[i][2]) % mod;
	cout << ans << endl;
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

B-括号

可以这样去构造:

找到个数最少的满足 x ∗ y + z x*y+z xy+z的括号数,那么构造左括号为 x x x个,右括号为 y y y个,剩余 z z z个括号插入合适的位置即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 2e5 + 10;
const ll mod = 1e9 + 7;
void solve(){
	ll k; cin >> k;
	if(k == 0){
		cout << "(" << endl;
		return;
	}
	ll a = 1e9, b = 1e9, p = 1e9;
	for(ll i = 1; i * i <= k; i++){
		ll x = i, y = k / i, z = k - (i * (k / i));
		// cout <<  x << " " << y << " " << z << endl;
		if(x + y + z < a + b + p){
			a = x, b = y, p = z;
		}
	}
	string ans = "(";
	for(int i = 0; i < p; i++) ans += ")";
	for(int i = 0; i < a - 1; i++) ans += "(";
	for(int i = 0; i < b; i++) ans += ")";
	cout << ans << endl;
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

C-红和蓝

思维:特殊到一般,简单到复杂。

叶子节点只能和它的父节点一个颜色,那么我们可以从叶子节点开始考虑, d f s dfs dfs将叶子节点和它的父亲节点化为一个颜色,过程中如果有叶子节点的父节点已经上色了,或者有个节点没有被上色,那么不满足要求直接输出-1。

接着再跑一遍 d f s dfs dfs染色。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 3e5 + 10;
const ll mod = 1e9 + 7;
int n, cnt = 0;
vector<int> G[maxn];
int col[maxn], vis[maxn];
bool flag = false;
void dfs(int u, int fa){
	int count = 0;
	for(auto v : G[u]){
		if(v == fa) continue;
		count ++;
		dfs(v, u);
	}
	if(count == 0 || !vis[u]){
		if(vis[fa]) {flag = true; return;}
		vis[u] = vis[fa] = ++cnt;
	}
}
void dfs2(int u, int fa){
	for(auto v : G[u]){
		if(v == fa) continue;
		if(vis[v] == vis[u]) col[v] = col[u];
		else col[v] = col[u] ^ 1;
		dfs2(v, u);
	}
}
void solve(){
	cin >> n;
	int x, y;
	for(int i = 1; i < n; i++){
		cin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}

	memset(vis, 0, sizeof vis);
	dfs(1, 0);

	if(flag || vis[0] != 0) {
		cout << -1 << endl;
		return;
	}
	//for(int i = 1; i <= n; i++) cout << vis[i] << " ";
	//cout << endl;

	col[1] = 1;
	dfs2(1, 0);
	for(int i = 1; i <= n; i++) cout << (col[i] == 1 ? 'R' : 'B');
	cout << endl;
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

D-点一成零

考虑并查集。

首先先考虑没有改变的情况总方案数是怎么算出来的: 总 方 案 数 = 连 通 块 的 个 数 ∗ 每 个 联 通 块 中 1 的 个 数 总方案数=连通块的个数*每个联通块中1的个数 =1

接着考虑将0变为1的操作会改变什么?

可能会引起某个连通块变大,或者是增加连通块,或者将多个连通块合并为一块。

代码实现上,如果这个位置本来就是1,那么无需计算直接输出;若为0,可以先计算连通块增加后的总方案数,接着遍历4个方向,有等于1并且不在一个连通块里的,就计算方案数并合并。

计算公式为: 原 a n s / ( 修 改 后 的 c n t ∗ 两 个 连 通 块 的 个 数 ) ∗ 两 个 连 通 块 个 数 总 和 原ans / (修改后的cnt * 两个连通块的个数) * 两个连通块个数总和 ans/cnt

注意

  • 并查集中二维结构要转换成一维的。
  • 最后计算中除一个很大的数可以转换成乘它的逆元。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 5e5 + 10;
const ll mod = 1e9 + 7;
int n;
int f[maxn], sz[maxn];
int a[550][550];
string s[550];
int d[4][2] = {1, 0, -1, 0, 0, -1, 0, 1};
ll qsm(ll a, ll b){
	ll res = 1;
	while(b){
		if(b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res % mod;
}
void init(){
	for(int i = 0; i <= n * n; i++) f[i] = i, sz[i] = 1;
}
int Find(int x){
	if(x == f[x]) return x;
	return f[x] = Find(f[x]);
}
void Union(int x, int y){
	x = Find(x), y = Find(y);
	if(x == y) return;
	f[x] = y;
	sz[y] += sz[x];
}
void solve(){
	cin >> n;
	init();
	for(int i = 0; i < n; i++){
		cin >> s[i];
		for(int j = 0; j < n; j++){
			char c = s[i][j];
			if(c == '0') continue;
			if(j > 0 && s[i][j-1] == '1') Union(i * n + j, i * n + j - 1); 
			if(i > 0 && s[i-1][j] == '1') Union(i * n + j, (i-1) * n + j); 
			if(i < n-1 && s[i+1][j] == '1') Union(i * n + j, (i+1) * n + j); 
			if(j < n-1 && s[i][j+1] == '1') Union(i * n + j, i * n + j + 1); 
		}
	}

	int cnt = 0;
	ll ans = 1;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(f[i * n + j] == i * n + j && s[i][j] == '1') cnt++, ans = ans * sz[i *n + j] % mod;
		}
	}
	for(int i = 1; i <= cnt; i++) ans = ans * i % mod;


	int k; cin >> k;
	for(int i = 0; i < k; i++){
		int x, y; cin >> x >> y;
		if(s[x][y] == '1'){
			cout << ans << endl;
			continue;
		}
		s[x][y] = '1';
		cnt ++;
		ans = ans * cnt % mod;
		for(int i = 0; i < 4; i++){
			int dx = x + d[i][0], dy = y + d[i][1];
			if(dx < 0 || dy < 0 || dx >= n || dy >= n) continue;
			if(s[dx][dy] == '1'){
				int f1 = Find(dx * n + dy), f2 = Find(x * n + y);
				if(f1 != f2){
					ans = ans * qsm(cnt, mod - 2) % mod;
					ans = ans * qsm(sz[f1], mod - 2) % mod;
					ans = ans * qsm(sz[f2], mod - 2) % mod;
					ans = ans * (sz[f1] + sz[f2]) % mod;
					cnt--;
					Union(f1, f2);
				}
			}
		}
		cout << ans << endl;
	}
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

I-限制不互素对的排列

构造、数学

注意题目中的条件 k < = n / 2 k <= n/2 k<=n/2

我们很容易可以发现相邻的两数都互为素数,相邻的两个奇数也都互为素数。两个偶数的最大公约数都大于1,所以我们可以考虑将相邻的偶数放在一起。这样当 n / 2 > k n/2 > k n/2>k, 是一定能够找到满足的排列。

n / 2 = = k n/2 == k n/2==k, 我们可以发现 6 6 6 3 3 3的最大公约数大于 1 1 1, 那么只需要将 6 6 6放在最后一个偶数位上后跟 3 3 3即可满足有 n / 2 n/2 n/2对gcd大于1的数对。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 2e5 + 10;
const ll mod = 1e9 + 7;
void solve(){
	int n, k; cin >> n >> k;
	if(n < 6 && n / 2 == k){ cout << -1 << endl; return;}
	if(n /2 > k){
		int cnt = -1;
		for(int i = 2; i <= n; i += 2){
			cout << i << " ";
			cnt++;
			if(cnt == k) break;
		}
		for(int i = 1; i <= n; i ++){
			if((i & 1) || i > (cnt + 1) * 2) cout << i << " ";
		}
	}
	else{
		for(int i = 2; i <= n; i += 2) if(i != 6) cout << i << " ";
		cout << "6 3 1 ";
		for(int i = 5; i <= n; i += 2) cout << i << " ";
 	}
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

J-一群小青蛙呱蹦呱蹦呱

数论

举例可以发现:

​ 被划掉的数:
2 : 2 1 2 2 2 3 2 4 2^1 2^2 2^3 2^4 21222324
3 : 3 1 3 2 3 3 3 4 3^1 3^2 3^3 3^4 31323334
​ 5 : 5 1 5 2 5 3 5 4 5^1 5^2 5^3 5^4 51525354

观察到:没有被划掉的数是具有两种或者两种以上的类型不同的质因子, 比如: 6   12 6 \ 12 6 12

那么最后的结果可以表示为 p 1 n 1 p 2 n 2 p 3 n 3 p 4 n 4 p 5 n 5 . . . p_1^{n1}p_2^{n2}p_3^{n3}p_4^{n4}p_5^{n5}... p1n1p2n2p3n3p4n4p5n5...

对于两个这样的数: p 1 n 1 p 2 n 2 p 3 n 3 p 4 n 4 p 5 n 5 . . . p_1^{n1}p_2^{n2}p_3^{n3}p_4^{n4}p_5^{n5}... p1n1p2n2p3n3p4n4p5n5... p 1 m 1 p 2 m 2 p 3 m 3 p 4 m 4 p 5 m 5 . . . p_1^{m1}p_2^{m2}p_3^{m3}p_4^{m4}p_5^{m5}... p1m1p2m2p3m3p4m4p5m5...求lcm为 p 1 m a x ( m 1 , n 1 ) p 2 m a x ( m 2 , n 2 ) p 3 m a x ( m 3 , n 3 ) p 4 m a x ( m 4 , n 4 ) p 5 m a x ( m 5 , n 5 ) . . . p_1^{max(m1, n1)}p_2^{max(m2, n2)}p_3^{max(m3, n3)}p_4^{max(m4, n4)}p_5^{max(m5, n5)}... p1max(m1,n1)p2max(m2,n2)p3max(m3,n3)p4max(m4,n4)p5max(m5,n5)...,

那么问题转化为对于每一个质因子 p p p, 我们求它的最高次数即可。有两种情况:

  • p = 2 p = 2 p=2时, 2 2 2的最高次数 x x x一定为 2 x ∗ 3 < = n 2^x*3<=n 2x3<=n,那么 x = f l o o r ( l o g ( n / 3 ) / l o g ( 2 ) ) x = floor(log(n/3) / log(2)) x=floor(log(n/3)/log(2))

  • p   ! =   2 p\ !=\ 2 p != 2时, p p p的最高次数 x x x一定为 p x ∗ 2 < = n p^x*2<=n px2<=n,那么 x = f l o o r ( l o g ( n / 2 ) / l o g ( p ) ) x = floor(log(n/2) / log(p)) x=floor(log(n/2)/log(p))

最后求积即可。

素数筛不可以用埃氏筛,会TLE,线性筛即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 8e7 + 10;
const ll mod = 1e9 + 7;
ll p[maxn];
bool v[maxn]; 
int n;
ll qsm(ll a, ll b){
	ll res = 1;
	while(b){
		if(b & 1) res = (res * a) % mod;
		a = (a * a) % mod;
		b >>= 1;
	}
	return res % mod;
}
ll calc(int i){
	if(i == 2) return qsm(2, log(n / 3) / log(2));
	return qsm(i, log(n / 2) / log(i));
}
void solve(){
	cin >> n;
	memset(v, false, sizeof v);
	int cnt = 0;
	ll ans = 1;
	for(int i = 2; i <= n / 2; i++){
		if(!v[i]){
			p[cnt++] = i;
			ans = (ans * calc(i)) % mod;
		}
		for(int j = 0; j < cnt && i * p[j] <= n / 2; j++){
			v[i * p[j]] = 1;
			if(i % p[j] == 0) break;
		}
	}
	if(ans == 1) cout << "empty" << endl;
	else cout << ans << endl;
}
int main(){
    IOS; int t = 1;
    while(t--){
        solve();
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021牛客寒假算法基础集训营1 题解 的相关文章

  • shell for循环多个变量

    1 使用花括号 var1 var2 var3 a 61 span class token string 34 apple 34 span span class token punctuation span b 61 span class t
  • shell 基本运算符

    文章目录 1 算数运算2 关系运算符3 布尔运算符4 逻辑运算符5 字符串运算符6 文件测试运算符知识点 1 算数运算 方法一 sum1 61 96 expr 3 span class token operator 43 span 5 96
  • Dockerfile简介

    1 什么是dockerfile Dockerfile是一个包含用于组合映像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成映像 docker build命令用于从Dockerfile
  • 容器通信之跨链接通信

    前言 同一主机下搭建容器应用栈的环境 xff0c 只需要完成容器互联来实现容器间的通信即可 xff0c 这里采用docker run link选项建立容器间的互联关系 docker官方已不推荐使用docker run link来链接2个容器
  • Linux进程间通信

    1 unix域套接字 域套接字 xff1a 1 只能用于同一设备上不同进程之间的通信 xff1b 2 效率高于网络套接字 域套接字仅仅是复制数据 xff0c 并不走协议栈 xff1b 3 可靠 xff0c 全双工 xff1b 2 IP套接字
  • 什么是API

    1 什么是API API是Application Programming Interface xff08 应用程序接口 xff09 的缩写 是一些预先定义的函数 xff0c 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力
  • FreeRTOS(二)任务基础知识

    一 前后台系统与RTOS 前后台系统 61 死循环 xff08 通常为1个 xff09 43 中断服务程序 xff08 通常为若干个 xff09 应用程序是一个无限循环 xff0c 循环中调用 API 函数完成所需的操作 xff0c 这个大
  • SBUS协议(20200210)

    最近看到很多sbus协议 xff0c 就专门搜集了一些资料学习一下 1 介绍 SBUS是一个接收机串行总线输出 xff0c 通过这根总线 xff0c 可以获得遥控器上所有通道的数据 目前很多模型及无人机电子设备都支持SBUS总线的接入 使用
  • 【openmv专题】串口通信

    这篇文章主要讲述openmv串口通信过程中会出现错位 xff0c 因缓存空间不足带来的串口报错问题 xff0c 直接进入正题 xff1a 串口通信有同步和异步之分 xff0c 而openmv用的是异步通信 xff0c 需要有缓存区 xff0
  • FreeRTOS任务上下文切换与任务状态切换的区别及联系

    FreeRTOS 中的任务上下文切换和任务状态切换是两个不同的概念 1 任务状态切换是指任务从一种状态切换到另一种状态 FreeRTOS 中的任务状态包括就绪态 阻塞态和运行态 当任务从就绪态切换到运行态时 xff0c 任务开始执行 xff
  • XGBOD:用无监督表示学习改进有监督离群点检测

    XGBOD Improving Supervised Outlier Detection with Unsupervised Representation Learning 论文链接 xff1a https www andrew cmu e
  • 小觅S系列相机运行vins-mono(轨迹飘飞解决版)

    小觅S系列相机运行vins mono xff08 轨迹飘飞解决版 xff09 1 SDK驱动2 获得相机标定数据3 下载MYNT EYE VINS Sample4 运行 前期准备 xff1a 安装并成功运行VINS MONO 1 SDK驱动
  • 嵌入式第0部分:嵌入式工程师完全学习指南

    一 什么是嵌入式 xff08 一 xff09 定义 xff1a 传统定义 xff08 狭义嵌入式 xff09 xff1a 嵌入式系统是以应用为中心 xff0c 以计算机技术为基础 xff0c 并且软硬件课裁剪 xff0c 适用于应用系统对功
  • 【SLAM 十四讲】---第七讲、视觉里程计

    第七讲 视觉里程计
  • Vscode配置git

    1 Git介绍和安装 Git是什么 Git是目前世界上最先进的分布式版本控制系统 xff08 没有之一 xff09 简单来说 它是控制项目版本的一个工具 我们可以利用Git进行多人协作和代码备份等工作 下载git xff08 64bit w
  • Xshell连接虚拟机Ubantu失败解决办法(主机和虚拟机能够互ping的前提)

    主机和虚拟机互ping 在主机命令行里输入ipconfig指令 xff0c 查询主机ip地址 xff0c 在虚拟机Ubantu终端里输入ping 主机ip地址 xff0c ping通后 xff0c 按ctrl 43 c停止 在虚拟机Uban
  • windows 11系统安装

    安装前注意事项 1 准备8G或8G以上U盘 xff08 32G以内 xff09 2 安装系统前备份好个人需要数据 xff08 制作U盘会格式化U盘 xff0c U盘内的重要文件也要事先备份好 xff09 3 预装office的务必记住自己激
  • docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at

    一 前言 docker安装完成 xff0c 一般用户没有权限启动docker服务 xff0c 只能通过sudo来通过root用户权限来启动docker xff0c 此时对于一般用户而言 xff0c 需要执行docker ps或者docker
  • Neo4j(七)——创建新数据库(如何在Neo4j中创建新数据库)

    方法一 xff1a 找到neo4j安装目录 xff0c 编辑conf文件夹中的neo4j conf 找到dbms active database 61 xff0c 将下图中的graph db用其他名称替换 xff0c 并解除注释 xff08
  • python VScode使用gitlab简单使用流程

    一 下载安装软件 1 安装好vscode xff0c 如未安装 xff0c 下载并且安装 https code visualstudio com Download 2 安装git windows客户端 https git scm com d

随机推荐

  • keil5工程函数无法跳转到函数定义解决方法

    问题描述 在使用keil查看工程代码时 xff0c 进行函数的跳转 xff0c 跳转不成功并提示以下错误 这是因为在编译工程的时候少勾选了一个选项 xff0c 按下以下方式勾选上然后重新Rebuild一下工程就好了
  • Codeforces D. Prefix-Suffix Palindrome

    Codeforces D Prefix Suffix Palindrome 题解 xff1a 和D1相同 xff0c 区别是找中间的回文串要压缩时间 xff0c 用到了马拉车算法 xff08 算法介绍在下面 xff1a span class
  • codeforces 1326 E.Bombs

    codeforces 1326 E Bombs 题意 xff1a 给定 1 n 1 n 1 n 的排列p q xff0c 将
  • Educational Codeforces Round 84 题解

    Educational Codeforces Round 84 题解 A Sum of Odd Integers 题意 xff1a n n n 是否能表示为 k k k 个不同的正奇
  • codeforces 1332 E - Height All the Same(组合数学、奇偶性)

    codeforces 1332 E Height All the Same 组合数学 奇偶性 题意 xff1a 现在有一个 n m n m n m 的方格 xff0c 第 i
  • codeforces 1330 C.D.题解

    codeforces 1330 C D 题解 Dreamoon Likes Coloring 题意 xff1a 给 n lt 61 100000 n lt 61 100000 n lt 61
  • LeetCode数独问题中Bitset的巧妙用处

    LeetCode数独问题中Bitset的巧妙用处 36 有效的数独 判断一个 9x9 的数独是否有效 只需要根据以下规则 xff0c 验证已经填入的数字是否有效即可 数字 1 9 在每一行只能出现一次 数字 1 9 在每一列只能出现一次 数
  • Morris 遍历

    Morris 遍历 中序遍历 前言 我们在中序遍历的时候 一定先遍历左子树 然后遍历当前节点 最后遍历右子树 在常规方法中 我们用递归回溯或者是栈来保证遍历完左子树可以再回到当前节点 但这需要我们付出额外的空间代价 我们需要用一种巧妙地方法
  • 第九届蓝桥杯c/c++A组省赛题解

    分数 题目 1 1 43 1 2 43 1 4 43 1 8 43 1 16 43 每项是前一项的一半 xff0c 如果一共有20项 求这个和是多少 xff0c 结果用分数表示出来 类似 xff1a 3 2 当然 xff0c 这只是加了前2
  • Ltp介绍及实践(20200925)

    Ltp中源代码和模型包括 xff1a 中文分词 词性标注 未登录词识别 依存句法 语义角色标注几个模块 目录 1 标注集合 分词标注集 词性标注集 命名实体识别标注集 依存句法关系 语义角色类型 2 快速使用 载入模型 分句 用户自定义词典
  • 第十一届蓝桥杯省赛C/C++B组题解

    试题 A 跑步训练 本题总分 xff1a 5 分 题目 问题描述 小明要做一个跑步训练 初始时 xff0c 小明充满体力 xff0c 体力值计为 10000 如果小明跑步 xff0c 每分钟损耗 600 的体力 如果小明休息 xff0c 每
  • codeforces Round680 C. Division 题解

    codeforces Round680 C Division 题解 题目 Oleg s favorite subjects are History and Math and his favorite branch of mathematic
  • Codeforces Round #677 (Div. 3) 题解

    Codeforces Round 677 Div 3 题解 A Boring Apartments 题目 题解 简单签到题 xff0c 直接数 xff0c 小于这个数的 43 10 43 10 43 1 0 代码 span class to
  • Leetcode 327. 区间和的个数 (前缀和 + 离散化 + 树状数组)

    Leetcode 327 区间和的个数 前缀和 43 离散化 43 树状数组 题目 题意 有多少个连续的子数组 xff0c 其和在 l o w e r
  • 01 Trie 专题

    01 Trie 专题 异或最大值 The xor largest pair 题意 xff1a 异或最大值的模板 一个数和一个序列中一个数的异或最大值是多少 xff1f 要支持询问 思路 考虑把序列插入 xff0c 构建一个 Trie tex
  • DFS序专题

    牛客专题之DFS序 简介 dfs序 每个节点在dfs深度优先遍历中的进出栈的时间序列 xff0c 也就是tarjan算法中的dfn数组 画个图理解一下 xff1a 这棵树的dfs序 xff1a 1 3 2 4 2 5 6 7 6 5 1 那
  • 牛客编程巅峰赛S2第4场题解

    牛客编程巅峰赛S2第4场 牛牛摆玩偶 题目描述 牛牛有 n 2 n 1 0
  • Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接 xff1a 点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的 1673 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一个正整数 k xff0c 返回长
  • 牛客巅峰赛S2第6场题解

    牛客编程巅峰赛S2第6场 A String 题目 题目描述 给出一个仅包含小写字母的字符串s xff0c 你最多可以操作k次 xff0c 使得任意一个小写字母变为与其相邻的小写字母 xff08 ASCII码差值的绝对值为1 xff09 xf
  • 2021牛客寒假算法基础集训营1 题解

    2021牛客寒假算法基础集训营1 题解 比赛地址 xff1a https ac nowcoder com acm contest 9981 官方题解 xff1a https ac nowcoder com discuss 593200 A