首页 > 其他分享 >[考试记录] 2024.11.16 noip模拟赛14

[考试记录] 2024.11.16 noip模拟赛14

时间:2024-11-16 17:57:57浏览次数:1  
标签:11 2024.11 14 noip int res sum len vec

T1 字符串构造机

考虑将一个 LCP 条件拆分成两个,一个是相等的部分,使用并查集维护,另一个是不等的部分,两个串末尾的字符一定不相等,随便那啥维护。对于非法情况就是在同一个相等联通块内有不相等的条件。然后考虑从前往后贪心即可。

#include<bits/stdc++.h>
using namespace std;
#define p pair<int, int>
constexpr int N = 1e3 + 5;
int n, m, s[N], f[N], g[N][2], tot;
inline int find(int k){ return f[k] ? f[k] = find(f[k]) : k; }
vector<int> G[N]; bitset<N> st;
int main(){
	freopen("str.in", "r", stdin); freopen("str.out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin>>n>>m;
	for(int i=1, x, y, z; i<=m; ++i){
		cin>>x>>y>>z; if(x > y) swap(x, y);
		int l1 = x, l2 = y, r1 = x+z-1, r2 = y+z-1;
		if(x == y) continue;
		if(r2+1 <= n) g[++tot][0] = r1+1, g[tot][1] = r2+1;
		for(int u=l2, v=l1; u<=r2; ++u, ++v){
			int fa = find(u), fb = find(v);
			if(fa == fb) continue;
			f[fa] = fb;
		}
	} memset(s, 0xff, sizeof(int) * (n+1));
	for(int i=1; i<=tot; ++i){
		int u = find(g[i][0]), v = find(g[i][1]);
		if(u == v) return cout<<"-1", 0;
		G[u].push_back(v), G[v].push_back(u);
	}
	for(int i=1; i<=n; ++i){
		int fa = find(i);
		if(s[fa] == -1){
			st.reset();
			for(int v : G[fa]) if(s[find(v)] != -1)
				st[s[find(v)]] = 1;
			int cnt = 0;
			while(st[cnt]) ++cnt;
			s[fa] = cnt;
		} s[i] = s[fa];
	}
	for(int i=1; i<=n; ++i) cout<<s[i]<<' ';
	return 0;
}

T2 忍者小队

最大值是简单的。找到所有 \(k\) 的倍数并取个 gcd,如果这个 gcd 不为 \(k\),那么不存在合法的最大最小。否则最大值就为倍数的数量。

考虑最小值答案值域,一定为 \(1\sim 7\)。因为最多质数组成数最大仅为 \(2*3*5*7*11*13*17\)。那么令 \(f_{i,k}\) 表示有 \(i\) 个数 gcd 为 \(k\) 的方案数。考虑容斥,有:

\[f_{i,j}=\binom{cnt}{i}-\sum_{j=2k,j|k}^{V}f_{i,j} \]

其中 \(cnt\) 为倍数数量。用方案数来 check 即可。

#include<bits/stdc++.h>
using namespace std;
constexpr int N = 3e5 + 5, M = 1e9 + 7;
int n, m, a[N], val[N], mx, f[8][N], ans[N][2], C[N][8], tot[N];
inline int add(initializer_list<int> Add){
	int res = 0;
	for(int v : Add) res = res + v >= M ? res + v - M : res + v;
	return res;
}
int main(){
	freopen("sor.in", "r", stdin); freopen("sor.out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin>>n>>m; for(int i=1; i<=n; ++i) cin>>a[i], ++val[a[i]], mx = max(mx, a[i]);
	for(int i=0; i<=n; ++i) C[i][0] = 1;
	for(int i=1; i<=n; ++i) for(int j=1; j<=7; ++j) C[i][j] = add({C[i-1][j], C[i-1][j-1]});
	for(int i=1; i<=mx; ++i) ans[i][0] = 114514;
	for(int k=1; k<=mx; ++k){
		int tmp = 0, sum = 0;
		for(int i=1; i*k<=mx; ++i) if(val[i*k])
			tmp = __gcd(tmp, i), sum += val[i*k];
		tot[k] = sum;
		if(tmp ^ 1) { ans[k][1] = ans[k][0] = -1; continue; }
		ans[k][1] = sum; if(val[k]) ans[k][0] = 1;
	}
	for(int k=mx; k>=1; --k){
		for(int i=1; i<=7; ++i){
			f[i][k] = C[tot[k]][i];
			for(int j=k*2; j<=mx; j+=k) f[i][k] = add({f[i][k], M-f[i][j]});
			if(f[i][k] && ans[k][0] == 114514) ans[k][0] = i;
		}
	}
	for(int i=1; i<=m; ++i) cout<<ans[i][0]<<' '<<ans[i][1]<<'\n';
	return 0;
}

T3 狗卡

来不及写了……

标签:11,2024.11,14,noip,int,res,sum,len,vec
From: https://www.cnblogs.com/xiaolemc/p/18549616

相关文章

  • CSP&NOIP 2024游记
    前言还没想好写什么,先留着。八月原计划是高中不搞OI了,专心搞文化课。初三一年,完全对自己失去信心了,颓了一年,什么都没有学会,实力不进反退,真的就只配当J组选手吧。但是迫于家长的压力,还是报了。也没有复习,此时以前的同学已经开始集训了。之后就是军训,高中正式开始了。九月开学......
  • 241116 noip 模拟赛
    省流:\(100+100+100+5\)。T1题意:给一个括号序列\(s\),求出长度最小的\(s\)的子序列\(t\),满足\(t\)是合法括号序列且删掉\(t\)后\(s\)是一个特殊的序列。定义特殊的序列为长度\(2n\),前\(n\)个都是(,后\(n\)个都是)。\(n\leq3\times10^6\)。可以枚举特......
  • NOIP集训 P4137 Rmq Problem / mex 题解
    前置指使:可持久化线段树题解:P4137RmqProblem/mex有一个长度为\(n\)的数组\(\{a_1,a_2,...,a_n\}\)。\(m\)次询问,每次询问一个区间内最小没有出现过的自然数。Input第一行,两个正整数\(n,m\)。第二行,\(n\)个非负整数\(a_1,a_2,...,a_n\)。接下来\(m\)行,每......
  • 洛谷 P6874 [COCI2013-2014#6] KOCKICE
    动笔算算样例可得一个性质,只要确定中间位置的数是多少,其他位置就可以直接求出。如果我们暴枚中间的数,必然超时。于是我们需要用二分。如果中间位置上的数是答案,那么无论什么数,操作次数一定多于他。所以我们只要判断关系就能判断往哪边找。代码:#include<bits/stdc++.h>using......
  • CSP/信奥赛C++语法基础刷题训练(9):洛谷P1035:[NOIP2002 普及组] 级数求和
    CSP/信奥赛C++语法基础刷题训练(9):洛谷P1035:[NOIP2002普及组]级数求和题目描述已知:Sn=1......
  • CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011 普及组] 数字反转
    CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011普及组]数字反转题目描述给定一个整数NNN,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,......
  • 哋它亢编程语言3.14.0a1版本:性能与易用性的双重飞跃
    在这个快速变化的技术时代,编程语言也在不断地进化。“哋它亢编程语言”3.14.0a1版本带来了一系列令人兴奋的新特性和改进,这些改进不仅提升了性能,也增强了易用性。(参考:https://datacon-14302.xyz/3.14/)让我们深入探讨这个新版本的一些亮点。性能优化:延迟评估注解根据PEP649,3.......
  • [DMY]2024 NOIP 模拟赛 Day 9
    比赛7:30开始,我8:10到的机房。赛时T1看了一眼后以为是双指针,然后开始写,写到一半发现假飞了。想了一会发现除了随机化以外没有任何思路,所以写个\(n^2\)暴力就扔了。去看T2,像是个DP题。先把组合数复杂度的暴力写了,发现不太好写。我用了\(n\)遍dikstra,但其实用Floyd......
  • 炼石计划 NOIP 模拟赛 #20
    A.\(kx+(\sum_{i=1}^{k}a_i-1)\timesy=k(x-y)+y\times\sum_{i=1}^{k}a_i\)\((a_1-1)*1+(a_2-1)*(a_1-1)*1+(a_3-1)*(a_2-1)*(a_1-1)*1\)$\prod_{i=1}^{k}a_i>N$两数和相等时乘积最大,因此\(a\)数组中任意两个数的差的绝对值......
  • Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.5-2024111401(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,releasedNov14,2024请访问原文链接:https://sysin.org/blog/metasploit-pro-4/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框......