首页 > 其他分享 >230930校内赛

230930校内赛

时间:2023-10-05 16:24:29浏览次数:30  
标签:校内 gcd int 230930 fa ans mod define

T1 洛阳怀

pPqDU9s.jpg

题解

首先非常容易求出的是所有的 \(\gcd\)

对于 \(\gcd\) 而言,如果它的分数是负数,那么将它除去一定会使这个数列得分变大

所以只用求出所有的 \(\gcd\) 的分数并判断正负以及是否除过当前答案了就可以了

还有一点是因为 \(\gcd\) 是单调不降的,所以可以从后往前查保证当前答案不会超出还未遍历的 \(\gcd\)

#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define N 2010
using namespace std;
int n,m,ans,a[N],b[N],f[N],g[N];
unordered_map<int,int>mp;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
signed main(){
	freopen("cup.in","r",stdin);
	freopen("cup.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];
		f[i] = (i==1)?a[1]:gcd(f[i-1],a[i]);
	}
	for(int i = 1;i<=m;i++){
		int x;
		cin>>x;
		mp[x] = 1;
	}
	for(int i = 1;i<=n;i++){
		int x = f[i];
		for(int j = 2;j*j<=f[i];j++){
			if(x%j) continue;
			int cnt = 0;
			while(!(x%j)){
				x/=j;
				cnt++;
			}
			if(mp[j]) g[i]-=cnt;
			else g[i]+=cnt;
		}
		if(x!=1){
			if(mp[x]) g[i]--;
			else g[i]++;
		}
	}
	int tag = 1,flag = 0;
	for(int i = n;i>=1;i--){
		while(g[i]-flag<0&&f[i]/tag>1){
			ans-=(g[i]-flag)*i;
			tag = f[i];
			flag = g[i];
		}
	}
	for(int i = 1;i<=n;i++){
		int x = a[i];
		for(int j = 2;j*j<=a[i];j++){
			if(x%j) continue;
			int cnt = 0;
			while(!(x%j)){
				x/=j;
				cnt++;
			}
			if(mp[j]) ans-=cnt;
			else ans+=cnt;
		}
		if(x!=1){
			if(mp[x]) ans--;
			else ans++;
		}
	}
	cout<<ans;
	return 0;
}

T2 青天之谊

pPqDH4H.jpg

题解

对于每个点,用 \(dfs\) 求出所有人到这个点的最少时间

考虑青见能走到哪些点

  1. 起始点可以走到

  2. 如果一个点可以走到,并且这个点要比其他人早一天到,那么后面一天可以继续走到下面的点

  3. 如果一个点可以走到,并且这个点和其他人能在同一天到,但是同一天青见可以继续走

最优的相遇时间是对于青见能走到的点,天吾走到的最短时间和青见走到的时间取 \(\max\) 的最大值

#include<bits/stdc++.h>
#define N 500010 
using namespace std;
struct edge{
	int v,ne,w;
}e[N<<1];
int n,cnt,tot,st,sp,ans,mn,stq,h[N],d[4][N];
void add(int u,int v,int w){
	e[++cnt].v = v;
	e[cnt].w = w;
	e[cnt].ne = h[u];
	h[u] = cnt;
}
void dfs(int f,int x,int fa,int noko){
	for(int i = h[x];i;i = e[i].ne){
		int v = e[i].v;
		if(v!=fa){
			if(e[i].w>sp) continue;
			d[f][v] = d[f][x];
			if(e[i].w>noko){
				d[f][v]++;
				dfs(f,v,x,sp-e[i].w);
			}else dfs(f,v,x,noko-e[i].w);
		}
	}
}
void check(int x,int y){
	mn = n+1;
	for(int j = 1;j<=tot;j++) mn = min(mn,d[j][x]);
	ans = max({ans,mn,d[0][x]});
	if(d[0][x]>mn) return ;
	for(int i = h[x];i;i = e[i].ne)
		if(e[i].v!=y&&(d[0][x]<mn||d[0][x]==d[0][e[i].v]))
			check(e[i].v,x);
}
int main(){
	freopen("chase.in","r",stdin);
	freopen("chase.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i = 1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);add(v,u,w);
	}
	cin>>tot;
	for(int i = 0;i<=tot;i++){
		for(int j = 1;j<=n;j++) d[i][j] = n+1;
		cin>>st>>sp;
		if(!i) stq = st;
		d[i][st] = 0;
		dfs(i,st,0,0);
	}
	check(stq,0);
	if(ans==n+1) ans = -1;
	cout<<ans;
	return 0;
}

就挺抽象的

T3 数数

pPqr9Ug.jpg

题解

奉劝各位不要从最高位往最低位处理

某sb考试就这么G了,太麻烦了

从低位向高位 枚举一个前缀与 \(x\) 一致,接下来的一位比 \(x\) 小

考虑一下此时后面位的取值就是还没有被确定的那些位的任意选择

我们用并查集把限制关系维护一下就行了

#include<bits/stdc++.h>
#define int long long
#define mod 19260817
#define N 100010
using namespace std;
int n,m,l[N],r[N],fa[N],num[N],mn[N],mx[N];
int ksm(int a,int b){
	int res = 1;
	while(b){
		if(b&1) res = res*a%mod;
		a = a*a%mod;
		b>>=1;
	}
	return res;
}
int find_(int x){
	return x==fa[x]?x:fa[x] = find_(fa[x]);
}
int solve(int *a){
	int tot = 0,ans = 0;
	for(int i = 1;i<=n;i++)
		if(fa[i]==i) tot++;
	for(int i = n;i>0;i--){
		if(fa[i]==i){
			tot--;
			ans = (ans+a[i]*ksm(10,tot)%mod)%mod;
		}
		if(a[find_(i)]<a[i]) ans = (ans+ksm(10,tot))%mod;
		if(a[find_(i)]!=a[i]) break;
	}
	return ans;
}
signed main(){
	freopen("counting.in","r",stdin);
	freopen("counting.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i = 1;i<=n;i++)
		fa[i] = i;
	for(int i = 1;i<=n;i++)
		cin>>l[i];
	for(int i = 1;i<=n;i++)
		cin>>r[i];
	cin>>m;
	for(int i = 1;i<=n;i++){
		int u,v;
		cin>>u>>v;
		u = find_(u);v = find_(v);
		fa[min(u,v)] = max(u,v);
	}
	int ans = (solve(r)-solve(l)+mod)%mod;
	cout<<ans;
	return 0;
}

T4

没写,略过

标签:校内,gcd,int,230930,fa,ans,mod,define
From: https://www.cnblogs.com/cztq/p/17743473.html

相关文章

  • 202309301820_《Spring boot项目,继承mybatis-generator遇到的问题及解决》
     当配置到最后,双击右侧maventab,准备生成时,报红:1.“Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgen......
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛)
    A.AXorBProblem(计数)输入511223输出9说明点击查看代码#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false);cin.tie(0),cout.tie(0)#defineintlonglongusingnamespacestd;constintN=2e5+10;unordered_map<int,int>......
  • 230925校内赛
    T1开挂我卢本伟没有开挂题解挺简单的,不过我写的比较麻烦因为我们需要让多的尽可能多来让少的尽可能少,所以会想到用栈来存储需要更改的数,靠近栈底就需要更多次数来更改,栈顶则更少最后只用记录下来所有的次数并按从多到少依次分配从小到大的修改代价#include<bits/stdc++.h......
  • 230927校内赛
    T1集合题解很明显的一道树形\(dp\)题我也没看出来dalao们说有一道\(ddp\)的题转移方式一模一样于是都切了,就我是sb首先有一个非常明显的性质在于所有的被选的点一定是可以构成一颗连通子树的最终选取的\(k\)个点一定是从这颗子树中最远点对的一个点沿着这颗子树直......
  • 校内互测第一周(East!XI~East!XV)总结(窝还是退役吧QAQ
    ==真是不想说啥了。。。像我这种沙茶蒟蒻还是早点滚粗的好。。。Day1East!XI出题人:18357打开题瞬间傻了。。。三道树上问题。。。三道。。。T1:给定一棵N个节点的无根树,求每个节点到其它的节点的∑(路径长度xorM)。M<=15TM这傻逼题我写了个0~15的Trie树。。。明明记录个0~15的数......
  • 230729校内赛
    回文一句话题意:从左上角到右下角的路径上的字母能组成回文串的路径有几条题解暴力做法是从左上角和右下角分别往对方\(dp\),复杂度为\(\mathcalO(n^4)\)因为状态只有在\(x1+x2+y1+y2=n+m+2\)时合法,则确定三个变量即可推出剩下一个变量,复杂度为\(\mathcalO(n^3)\)......
  • 校内模拟赛赛后总结
    前记(开始写于\(2023.9.9\))(本来是不想写的,但是看到学长以及身边人都写,思考了一下,感觉有点用,于是也写了)(里面也写了一些闲话)(以前的比赛我就记个排名得了,懒得补了)7.20~7.22CSP模拟1~3没考7.24CSP模拟4(rk6)7.25CSP模拟5(rk3)7.26CSP模拟6(rk23)7.27......
  • 230722校内赛
    T1CF576D题解我们根据边的出现时间分成\(m\)段对于每一段,设\(f_{T,i}\)表示\(T\)时刻,\(i\)节点能否走到,那么走一步就是个矩阵乘法对于某一段,我们从终点开始bfs可以就可以求出答案,矩阵乘法用bitset优化复杂度\(\mathcal{O}(m^2+\frac{ω}{mn^3}logT)\)#includ......
  • 230719校内赛
    T1usaco20febEquilateralTrianglesP题面我就不描述了题解首先我们是不可能暴力计算每一对点距离的我们可以想一想如何将斜着的数个点转换为横着或竖着的数个点,这样会使我们的计算方便许多不难想到的是切比雪夫距离,当然考场上也容易推出这玩意(我就是考场现推的)然后就是如......
  • [校内]极端题
    0811T1计数练习题意作为一名普及组选手,小\(A\)喜欢数数。一天,小\(A\)学习了排列相关的知识。定义一个长度为\(n\)的序列\(p_{1...n}\)是一个\(n\)阶排列,当且仅当\(p_{1...n}\)都是\([1,n]\)中的正整数且它们两两不同。小\(A\)想数排列。为了让数排列更有趣,......