首页 > 其他分享 >济南CSP-J刷题营集训

济南CSP-J刷题营集训

时间:2023-07-24 18:11:28浏览次数:65  
标签:include int long CSP MAXN 100010 define 集训 刷题

Day1比赛

T1

方差

求和可以用前缀和。
求平均值时,特判是否整除而输出结果。
求方差,我们直接用他给的公式以分数形式算出结果,维护两个分子和分母,通分相减后特判输出。
注意要输出最简分数,所以我们用 \(\text gcd\) 约分。

代码:

#include<bits/stdc++.h>
#define gt getchar
#define pt putchar
#define int long long
using namespace std;
int a[100005];
int sum1[100010],sum2[100010];
int fc1,fc2;
int gcd(int a,int b){
	return(b==0?a:gcd(b,a%b));
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}
signed main(){
	int n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		sum1[i]=a[i]+sum1[i-1];
		cout<<sum1[i]<<' ';
		sum2[i]=(a[i]*a[i])+sum2[i-1];
		if(sum1[i]%i==0){
			cout<<sum1[i]/i<<' ';
		}
		else{
			int g=gcd(sum1[i],i);
			cout<<sum1[i]/g<<'/'<<i/g<<' ';
		}
		
		int fm1=i;
		int fz1=sum1[i];
		int g=gcd(fm1,fz1);
		fm1/=g;
		fz1/=g;
		fz1=fz1*fz1;
		fm1=fm1*fm1;
		int fm2=i;
		int fz2=sum2[i];
		int l=lcm(fm2,fm1);
		int x=l/fm2,y=l/fm1;
		fm2*=x;
		fz2*=x;
		fm1*=y;
		fz1*=y;
		int fzans=abs(fz2-fz1);
		if(fzans%fm1==0)cout<<fzans/fm1<<'\n';
		else{
			int k=gcd(fzans,fm1);
			cout<<fzans/k<<'/'<<fm1/k<<'\n';
		}
	}	
	return 0;
}

T2

暴力 35pts

直接枚举每一个二元组,然后算出 \(a_j + b_j \times c_i\),然后排序,输出第 \(k\) 个数即可、

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+10;
int a[MAXN],b[MAXN],c[MAXN];
vector<int>x;
signed main(){
	int n,k;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++)cin>>c[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			x.push_back(a[j]+b[j]*c[i]);
		}
	}
	sort(x.begin(),x.end());
	cin>>k;
	cout<<x[k-1];
	return 0;
}

正解:二分

我们把序列 \(c\) 排序,二分答案查找在序列 \(c\) 中最后一个不大于 \(mid\) 的位置,寻找位置等于 \(k\) 的位置,更新答案,输出。

#include<bits/stdc++.h>
#define int long long
using namespace std; 
int a[100010],b[100010],c[100010];
int n;
int check(int x){
	int sum=0;
	for(int i=1;i<=n;i++)
		if(x-a[i]>=0)sum+=upper_bound(c+1,c+n+1,(x-a[i])/b[i])-c-1;
	return sum;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++)cin>>c[i];
	sort(c+1,c+n+1);
	int l=0,r=1e18+1e9;
	int k;
	cin>>k;
	while(l<r){
		int m=(l+r)>>1;
		if(check(m)>=k)r=m;
		else l=m+1;
	}
	cout<<r;
	return 0;
}

T3

暴力 30pts

枚举每一个 \(a,b,c\),从小到大枚举可保证有序,判断 \(q\) 是否大于 \(1e5\),然后按规定输出。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
struct pair3{
	int f,s,t;
};
vector<pair3>x;
signed main(){
	int n,n3,p;
	cin>>n>>n3>>p;
	const int n0=n*n+1;
	for(int i=1;i<=p;i++){
		for(int j=0;j<=p;j++){
			for(int k=1;k<=p;k++){
				int n1,n2;	
				n1=n0%i; 
				n2=n1+j;
				if(n2%k==n3){
					pair3 y={i,j,k};
					x.push_back(y);
				}
			}
		}
	}
	int q=x.size();
	if(q>100000){
		cout<<q<<'\n';
		for(int i=0;i<100000;i++){
			cout<<x[i].f<<' '<<x[i].s<<' '<<x[i].t<<'\n';
		}
	}
	else{
		cout<<q<<'\n';
		for(int i=0;i<q;i++){
			cout<<x[i].f<<' '<<x[i].s<<' '<<x[i].t<<'\n';
		}
	}
	return 0;
}

T4

不会

最后只得了 \(150\) pts,太蒻了。

Day1讲解

基础算法

  • 模拟
  • 枚举
  • 递推
  • 贪心 -> 哈夫曼树
  • 前缀和/差分
  • 二分
  • 倍增 -> ST表

标签:include,int,long,CSP,MAXN,100010,define,集训,刷题
From: https://www.cnblogs.com/FinderHT/p/17577962.html

相关文章

  • CSP 模拟 4
    今日推歌:SerenadeinG‘EinekleineNachtmusik’K525-WolfgangAmadeusMozart今天比赛直接搬的ARC125,126的CD题,那这样我也能出模拟赛(但是为什么HZOI2022都不写比赛题解,差评今天被HZOI2023,2024薄纱,我直接退役得了T1最长上升子序列考虑一个明显字典序不是......
  • 济南 S NOIP 刷题实战梳理营游记
    前言期末砸力。这次暑假去两个营,一个在烟台,一个在青岛。在烟台的都是学算法,扔到目录里了,这篇文章就是来讲济南营的。一共十二天,每天上午八点到十二点打比赛,然后吃饭,然后讲题。Day-1\(6h\)的大巴,绷不住了,中途在潍坊西休息,热死了。到了济南,住在酒店旁边,楼下全是吃的,很赞。......
  • CSP模拟3 <反思>
    t3:不要随便用mapt4:代码转移要删全首先考虑暴力,类似线段树,首先你要先dfs出每个节点子树的左右节点,然后修改查询时要考虑左儿子右边界是否大于查询左边界,右儿子左边界是否小于查询有边界,进行\(dfs\)\((46pts)\)点击查看代码#include<bits/stdc++.h>#defineintlonglongu......
  • CSP 模拟 3
    今天感觉很热,但是天气转凉的时候我也该退役了吧。今日推歌:透明哀歌-n-buna/Gumiecho-Crusher-P/GumiEnglish歌词Theclockstoppedticking,时钟停止发出嘀嗒声Foreverago.在很久以前HowlonghaveIbeenup?我究竟醒来了多久?Idon'tknow.我不知道Ican't......
  • 23暑期集训 题目印象
    7.16[USACO20DEC]SleepingCowsP确定dp顺序P8863「KDOI-03」构造数组转化模型易于理解CF1363F转化概念区间右移变为右端点左移,便于转移CF1188Cdp不一定要直接求出答案;使得答案为min(i,j),排序取i,j两边的;......
  • CSP 模拟 2
    感觉像是noi模拟赛多了个pT1F咋做都行,但是考场上的正确做法被后来优化RE了,痛失60pts其中一种做法是考虑只有\(a_1\oplusb_i\)有可能成为答案,然后验证即可T2S定义dp状态\(f_{i,j,k,0/1/2}\)为用了\(i\)个红球,\(j\)个绿球,\(k\)个红球,并且最后一位是什么球......
  • P7074 [CSP-J2020] 方格取数 题解
    题目:题目描述设有n*m 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中的整数,求它能取到的整数之和的最大值。输入格式第一行有两个整......
  • 「赛后总结」20230722 CSP 模拟赛
    「赛后总结」20230722CSP模拟赛点击查看目录目录「赛后总结」20230722CSP模拟赛反思题解T1回文思路代码T2快速排序思路代码T3混乱邪恶思路代码T4校门外歪脖树上的鸽子思路吓死我了我还以为K8He不更博了。为啥前天模拟赛不写啊?打过,没参加。为啥昨天模拟赛不......
  • CSP模拟3
    A.回文\(20\)多分的纯暴力搜索,\(A_{i,j}=A_{i-1,j+1}\)可以判完回文直接递推出路径数,共\(42\text{pts}\)。正解\(DP\)。回文可以转化一下思路,两个人分别从\((1,1),(n,m)\)出发,走的路径相同的方案数。设计\(dp[i][j][s][t]\)为第一个人在\((i,j)\)位置,第二个人在......
  • 「刷题记录」[JSOI2007] 文本生成器
    第一道AC自动机+DP题。题目链接:P4052[JSOI2007]文本生成器-洛谷|计算机科学教育新生态(luogu.com.cn)利用容斥原理的思想,答案就是所有串的数量减去不可读的串的数量。设\(dp\left(i,j\right)\)表示串长为\(i\),在AC自动机上走到编号为\(j\)时不经过单词结......