首页 > 其他分享 >2023NOIP A层联测9

2023NOIP A层联测9

时间:2023-10-11 21:36:42浏览次数:36  
标签:std int long 联测 len using 2023NOIP dis

A.长春花

简单题。打表发现情况并不多,记录下平方后模 \(p\) 对应的值,然后枚举 \(a\),用链表维护即可。

点击查看代码
#include<bits/stdc++.h>
using ll=long long;using ull=unsigned long long;
int a[100005],b[100005],p,ans,mx;
bool vis[100005];
std::list<int> l;
std::stack<std::list<int>::iterator> stk;
int main(){
	std::cin.tie(nullptr)->sync_with_stdio(false);
	std::cin>>p;
	for(int i=0;i<=p-1;++i){
		int mo=1ll*i*i%p;
		l.push_back(i);
		if(!vis[mo])vis[mo]=true,a[i]=b[i]=mo,mx=i;
	}
	for(int i=0,lst;i<=mx;++i){
		for(auto it=l.begin();it!=l.end();++it){
			lst=(*it-a[i]+p)%p;
			if(vis[lst])stk.push(it),ans=i;
		}
		while(!stk.empty())l.erase(stk.top()),stk.pop();
	}
	std::cout<<ans;
	return 0;
}

B.紫罗兰

无向无权图求最小环的个数。

考场上用 Floyd 找最小环,只有 55pts。

正解是以每个点为源点 bfs。把最短路拼成最小环,记录方案数。

根据 bfs 的性质,队列中的元素任何时刻至多只有两个层次的节点。我们可以判断当前搜索的节点是否被访问过。

如果当前搜索的节点未被访问过就更新最短路和方案数,否则就更新下最小环的长度和个数。虽然不能保证该环为简单环,但所有情况拼成的环中一定存在简单环,所以对所有的环长度取 \(\min\) 就一定是最小环。

这样求出的长度为 \(L\) 的最小环会被重复搜 \(L\) 遍,所以答案要除以 \(L\)。\(L\) 为奇数时,\(dis_i=dis_j\) 会被算两次,还要除以 \(2\)。

直接粘的 chancelong 赛时的代码加了点注释。

点击查看代码
#include<bits/stdc++.h> 
#define int long long
using namespace std;
vector<int>edge[3010];
int n,m;
int minn=2e9+10;
int tot=0;
int dis[3010],len[3010];//dis:源点到点i的最短路 len:源点到点i最短路的方案数 
void search(int x){
	queue<int>q;
	memset(dis,0x3f,sizeof(dis));
	memset(len,0,sizeof(len));
	q.push(x);
	dis[x]=0,len[x]=1;
	while(!q.empty()){
		int i=q.front();
		q.pop();
		for(auto j:edge[i]){//i->j
			// 搜索到环: x->...i->j->...x 
			int turnd=dis[i]+dis[j]+1;//环的长度 
			int turnc=len[i]*len[j];//求拼成环的方案数 
			if(dis[j]==dis[i]||dis[j]==(dis[i]+1)){//j节点已被访问过 
				if(turnd<minn){
					minn=turnd;
					tot=turnc;
				}
				else if(turnd==minn){
					tot+=turnc;
				}
			}
			if(dis[j]>dis[i]+1){
				dis[j]=dis[i]+1;
				len[j]=len[i];
				q.push(j);
			}
			else if(dis[j]==dis[i]+1){
				len[j]+=len[i];
			}
		}
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	for(int i=1;i<=n;i++){
		search(i);
	}
	tot/=minn;
	if(minn%2)tot/=2;
	cout<<tot;
}

C.天竺葵

这基本就是 LIS 吧......

朴素的转移方程:\(f_i=\max_{1\le j<i}\{f_j+1\}(a_j b_{f_j}<a_i)\)

这样直接做是 \(O(n^2)\) 的。

考虑像 LIS 一样的优化,贪心地想,末尾肯定是越小越容易往后接东西。所以定义 \(f_i\) 为长度为 \(i\) 的子序列末尾 \(a b_i\) 的最小值。转移的时候直接二分查找转移点即可,复杂度 \(O(n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
using ll=long long;using ull=unsigned long long;
int n,ans;
ll a[1000005],b[1000005],f[1000005];
int main(){
	std::cin.tie(nullptr)->sync_with_stdio(false);
	std::cin>>n;
	for(int i=1;i<=n;++i)std::cin>>a[i];
	for(int i=1;i<=n;++i)std::cin>>b[i];
	memset(f,0x3f,sizeof f);
	for(int i=1;i<=n;++i){
		int pos=std::lower_bound(f+1,f+1+ans,a[i])-f;
		ans=std::max(ans,pos);
		f[pos]=std::min(f[pos],b[pos]*a[i]);
	}
	std::cout<<ans;
	return 0;
}

D.风信子

类似于 超级钢琴。那道题是把询问元组放入堆中,每次取最大值,根据答案的位置把询问分裂开再放入堆中维护。

我直接搬官方题解吧(

这场暴力分比较多,T1 T3比较简单。T2 找环应该想到 bfs,但不知道为啥用 Floyd 只有 55。我估的 70 啊www

T4 部分分应该有 65。但 \(k=1\) 拿线段树维护的 15 分没打完。

标签:std,int,long,联测,len,using,2023NOIP,dis
From: https://www.cnblogs.com/UNowen/p/17758239.html

相关文章

  • CSP模拟52联测14 C.天竺葵
    CSP模拟52联测14C.天竺葵目录CSP模拟52联测14C.天竺葵题目大意思路code题目大意给定两个长度为\(n\)的序列\(a,b\)需要在\(a\)序列中好到最长的序列\(c\)满足\(c_{i+1}>b_i\timesc_i\)输出长度\(1\len\le10^6\)思路感觉和\(n(\logn)\)求最长上升......
  • CSP模拟52 & A 层联测 9
    2023NOIPA层联测9长春花观察大样例可以发现,函数\(f(x)\)的值很小,那么可以考虑暴力枚举。用一个桶存一下平方数对\(p\)取模的值是否存在,那么可以选择从小到大枚举\(a\),找到第一个存在的\(b\)。紫罗兰考虑什么情况下会出现环,当两个点已经连通时,再在这两个点之间加一......
  • 2023NOIP A层联测9 T3 天竺葵
    2023NOIPA层联测9T3天竺葵题面及数据范围Ps:连接为accoderOJ。看题大概是一个最长上升子序列的带权版本,于是想到dp。设\(dp[i][j]\)为到第\(i\)项,选出\(j\)个数的\(c_j\)最小值,不难想到转移:\[dp[i][j]=\min(dp[i-1][j],a[i]\(a[i]>dp[i-1][j]*b[j])\)\]若任意......
  • NOIP A层联测9 & CSP模拟52
    我的评价是三道傻逼题和一道牛逼题。T4上厕所时想了个奇怪东西打了一个半个小时170行结果剩10分钟发现假了,最后\(k=1\)都没来得及写就直接交了暴力。没想到HZOJ过了50pts,喜了。但是Accoders上只过了35pts,恼了。T1长春花\(b^2\bmodp=(b\bmodp)^2\bmodp\),所以......
  • CSP模拟50联测12 T2 赌神
    CSP模拟50联测12T2赌神题面与数据规模Ps:超链接为衡水中学OJ。思路\(subtask2\):由于\(x_i\)较小,考虑dp。假设一开始球的颜色为红和蓝,设\(dp[i][j]\)为剩\(i\)个红球,\(j\)个蓝球时可获得的最大筹码数。如果不同球掉落所获得的筹码不同,那么肯定会掉落最少筹码的那一......
  • 正如ioi2023noip二十连游寄
    day1抽象场。T1是诈骗题,剩下三题都是撒币概率期望。赛事没有人过t3t4。毫无意义。T2想不到可以把相似的状态归在一起。从\(O(2^{3n})\)到\(O({\begin{pmatrix}n+m\\n\end{pmatrix}}^3)\),很难想到。不过foi的时候甚至听说过拆分数复杂度的题。day2信心场。但是我没有信......
  • CSP模拟51联测13 B.狗
    CSP模拟51联测13B.狗目录CSP模拟51联测13B.狗题目大意题目描述输入格式输出格式样例样例1inputoutput思路题目大意题目描述小G养了很多狗。小G一共有\(n\timesn\)条狗,在一个矩阵上。小G想让狗狗交朋友,一条狗狗最多只能交一个朋友,不必所有狗狗都有朋友。但是狗狗交朋友......
  • 2023NOIP A层联测5
    A.T1(cook)复合题,考场上只做出来了分块的部分,没有想到那个组合数求和可以用莫队分块部分具体不说了,对散块部分加权时,可以采用归并优化时间复杂度(因为我北卡长哩,卡到了晚饭之后,卡了一下午,好欸!)现在考虑问题\(\sum_{i=0}^{k}\dbinom{x}{i}\)令$(S(n,m)=\sum_{i=0}^{m}C......
  • CSP模拟49联测11
    A.模板题考场上我没看数据范围,看出来之后甚至妄想找到一个O(1)的方法......
  • 2023NOIP A层联测6
    A.万花筒考虑发现每次相当于把x和x+d连边,不难发现最后一定是一些环证明可以看白简B.冒泡排序趟数期望写一下我曾经比较疑惑的点为什么inv和p一定一一对应,因为我们发现只要给出我们一个inv我们就可以倒推出唯一确定的p,所以它们是一一对应的关系这道......