首页 > 其他分享 >牛客小白月赛101

牛客小白月赛101

时间:2024-09-23 14:35:00浏览次数:7  
标签:return int vi long 牛客 小白月赛 using 101 mint

A - tb的区间问题

枚举区间,然后用前缀和求解

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

using vi = vector<int>;
using pii = pair<int,int>;




i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, k;
	cin >> n >> k;
	vi a(n + 1);
	for(int i = 1; i <= n; i ++) 
		cin >> a[i], a[i] += a[i-1];

	int res = 0;
	for(int l = 1, r = n - k; r <= n; l ++, r ++)
		res = max(res, a[r] - a[l - 1]);
	cout << res;


	return 0;
}

B -tb的字符串问题

栈模拟一下

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

using vi = vector<int>;
using pii = pair<int,int>;


i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;

	string s;
	cin >> s;

	string t;
	for(auto c : s){
		if(not t.empty() and ((t.back() == 'f' and c == 'c') or (t.back() == 't' and c == 'b')))
			t.pop_back();
		else t += c;
	}
	cout << t.size();


	return 0;
}

C - tb的路径问题

找规律,发现对于对角线上的每个数字两步之内必有\(2\),但是对于奇数来说,两步之内的\(2\)在\(n\times n\) 的外面,因此只能走到前一个偶数上。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

using vi = vector<int>;
using pii = pair<int,int>;




i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;
	cout << min(2 * n - 2 , 4 + 2 * (n % 2));
	return 0;
}

D - tb的平方问题

发现询问的范围并不大,所以我们可以离线计算。

可以枚举出所有的完全平方数,然后利用枚举+二分找到所有的区间,并用差分实现区间修改。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;
using pii = pair<int,int>;




i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n , q;
	cin >> n >> q;
	
	vi a(n + 1);
	for(int i = 1; i <= n; i ++)
		cin >> a[i], a[i] += a[i - 1];
	
	int sum = a[n];

	vi p2;
	for(int i = 1; i * i <= sum; i ++)
		p2.push_back(i * i);

	vi res(n + 2);
	for(const int &v : p2){
		for(int l = 1, r, x ; l <= n; l ++){
			x = a[l - 1] + v;
			if(x > sum) break;
			r = ranges::lower_bound(a, x) - a.begin();
			if(a[r] - a[l - 1] == v)
				res[l] ++, res[r + 1] --; 
		}
	}
	for(int i = 1; i <= n ; i ++)
		res[i] += res[i - 1];
	for(int x ; q ; q -- ){
		cin >> x;
		cout << res[x] << "\n";
	}
	return 0;
}

E - tb的数数问题

用一个类似埃筛的做法,求出每个数的约数个数,然后再已有的约数,然后比较一下就好了。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;
using pii = pair<int,int>;

const int N = 1e6;
bitset<N + 1> vis;


i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;
	
	for(int i = 1, x; i <= n; i ++)
		cin >> x, vis[x] = true;

	vi a(N + 1);
	for(int i = 1; i <= N; i ++)
		for(int j = i; j <= N; j += i) a[j] ++;

	vi b(N + 1);
	for(int i = 1; i <= N; i ++ ){
		if(vis[i] == false) continue;
		for(int j = i; j <= N; j += i) b[j] ++;
	}

	int res = 0;

	for(int i = 1; i <= N; i++)
		res += a[i] == b[i];
	
	cout << res;

	return 0;
}

F - tb的排列问题

用\(pos[x]\)统计\(a_i\)中非\(-1\)的数出现的位置。用\(pre[x]\)维护出\(a\)前缀中\(-1\)个数。

我们从前往后考虑每一个\(b_i\),对于这个数来说,能够和他交换的范围是\([i,i+w]\)。

如果\(b_i\)存在于\(a\)中,且在这个范围\([1,i+w]\)内就可以交换过来,答案乘\(1\),否则答案乘\(0\)。考虑为什么\([1,i-1]\)也可以,因为我们从前往后枚举,所以前缀是一定匹配的,因为如果出现在前面,一定会在之前的某次交换到后面。

如果\(b_i\)不存在于\(a\)中,则需要消耗\([1,i+w]\)内一个\(-1\),同时考虑到之前可能已经消耗了一些\(-1\)所以我们要计算出还剩下了多少\(-1\),答案乘以剩下\(-1\)的个数即可。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;
using pii = pair<int,int>;

const int N = 1e6;
bitset<N + 1> vis;

const int mod = 998244353;

struct mint {
    int x;

    mint(int x = 0) : x(x) {}

    mint &operator=(int o) { return x = o, *this; }

    mint &operator+=(mint o) { return (x += o.x) >= mod && (x -= mod), *this; }

    mint &operator-=(mint o) { return (x -= o.x) < 0 && (x += mod), *this; }

    mint &operator*=(mint o) { return x = (i64) x * o.x % mod, *this; }

    mint &operator^=(int b) {
        mint w = *this;
        mint ret(1);
        for (; b; b >>= 1, w *= w) if (b & 1) ret *= w;
        return x = ret.x, *this;
    }

    mint &operator/=(mint o) { return *this *= (o ^= (mod - 2)); }

    friend mint operator+(mint a, mint b) { return a += b; }

    friend mint operator-(mint a, mint b) { return a -= b; }

    friend mint operator*(mint a, mint b) { return a *= b; }

    friend mint operator/(mint a, mint b) { return a /= b; }

    friend mint operator^(mint a, int b) { return a ^= b; }

    int val() {
    	x = (x % mod + mod) % mod;
    	return x;
    }
};


void solve() {
	int n, w;
	cin >> n >> w;

	vi a(n + 1);
	for(int i = 1; i <= n; i ++)
		cin >> a[i];

	vi b(n + 1);
	for(int i = 1; i <= n; i ++)
		cin >> b[i];

	vi pos(n + 1, -1);
	for(int i = 1; i <= n; i ++)
		if(a[i] != - 1) pos[a[i]] = i;

	vi pre(n + 1);
	for(int i = 1; i <= n; i ++)
		pre[i] = pre[i - 1] + (a[i] == -1);

	mint res(1);
	for(int i = 1, used = 0; i <= n ;i ++){
		if(pos[b[i]] != -1) {
			res *= pos[b[i]] <= min(i + w, n);
		} else {
			res *= pre[min(i + w, n)] - used;
			used ++;
		}
	}

	cout << res.val() << "\n";
	return;
}

i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int T;
	cin >> T;
	while(T --)
		solve();
	return 0;
}

标签:return,int,vi,long,牛客,小白月赛,using,101,mint
From: https://www.cnblogs.com/PHarr/p/18427017

相关文章

  • 1014.最佳观光组合
    给你一个正整数数组values,其中values[i]表示第i个观光景点的评分,并且两个景点i和j之间的距离为j-i。一对景点(i<j)组成的观光组合的得分为values[i]+values[j]+i-j,也就是景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例......
  • 游戏中的状态控制 适合于全部游戏 scratch 20240922_111017
    完整的游戏游戏封面游戏进行游戏暂停游戏结束预设状态值0欢迎界面1游戏进行2游戏暂停3游戏结束需要定义变量来适时的改变他们变量使用英文stat背景代码在背景的代码里定义了【欢迎画面】的自制积木实现游戏的状态值的初始化等待玩家输入如果玩家输入了1那么......
  • 牛客小白月赛101
    比赛链接https://ac.nowcoder.com/acm/contest/90072A题tb的区间问题思路实际上是求长度为n−kn-kn−k的......
  • 牛客小白月赛101
    总结:无A.tb的区间问题题意:对一个数组进行k次删除操作,对于操作删除只能删除最左元素或者最右元素,求出k次操作后数组和的最大值思路:由于删除最左元素和最右元素那么必然最后得到的数组和是一个连续的区间,那么删除k也就是剩余n-k的空间,通过前缀和预处理得到每一......
  • 2024牛客多校 4 (概率,带权并查集,构造)
    2024牛客多校4(概率,带权并查集,构造)J-Zero题面:给出整数\(n\)和\(k\),一个01?字符串\(s\)。?有概率是0或是1,且概率相等,一段区间\([l,r]\)的贡献这样计算:这一段区间不包含0贡献为长度的\(k\)次方求这个字符串\(s\)的期望贡献是多少?solution:首......
  • 互连产品,10151114-001RLF PCIe MXM 3.0 连接器,10157096-01221LF 针座连接器(参数)
    10151114-001RLF——PCIeMXM3.0连接器,存储和服务器连接器,直角,表面贴装,P=0.5mm,堆叠高度=5.0mm,30μin镀金概述:MXM连接器是一种高密度PCIe®解决方案,支持新一代服务器系统架构。这是一个非专有的行业标准插座产品系列。可用于升级设备中的图形处理器,而无需更改整个系统或依赖专......
  • 牛客周赛60
    A困难数学题一个数异或其本身就是0,直接输出0就好B构造序列正负数要相邻,那最长的序列肯定是数量最多的数放第一个,例3a2b,ababa,ba为一组,最后结果为少的数的两倍+最开始的那个数,特判两数相等情况点击查看代码lla,b;cin>>a>>b;if(a<b){......
  • 洛谷P1016
    题目传送门:传送门p1016题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1D1​、汽车油箱的容量 CC(以升为单位)、每升汽油能行驶的距离 D2D2​、出发点每升汽油价格PP和沿途油站数 NN(NN 可以为零),油站 ii......
  • 【PAT_Python解】1014 福尔摩斯的约会
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!ls=[]#装输入数据,你也可以S1,S2,S3,S4=input(),···D,H,M='','',''dict={'A':'MON','B':'TUE','C':'WED','D�......
  • PMP--一模--解题--101-110
    文章目录11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、[单选]在项目即将进入收尾阶段时,项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生,可能给最终的可交付成果带来重要影响,甚至可能使其不......