首页 > 其他分享 >7月30日CSP-S模拟赛赛后总结

7月30日CSP-S模拟赛赛后总结

时间:2024-07-30 18:51:44浏览次数:7  
标签:le int 30 cin long 赛后 CSP

7月30日模拟赛赛后总结

\[7月30日 \ \ 模拟赛 \ \ 赛后总结 \\ 2024年7月30日 \\ by \ \ \ hcy \]

洛谷同步:点我

一、做题情况

  • 第一题比赛 \(100pts\) ,赛后\(AC\)

  • 第二题比赛 \(20pts\) ,赛后\(AC\)

  • 第三题比赛 \(0pts\) ,赛后\(AC\)

  • 第四题比赛 \(30pts\) ,赛后\(30pts\)

  • 比赛得分 \(150/400 \ pts\) ,赛后补题 \(330 / 400 \ pts\)

    二、比赛概况

    T1一道水题,花了15 min切掉了,预期分数:\(100pts\),实际分数:\(100pts\)

    T2看了眼题目,不敢直接用 map,怕被卡常,先离散化一下,再进行双指针,不知道为啥 \(WA\ 20pts\) ,很奇怪。 预期分数:\(100pts\) 实际分数:\(20pts\) ,用时30 min

    T3看起来像ZJOI2022的题(实则不是),看了眼题目,觉得有点难,先做T4,T4看着有些像线段树,但是不知道怎么写,只好写个暴力。 预期分数:\(30pts\) 实际分数:\(30pts\) ,用时30 min

    回来看T3,花了10 min才把题目读懂,正解不知道怎么写,只好自己整些歪魔邪道 预期分数:? 感觉 \(50pts\) 实际:\(0pts\) (不幸用C++98[XYD没写C++指的是C++98,以为是C++20],greater不能用,惨遭 \(CE\) 爆 \(0\))

三、题解报告

T1:

题面:

报数游戏Ⅱ

时间限制: 1s

空间限制: 512MiB

【题目描述】

外星幼儿园的小朋友按照老师的要求玩报数游戏Ⅱ,每个人手里有一张小纸条,上面写着一个数字,每个人都按照顺序报数,报数的方式是这样的 :

每个人听自己的前面一个人报数字的大小,加上自己纸条上的数字求和,并报出自己的数字。

对于第一个人来说,他听到的数字是由老师报出来的。

如果你是老师,请在确保每位同学报的数字是正数的情况下,报出一个最小的正数作为起始值。

【输入格式】

第一行有一个整数 \(n\),输入有多少个同学排队 第二行输入一个数组 \(nums\),数组长度为 \(n\),数字用空格分隔,代表同学按照报数字的顺序排好队以后,每个同学手里小纸条上的数字。

【输出格式】

输出一行,共一个数字,输出符合条件的起始值。

【样例输入1】

5

-3 2 -3 4 2

【样例输出1】

5

【样例解释1】

在你选择5作为起始值时,五名同学的报数均为正数,为 \([2,4,1,5,7]\)。

【数据范围】

对于 \(20\%\) 的数据来说: \(1 \le n \le 100,-100 \le nums_i \le 100\)

对于 \(100\%\) 的数据来说: \(1 \le n \le 10^5, -10^9 <= nums_i <= 10^9\)

做法:

一道 前缀和 板子题,只要加点数学,都可以做吹来。

个人体感难度:\(\color{#FE4C61}\text{入门}\)

附:AC代码

#include <bits/stdc++.h>
#define int long long
using namespace std ;
int n , a [100010] , b [100010] , mi ;
signed main () {
    ios::sync_with_stdio (false) ;
    cin.tie (NULL) ; cout.tie (NULL) ;
    cin >> n ;
    for (int i = 1 ; i <= n ; i ++)  cin >> a [i] ;
    for (int i = 1 ; i <= n ; i ++)  b [i] = b [i - 1] + a [i] ;
    mi = LONG_LONG_MAX ;
    for (int i = 1 ; i <= n ; i ++)  mi = min (mi , b [i]) ;
    if (mi >= 0)  cout << 1 ;
    else  cout << 1 + (- mi) ;
    return 0 ;
}

T2:

题面:

百万富翁的第二次实验

时间限制: 1s

空间限制: 512MiB

【题目描述】

马克吐温有一本非常著名的小说《百万英镑》,这本小说中主角最后归还了百万英镑给两位富翁。但结果就是两位富翁依然有无穷的问题需要进行社会实验,于是,他们打算进行第二次社会实验。那就是不同财富值的人在一场舞会上会发生什么事情。为了满足自己的好奇,百万富翁们邀请了全伦敦所有人来自己的舞会。舞会开始后他们就后悔了,因为来的人太多了,而且很多人的财富都相同,统计起来太费事了。所以百万富翁们找到你,希望你根据来舞会的时间,找出在一段时间内,来舞会的所有人财富值都互不相同的人数。

【输入格式】

第一行输入一个 \(n\) 表示有 \(n\) 个人参与舞会。

按照时间顺序输入 \(n\) 个人的财富值。

【输出格式】

输出在一段时间内参加舞会的所有人财富值都互不相同的人数的最大值。

【样例】

Input 1

7

2 3 4 5 5 6 7

Output 1

4

【数据范围】

对于 \(100\%\) 的数据:

每个人的财富值不超过 \(100000000000\)。

\(0 \le n \le 1000000\)。

做法:

得用 unordered_map ,map 会被卡掉 \(70pts\),用个双指针,轻松做出

附:AC代码

#include <bits/stdc++.h>
#define int long long
#pragma G++ optimize (2)
#pragma G++ optimize (3)
using namespace std ;
int n , l , r , ans , a [1000010] ;
unordered_map <int , int> f ;
signed main () {
    ios::sync_with_stdio (false) ;
    cin.tie (NULL) ; cout.tie (NULL) ;
    cin >> n ;
    for (int i = 1 ; i <= n ; i ++)  cin >> a [i] ;
    l = 1 ; r = 1 ;
    while (r <= n) {
        if (f [a [r]]) {
            ans = max (ans , r - l) ;
            while (l < r && f [a [r]]) {
                f [a [l]] = 0 ;
                l ++ ;
            }
        }
        f [a [r]] = 1 ;
        r ++ ;
    }
    cout << max (ans , r - l) ;
    return 0 ;
}

T3:

题面:

做法:

用贪心推出,进行预处理,然后就是道 二分 板子题,不用多说。

附:AC代码

#include <bits/stdc++.h>
#define int long long
#pragma G++ optimize (2)
#pragma G++ optimize (3)
using namespace std ;
int n , T , x , y , a [500010] , l , r , mid , bao , b [500010] , c [500010] ;
signed main () {
    ios::sync_with_stdio (false) ;
    cin.tie (NULL) ; cout.tie (NULL) ;
    cin >> n >> T ;
    for (int i = 1 ; i <= n ; i ++)  cin >> a [i] ;
    sort (a + 1 , a + 1 + n , greater ()) ;
    for (int i = 1 ; i <= n ; i ++) {
        b [i] = b [i - 1] + a [i] ;
        c [i] = c [i - 1] + a [i] * (n - i + 1) ;
    }
    while (T --) {
        cin >> x >> y ;
        l = 1 ; r = min (x , n) ; 
        while (l <= r) {
            mid = l + r >> 1 ;
            if (c [mid] + (x - n) * b [mid] >= y)  bao = mid , r = mid - 1 ;
            else  l = mid + 1 ;
        }
        if (c [bao] + (x - n) * b [bao] >= y)  cout << bao << "\n" ;
        else  cout << "-1\n" ;
    }
    return 0 ;
}

T4:

题面:

统计区间

时间限制: 3s

空间限制: 512MiB

【题目描述】

有一个长度为 \(n\) 的数列 \(a\),\(a\) 的值在 \([1,n]\) 中,现在要统计区间中出现的数都恰好出现 \(2\) 次的区间数。

【输入格式】

第一行一个整数 \(n\)。
第二行 \(n\) 个整数表示 \(a\)。

【输出格式】

一行一个整数 \(cnt\),表示满足条件的区间数。

【样例】

Input 1

7
5 3 5 5 4 4 3

Output 1

4

【样例解释】

样例中合法的区间有:\([3,4],[5,6],[3,6],[2,7]\)。

【数据范围】

对于 \(30\%\) 的数据:\(n\le10^3\).
对于 \(100\%\) 的数据:\(n\le10^6\).

做法:

附:AC代码

#include<bits/stdc++.h>
#define L(i, j, k) for (int i = (j); i <= (k); i++)
#define R(i, j, k) for (int i = (j); i >= (k); i--) 
#define sz(a) ((int) (a).size())
#define ll long long 
#define vi vector < int > 
#define ull unsigned long long 
using namespace std;
const int N = 1 << 20;
int n, a[N];
int lst[N], llst[N];
ull w[N], pre[N], ret;
ll ns;
unordered_map < ull, int > mp;
mt19937_64 orz(time(0) ^ clock());
int main () {
	ios :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n ;
	L(i, 1, n) cin >> a[i];
	L(i, 1, n) w[i] = orz();
	int p = 0;
	mp[0] += 1;
	L(i, 1, n) {
		while (p < llst[a[i]]) mp[pre[p]] -= 1, ++p;
		llst[a[i]] = lst[a[i]], lst[a[i]] = i;
		pre[i] = pre[i - 1] ^ w[a[i]], ns += mp[pre[i]], mp[pre[i]] += 1;	
	}
	cout << ns << '\n';
	return 0;
} 

四、赛后总结

这把死得真惨,T2未知 \(WA\) ,T3用C++98惨遭 \(CE\) 。下次不知道会不会这样。

标签:le,int,30,cin,long,赛后,CSP
From: https://www.cnblogs.com/uhw177po/p/18333158

相关文章

  • 7.30模考总结
    省流:上300了(模考难度不大,橙黄绿蓝)\(7.30\)晴\(T1\)报数游戏Ⅱ题意简述求在一段序列前加入一个最小的正整数,使这个序列的每一个前缀和都为正数。思路:前缀和扫一遍,找最小前缀和,特判为正数的情况。\(code\)#pragmaG++optimize(3,"Ofast","inline")#pragmaG++optim......
  • CSP 初赛复习 :计算机系统原理
            计算机系统是一个复杂的电子机器,‌它能够按照程序运行,‌自动、‌高速处理海量数据。‌这个系统主要由硬件系统和软件系统组成。‌硬件系统包括各种物理组件,‌如处理器、‌内存、‌存储设备等,‌而软件系统则包括操作系统、‌应用程序和其他必要的软件。‌硬件......
  • 7.30 看到别人的历程有感
    看到“会说话的汤姆猫”的制作者创业故事,我深受启发。他们目标明确,清楚自己在技术方面与主流游戏厂商有不小的差距,因此选择了避开竞争激烈的红海市场,另辟蹊径,瞄准了尚未被充分开发的蓝海市场。面对广阔的蓝海市场,他们采取了最快速的研发策略,力求尽快占领市场先机。同时,他们在试......
  • 盖世计划--0730--B班训练
    A哈哈,写过的题,看过的性质还能忘,这辈子有了。一个性质,如果要将\(A\)序列通过相邻位置\(+1\)或\(-1\)操作(总和不变,相当于传递)变为序列\(B\),设\(sa_i=\sum\limits_{j=1}^ia_j\),\(sb_i=\sum\limits_{j=1}^ia_j\)。那么最少操作次数为:\[\sum_{i=1}^n|sa_i-sb_i|\]理解一下......
  • 7.30第三周周二学习总结
    1vj团队5补题(上午)https://vjudge.net/contest/643995题解2cfr950(下午)https://vjudge.net/contest/643996#google_vignette最大公约数非递减序列重点1.思维:删去一个ai时,需要删除ai与前后的公因数,并加上ai-1与ai+1的最大公因数。3cf团队赛6补题(下午)思维转化题意:n个......
  • 2024.7.30 test
    A有一个数\(n\)和\(m\)种操作,第\(i\)次操作使得\(n\getsn/A_i\),问最多遍历多少个数。\(n\le10^5,m\le10\)。不难发现暴力即可通过。B给定集合\(S\),对于每个\(i\in[1,m]\)你需要求出选择数最多和最少的值使得\(\gcd=i\)。\(n,S_i\le3e5\)。首先对于每个\(i......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 7月30日考试总结
    7月30日考试总结T1报数游戏II要点:将试子列出来后,不难发现求前缀和找最小负数即可。问题:无。反思:一眼前缀和没啥好说的。T2百万富翁的第二次实验要点:做一下前缀和或离散化,然后双指针即可。问题:考试时写了个dp,以为时间复杂度是能给很多分的,结果就给了特判分主要是数据全......
  • 2024/07/30 每日一题
    LeetCode2961双模幂运算方法1:快速幂classSolution:defgetGoodIndices(self,variables:List[List[int]],target:int)->List[int]:ans=list()fori,(a,b,c,m)inenumerate(variables):res=self.getVal(a%10,b)......
  • LeetCode-day30-2961. 双模幂运算
    LeetCode-day30-2961.双模幂运算题目描述示例示例1:示例2:思路代码题目描述给你一个下标从0开始的二维数组variables,其中variables[i]=[ai,bi,ci,mi],以及一个整数target。如果满足以下公式,则下标i是好下标:0<=i<variables.length((aibi%10)ci)......