首页 > 其他分享 >「模拟赛」暑期集训CSP提高模拟6(7.23)

「模拟赛」暑期集训CSP提高模拟6(7.23)

时间:2024-07-25 20:51:03浏览次数:6  
标签:大样 int Delov 7.23 CSP pos freopen 波特 模拟

\(140 pts,Rank 23\)

题目列表

A.花间叔祖
B.合并 r
C.回收波特
D.斗篷


花间叔祖

\(98pts\)

题意:

给定一个数组,选择一个大于等于 2 的模数,然后把数组中的数变成 \(mod\) 该模数后的数。

只能操作一次,问操作后最少有几种不同的数。

赛事分析:

开始 5 分钟想到了算 \(a_i\) 中所有数的最小质因数,若不是 1,那么答案为 1,否则为 2,觉得很对,测大样例,WA,??自己觉得思路很对,由于大样例锅了很多次了,所以怀疑是不是大样例的问题,就先跳了,等着看改不改大样例。半个小时之后,回来,还没改,这应该不是大样例的问题了,于是拿大样例调试,果然发现了可以使答案为 1,想法假了!于是自己手模小样例发现问题所在,列出式子,直接出来了。结果少考虑一个点,导致没拿满.

正解:

容易得到答案不是 1 就是 2,若存在一个模数使得 \(a_i(i\in[1,n])\) mod 该数都为 \(d\),那么有 \(k_i*x+d=a_i\)(\(x\) 为模数),那么 \(a_i-a_j \ (a_i>a_j)\) 化简可以得到 \(a_i-a_j=(k_i-k_j)*x\),那么我们只要拿 \(a\) 数组中的数两两作差得到 \(b\) 数组判有无公因数即可。

赛时我拿 \(a\) 数组排序后相邻的两个数相减没考虑可能为 0 的情况所以挂了 2pts。

code:

#include<bits/stdc++.h>
#define mp make_pair
#define ll long long
using namespace std;

const int N = 2e5 + 10;

int n, a[N], Ygcd, cnt, Xgcd;
int b[N];

signed main(){
	// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout);

	scanf("%d%d%d", &n, &a[1], &a[2]);
	
	Ygcd = __gcd(a[1], a[2]);
	for(int i=3; i<=n; i++){
		scanf("%d", &a[i]);
		Ygcd = __gcd(Ygcd, a[i]);
	}

	if(Ygcd != 1){
		puts("1"); return 0;
	}

	sort(a+1, a+1+n);
	for(int i=2; i<=n; i++){
		b[++cnt] = a[i] - a[1];
	}

	Xgcd = __gcd(b[1], b[2]);
	for(int i=2; i<=cnt; i++){
		Xgcd = __gcd(Xgcd, b[i]);
	}

	if(Xgcd != 1) puts("1");
	else puts("2");

	return 0;
}

合并 r

题意:

有 \(n\) 个神奇的 \(r\),每个 \(r\) 有一个美味值,美味值都能表示为 \(\frac{1}{2^i}\),其中 \(i∈N\)(自然数集)。

Delov 一口吃掉了美味值之和为 \(k\) 的 \(n\) 个 \(r\), 现在他想知道每个 \(r\) 的美味值,但是可能的结果太多了,于是他只想知道有多少种可能性,你只需要告诉他方案数  \(mod 998244353\) 的结果。

两种方案不同,则存在 \(i\), 使得美味值为 \(\frac1{2^i}\) 的 \(r\) 的个数在两种方案中不同。

正解:

原题 \(ARC107D\)

\(f_{i, j}\) 表示 \(i\) 个数和为 \(j\) 的方案数

我们这样考虑,\(\frac{1}{2^i} = 1 / 2 / 2 ....\)

就是说,当前如果凑成了 \(j\),那么所有数除以二,就能凑成 \(j / 2\)

那么我们只需两种操作,加一与除二,加一代表多选了一个数(初始为 \(1\) ),除二代表将原方案选的数中二的幂次都加一

即 \(f_{i, j} = f_{i - 1, j - 1} + f_{i, j * 2}\)

初始化 \(f_{0,0} = 0\)

code:

#include<bits/stdc++.h>
using namespace std;

const int N = 5e3 + 10;
const int p = 998244353;

int n, k;
int f[N][N];

int main(){
	// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	cin>>n>>k;

	f[0][0] = 1;
	for(int i=1; i<=n; i++){
		for(int j=i; j>=1; j--){
			f[i][j] = f[i-1][j-1];
			if(j * 2 <= i) f[i][j] += f[i][j*2];
			f[i][j] %= p;
		}
	}
	cout<<f[n][k];

	return 0;
}

回收波特:

题意:

Delov 不和 npy、 们玩了,这回他和他的波特们一起玩。

他和他的 \(n\) 个波特们在一条道路上的不同地点,不妨认为这是一条数轴,而 Delov 位于原点。不幸的是波特们都快没电了,现在 Delov 要开始回收波特了。

Delov 只有一个控制所有波特的遥控器,所以每次他会给出一个参数 \(di\) ,波特就会向着目前 Delov 相对它所在的方向移动 \(di\) 的单位长度,恰好到达原点的波特会被回收不再移动。

在发送了 \(m\) 条指令后波特们没电了,现在 Delov 想知道每个波特是否被回收,如果被回收,他想知道该波特是在第几个指令后被回收,便于充电;如果没被回收,他想知道该波特最终处于的位置,便于手动回收。

你能帮帮他吗?

赛时分析:

一开始一眼就觉得会了,二分思路,时间复杂度正确,然后大喊一句“正解”开打,打了一半二分发现假了。。。于是就先按暴力 \(30pts\) 打,在打假的二分上套了一层二分,最优情况 \(O(m \log^2n)\),最坏 \(O(mn\log\ n)\),打完怕以为时间内复杂度不稳定连该拿的暴力分都拿不到,于是加了个 if(n*m<=200000000)然后跟暴力代码,否则跟玄学复杂度代码,最终 \(32 pts\),赛后交上只有玄学复杂度代码 \(42pts\),。。。

正解:

(复制的下发题解思路较简单)

官方题解写的很棒,但是是英语,英语好的/使用翻译的同学可以移步

粘个官方的图

image

注意到值域有限,考虑对值域内所有数处理出答案

观察一次操作过后,一部分超过原点,一部分到达原点,一部分没过原点,

到达的不用管而超过的部分,后续操作和关于原点对称的位置的操作一模一样,于是可以合并

每次将正半轴负半轴较短的一截与另一边合并起来

这样每个点只会操作 \(o(1)\) 次,复杂度就可以保证了。

code:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int n, m, vis[N], ans[N];
int x[N], d[N];
std::vector<int>v[N], G;

void dfs(int x, int flag){
	for(auto y : v[x]){
		vis[y] = vis[x], ans[y] = -1.0 * flag * ans[x];
		dfs(y, flag);
	}
}

int main(){
	// freopen("in.in", "r", stdin); freopen("out.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>>x[i];
	for(int i=1; i<=m; i++) cin>>d[i];


	int l = 1, r = N - 10, pos = 0, f = 1;//f=1:0 in the left
	for(int i=1; i<=m; i++){
		int D = d[i];
		pos += f * D; // now 0's position
		
		if(pos > r) f = -1;
		else if(pos < l) f = 1;
		else{
			vis[pos] = true, ans[pos] = i;
			G.push_back(pos);

			int lnum = pos - l, rnum = r - pos;
			if(lnum > rnum){
				for(int j=1; j<=r-pos; j++) //connect the side
					v[pos-j].push_back(pos+j);
				r = pos - 1, f = -1;
			}
			else{
				for(int j=1; j<=pos-l; j++)
					v[pos+j].push_back(pos-j);
				l = pos + 1, f = 1;
			}
		}
	}

	for(int i=l; i<=r; i++){
		ans[i] = i - pos;
		dfs(i, 1);
	}

	for(int i : G) dfs(i, -1);
	for(int i=1; i<=n; i++){
		if(vis[x[i]]) printf("Yes");
		else printf("No");
		printf(" %d\n", ans[x[i]]);
	}

	return 0;
}

斗篷

标签:大样,int,Delov,7.23,CSP,pos,freopen,波特,模拟
From: https://www.cnblogs.com/YuenYouth/p/18324121

相关文章

  • 盖世计划-0724-B班模拟 C. 游戏 (game)
    首先,Alice先去\(n\)个商店中购买物品。其中第\(i\)个商店售卖编号为\(i\)的物品,且每个物品的售价为\(a_i\)。Alice的总花费不能超过\(k\)。接着,Bob再去另外\(m\)个商店中购买物品。其中第\(i\)个商店售卖编号为\(n+i\)的物品,且每个物品的售价为\(1\)。Bob的......
  • 【模拟电子技术基础】差分放大电路——学生实验报告
        自己(大学生)在校做的实验报告,可借鉴使用,下载资源后可自行增删内容,或按照个人喜好优化排版。内容包括差分放大电路相关的实验目的、实验原理、实验过程及数据记录与处理分析、实验结论等。一、实验目的1.加深对差分放大电路性能及特点的理解2.学习差分放大电路主......
  • NOIP2024/7/25模拟赛
    T4题意:答案对\(2^{16}\)取模。分析:根节点\(1\)选到\(1\)的概率为\(\frac{1}{n}\),然后随便把剩下的\(n-1\)分配给它的所有子树,记\(1\)的其中一个儿子为\(y\),那么\(y\)选到它所被分配到的数中最小值的概率为\(\frac{1}{siz_{y}}\),然后\(y\)再继续分配给它的子......
  • 模拟建造游戏:城市:天际线2(都市天际线2)中文免安装,解压即撸
    《城市:天际线2》(Cities:SkylinesII)是一款模拟经营游戏,由ColossalOrder开发,ParadoxInteractive发行。下载地址:https://pan.quark.cn/s/84e69332ec3e更多游戏:https://kdocs.cn/l/cuHMLqjlrCK7深度模拟体验:《城市:天际线2》提供深度模拟体验和生动运转的经济系统,考验玩......
  • SPONGE常用教程:蛋白+配体模拟2
    前序课程目录应用场景简述;-[Done]DSDP:蛋白-配体对接;-[Done]XPONGE:蛋白-配体建模,加溶剂;-[Done]SPONGE:能量极小化-NVT-NPT-正式模拟;XPONGE:数据简单后处理。4.SPONGE:能量极小化-NVT-NPT-正式模拟文件下载进入建模文件目录,如下图:SPONGE输入文件采用独特的参......
  • 暑假集训csp提高模拟7
    赛时rank42,T180,T213,T30,T420在T4挂死了,赛时胡了一个挺没有前途的\(O(n\log_2^3n)\)的做法,结果赛后发现假了,没有时间打T2,T3的暴力了。糖T1Permutations&PrimesPermutations&Primes赛时有一个特判\(n=3\)错了,挂了20pts结论非常显然,1放中间,2、3各放一边,剩下的随便......
  • 20240724模拟赛订正题笔记
    (T1)lnsyoj2208逆流而上/P10737[SEERC2020]ReverseGame考虑到失败时字符串应为前面都是0,后面都是1(例如"0000001111111")所以可以将原串的逆序对数求出,记为m,对于每个可翻转的串进行分类讨论:1."10"->"01"可以将原串的逆序对减1。2."100"->"001""110"->"011......
  • 暑假集训CSP提高模拟7
    暑假集训CSP提高模拟7组题人:@KafuuChinocpp|@Chen_jr\(T1\)P122.Permutations&Primes\(20pts\)原题:CF1844BPermutations&Primes假的构造策略,拿到了\(20pts\)。若\(n\)为奇数,则将\(1\)放在\(\left\lceil\frac{n}{2}\right\rceil\)的位置上,前一半......
  • 「模拟赛」暑期集训CSP提高模拟5(7.22)
    \(140pts,Rank24\)题目列表:简单的序列简单的字符串简单的困难的图论简单的序列\(100pts\)题意:gtm1514不喜欢序列。但是一天他拿到了一个序列。这个序列非常杂乱,于是gtm1514想要整理一下这个序列。但是由于他非常的菜,他只会进行一个操作:选择一个\(ai\),把它变......
  • CSP 2023 Round 2 游记
    Day?最近\(WHK\)下滑严重,月考排名掉到了\(50\)多了,想着等着这次\(CSP\)完就先退役,也就没想着拿奖去复习。Day0考前周五没怎么搞\(OI\),学校作业多到爆炸,晚自习老师一直讲课,都要睡着了,完事和WSL一起散散步就出校门了,结果WSL却跑回去跑800,说是为了运动会(,卷神。Day1-......