首页 > 其他分享 >【比赛】CSP提高组模拟1

【比赛】CSP提高组模拟1

时间:2024-07-14 09:11:20浏览次数:5  
标签:比赛 int cin long second ans CSP 模拟 first

和初三学长们一起打的比赛,被人家爆杀了。

T1 最短路 20Pts

原题 Cow Toll Paths G

正解是按点权排序后跑一遍 Floyd,歪解是多迭代几遍。

赛时没开 long long \(80 \to 20\)。

点击查看代码
#include<bits/stdc++.h>
#define int ll 
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=305;
pii a[N][N];
int n,m,v[N],x,y,q,s,t,w;
main(){
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout); 
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j)a[i][j]={0,0};
			else a[i][j]={0x3f3f3f3f3f3f3f3f,0};
		}
	}
	for(int i=1;i<=n;i++)cin>>v[i];
	for(int i=1;i<=m;i++){
		cin>>x>>y>>w;
		w=min(w,a[x][y].first);
		a[x][y].first=a[y][x].first=w;
		a[x][y].second=a[y][x].second=max(v[x],v[y]);
	}
	int T=3;
	while(T--)
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			if(i==k)continue;
			for(int j=1;j<=n;j++){
				if(j==k||i==j)continue;
				if(a[i][j].first+a[i][j].second>a[i][k].first+a[k][j].first+max(a[i][k].second,a[k][j].second)){
					a[i][j].first=a[i][k].first+a[k][j].first;
					a[i][j].second=max(a[i][k].second,a[k][j].second);
				}
			}
		}
	}
	while(q--){
		cin>>x>>y;
		if(a[x][y].first==0x3f3f3f3f3f3f3f3f)cout<<"-1\n";
		else cout<<a[x][y].first+a[x][y].second<<"\n";
	}
	return 0;
}

T2 方格取数 40Pts

原题 KUP-Plot purchase

首先判掉在 \([k,2k]\)(直接输出) 和 \((2k,+\infty)\)(一定不选)的数,剩下的数就都在 \((1,k-1)\) 之间了;
此时如果我们能找出一个总和大于 \(2k\) 的矩阵,那么一定有解,因为其一定包括了一个总和在 \([k,2k]\) 之间的矩阵。
所以我们先找出一个总和大于 \(2k\) 的极大矩阵,然后每次删去一行,如果这一行的和大于 \(k\) 就在这一行中一个一个删,否则继续在大矩阵中进行。
单调栈找最大矩阵即可。

赛时想到了单调栈,但是没打出来,随机化 40。

点击查看代码
#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
const int N=2005;
int n,k,a[N][N],sum[N][N],l[N][N],r[N][N],s[N][N],mp[N][N];
int get(int x,int y,int xx,int yy){
	return sum[xx][yy]-sum[x-1][yy]-sum[xx][y-1]+sum[x-1][y-1];
}
main(){
	freopen("matrix.in","r",stdin);
	freopen("matrix.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			if(a[i][j]>=k&&a[i][j]<=k*2){
				cout<<i<<" "<<j<<" "<<i<<" "<<j;
				return 0;
			}
			else mp[i][j]=(a[i][j]<k);
			sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j])s[i][j]=s[i-1][j]+1;
			else s[i][j]=0;
		}
	}
	for(int i=1;i<=n;i++){
		stack<int> ss;
		for(int j=1;j<=n+1;j++){
			while(!ss.empty()&&s[i][j]<s[i][ss.top()]){
				r[i][ss.top()]=j-1;
				ss.pop();
			}
			ss.push(j);
		}
		while(!ss.empty())ss.pop();
		for(int j=n;j>=0;j--){
			while(!ss.empty()&&s[i][j]<s[i][ss.top()]){
				l[i][ss.top()]=j+1;
				ss.pop();
			}
			ss.push(j);
		}
		for(int j=1;j<=n;j++){
			int now=get(i-s[i][j]+1,l[i][j],i,r[i][j]);
			if(now>=k){
				if(now<=k*2){
					cout<<i-s[i][j]+1<<" "<<l[i][j]<<" "<<i<<" "<<r[i][j];
					return 0;
				}
				else{
					for(int h=l[i][j]+1;h<=r[i][j];h++){
						int noww=sum[i][h]-sum[i][l[i][j]-1];
						if(noww>=k&&noww<=2*k){
							cout<<i<<" "<<l[i][j]<<" "<<i<<" "<<h;
							return 0;
						}
					}
				}
			}
		}
	}
	cout<<-1;
	return 0;
}

T3 数组 0Pts

原题 Please, another Queries on Array?

对于欧拉函数,有式子 \(\varphi(x)=x \ \cdot \ \prod_{i=1}^n\limits (\frac{p_i-1}{p_i})\),其中 \(p_i\) 为 \(x\) 的所有质因数。

区间积可以用线段树维护,难点在于质因子的维护。

通过一些技术手段,我们发现,在 300 以内只有 62 个质因子,刚好可以用一个 long long 来状压。
同样丢到线段树里即可。

赛时因为 1<<62 爆零了。

1<<62 \(\to\) 1ll<<62 \(0 \to 100\)

点击查看代码
#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=4e5+5;
int n,a[N],l,r,x,q;
string op;
int prim[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
inline int qp(int a,int b,int mod=mod){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}
inline int getp(int x){
	int p=0;
	for(int i=0;i<62;i++){
		if(x%prim[i]==0)p|=(1ll<<i);
	}
	return p;
}
struct tree{
	int l,r,mul,lzm;
	int p,lzp;
	int len(){return r-l+1;}
}t[N<<2];
void pushup(int k){
	t[k].mul=t[k<<1].mul*t[k<<1|1].mul%mod;
	t[k].p=t[k<<1].p|t[k<<1|1].p;
}
void build(int k,int l,int r){
	t[k]={l,r,a[l],1};
	if(l==r){
		int p=getp(a[l]);
		t[k].p=p;t[k].lzp=0;
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void pushdown(int k){
	if(t[k].lzm!=1){
		t[k<<1].mul=t[k<<1].mul*qp(t[k].lzm,t[k<<1].len())%mod;
		t[k<<1].lzm=t[k<<1].lzm*t[k].lzm%mod;
		t[k<<1|1].mul=t[k<<1|1].mul*qp(t[k].lzm,t[k<<1|1].len())%mod;
		t[k<<1|1].lzm=t[k<<1|1].lzm*t[k].lzm%mod;
		t[k].lzm=1;
	}
	if(t[k].lzp!=0){
		t[k<<1].p|=t[k].lzp;
		t[k<<1].lzp|=t[k].lzp;
		t[k<<1|1].p|=t[k].lzp;
		t[k<<1|1].lzp|=t[k].lzp;
		t[k].lzp=0;
	}
}
void update(int k,int l,int r,int val,int p){
	if(l<=t[k].l&&t[k].r<=r){
		t[k].mul=t[k].mul*qp(val,t[k].len())%mod;
		t[k].lzm=t[k].lzm*val%mod;
		t[k].p|=p;
		t[k].lzp|=p;
		return;
	}
	pushdown(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(l<=mid)update(k<<1,l,r,val,p);
	if(r>mid)update(k<<1|1,l,r,val,p);
	pushup(k);
}
pii query(int k,int l,int r){
	if(l<=t[k].l&&t[k].r<=r){
		return {t[k].mul,t[k].p};
	}
	pushdown(k);
	int mid=(t[k].l+t[k].r)>>1;
	pii ans={1,0};
	if(l<=mid){
		pii L=query(k<<1,l,r);
		ans.first=ans.first*L.first%mod;
		ans.second|=L.second;
	}
	if(r>mid){
		pii R=query(k<<1|1,l,r);
		ans.first=ans.first*R.first%mod;
		ans.second|=R.second;
	}
	return ans;
}
int inv[500];
main(){
	freopen("array.in","r",stdin);
	freopen("array.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	for(int i=1;i<=400;i++)inv[i]=qp(i,mod-2);
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--){
		cin>>op;
		if(op=="1"){
			cin>>l>>r>>x;
			int p=getp(x);
			update(1,l,r,x,p);
		}
		else{
			cin>>l>>r;
			pii tmp=query(1,l,r);
			int ans=tmp.first,p=tmp.second;
			for(int i=0;i<62;i++){
				if((p>>i)&1){
					ans=ans*(prim[i]-1)%mod*inv[prim[i]]%mod;
				}
			}
			cout<<ans<<"\n";
		}
	}
	return 0;
}

T4 树 30Pts

原题 ODW

根号分治。
设块长为 \(T\)。
预处理出步长为 \([1,\sqrt T]\) 时每个点向上跳到根的点权和以及每个点的 \(1 \backsim \sqrt T\)
大于 \(T\) 则暴力跳,否则树上差分。

这题数据很水,暴力有 70,能过除了链以外的所有点;加个对链的暴力就过了。
但赛时树剖 LCA 打锅了导致 \(100 \to 30\)

后记

还是学到了很多的,也确实是技不如人。

之后要注意代码细节问题,尽量不要在不该挂的地方挂分。

标签:比赛,int,cin,long,second,ans,CSP,模拟,first
From: https://www.cnblogs.com/LBTL/p/18301087

相关文章

  • 『比赛记录』【LGR-193】洛谷 7 月月赛 I×ABC 362
    最舒服的一集「CROI·R2」在相思树下I想了好久还是决定把这道题也写一下,毕竟赛事花了\(40min\)才解决。思路开比赛,看题面,很快啊,打了一个双端队列的做法,结果MLE,然后人傻了二十分钟。之后缓过神来开始推式子。我们把答案先看做操作后的第一个数,提供一个样例:\[2\,\,......
  • 最小数字游戏(Lc2974)——模拟+优先队列(小根堆)、排序+交换
    你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice和Bob决定玩一个游戏,游戏中每一轮Alice和Bob都会各自执行一次操作。游戏规则如下:每一轮,Alice先从 nums 中移除一个 最小 元素,然后Bob执行同样的操作。接着,Bob会将......
  • CSP-J/S 报名全攻略(含考纲)
    CSP-J/S报名全攻略时间安排报名/认证时间指导教师7月10日起开始注册,认证者7月17日开始注册报名。具体各角色注册报名时间请见第一轮认证工作流程(如下)考试时间CCF内容一、简介CCF面向社会非专业人士推出CSP非专业级别软件能力认证。非专业级别能力认证CSP-J/S分两个级......
  • 块设备驱动实现--模拟一个块设备
    1、前言        存储层在收到I/O请求后进行数据处理,再给上层应答,本文实现一个实际的块设备驱动。使用Linux5.4为基础,进行框架搭建和功能实现。2、ko模块与编译    首先定义一个init和exit函数,去注册自己的驱动函数模块。#include<linux/module.h>#includ......
  • 足球预测:AI技术如何预测比赛结果
    一、引言对于球迷来说,足球预测想必已经是个很熟悉的词汇了。现在随着AI技术的发展,人工智能也自然而然地与足球领域相互融合,不仅有AI智能足球广告、AI解说、AI裁判等等,AI足球预测技术也已经想当成熟,当然,也有人会对此抱有疑问,AI预测真的能预测比赛结果么?又是基于什么原理预测的......
  • 解决HBuilder X运行微信小程序模拟器Error: pages.json解析失败
    前言如果已经排查很久了,那这就不是你的问题了,大概率是由于你曾经创建了一个路径,在指定PagePath的时候又指向了这个路径,这个操作本身没有问题。但是,如果你曾经对这个路径修改过了,那编译器就会有问题,来品鉴一下这个错误。16:15:36.772请注意运行模式下,因日志输出、sourcem......
  • 纪念品(2019CSP-J)
    题目描述    小伟突然获得一种超能力,他知道未来T天N种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。    每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;......
  • 比赛获奖的武林秘籍:07 一文速通电子设计大赛,电子人必看的获奖秘籍
    比赛获奖的武林秘籍:07一文速通电子设计大赛,电子人必看的获奖秘籍摘要本文主要介绍了全国大学生电子设计大赛的含义、比赛形式、组队技巧,结合自身经历讲解了备赛指南,同时对往年题目进行了分析和总结。正文引言部分:在电子技术的广阔天地中,年轻的电子设计爱好者们如同勇敢的探......
  • 【eNSP模拟实验】单臂路由实现VLAN间通讯(复杂案例)
    实验需求如下图所示,PC1和PC2在vlan10下,PC3和PC4在vlan20下,Server1在vlan30下,需要实现这5台设备之间互相通讯。实验操作配置各个终端的ip地址PC1~PC4都按照下图进行配置(注意ip地址和网关有不同的地方),注意配置好之后要点击右下角的应用Server1配置如图下所示,配置好之后,点......
  • 20240712NOIP模拟赛复盘
    20240712NOIP模拟赛复盘总结T1:其实不难,但是认为自己推出来依旧很难。但是暴力分\(15\)pts应该是好拿的。T2:推了一个正解,但是因为一些细节问题写挂了。以后应该先把暴力分全部拿完再写正解,写代码时也需要注意细节。T3:赛时口胡出了正解,但是边界没有考虑完全,导致样例没过,最后......