首页 > 其他分享 >2024.7.19模拟赛

2024.7.19模拟赛

时间:2024-07-19 21:40:24浏览次数:12  
标签:return rr 2024.7 19 ll dfs int 区间 模拟

模拟赛

T1 立大功。

T1 yyy loves Maths VI (mode)

摩尔投票法。

既然有一个人出现次数 \(\gt \frac{n}{2}\),那么我们可以用两两抵消的思路。最坏的情况就是每一个不是答案的都消掉了一个答案,但这样也会剩下正确答案。

for(int i=1;i<=n;++i)
{
	int x; scanf("%d",&x);
	if(cnt==0)  a=x;
	if(a==x) cnt++;
	else cnt--;
}

最炸裂的是用 CRT!!!取几个质数求模,每个都找出模数出现次数最多的那个,然后解。

复习CRT。(如果不证明还挺简单的?)

code
#include<bits/stdc++.h>
using namespace std;
int n,prime[3][1030],a[3]={1009,1019,1021},mx[3],ans[3];

int exgcd(int a,int b,int &x,int &y)
{
	if(b==0) {x=1; y=0; return a;} 
	int gcd=exgcd(b,a%b,x,y),t=x;
	x=y; y=t-y*(a/b);
	return gcd;
}
int u,v;
int crt()
{
	int x,y,res=0;long long ck=1,m;
	for(int i=0;i<3;i++) ck*=a[i];
	for(int i=0;i<3;i++)
	{
		m=ck/a[i];
		exgcd(a[i],m,x,y);
		res=(res+y*m*ans[i])%ck;
	}
	return res>0?res:res+ck;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		int x; scanf("%d",&x);
		for(int j=0;j<3;j++) prime[j][x%a[j]]++;
	}
	for(int j=0;j<3;j++)
		for(int i=0;i<a[j];i++)
			if(mx[j]<prime[j][i]) mx[j]=prime[j][i],ans[j]=i;
	printf("%d\n",crt());
	return 0;
}

T2 Non-boring sequences

赛时半小时打完,最后十分钟发现假了。。。

正解两种:

一、 分治

思路出奇的简单,我们考虑如果一个数在目前的区间中只出现一次,那么所有跨过它的子区间一定都满足,所以我们只需要对它左右的两个子区间递归求解就好了。

如何判断一个数在某个区间中是否只出现一次呢?可以预处理每个数上一次出现的位置和下一次出现的位置,判断是否在区间内就好了。

大概长这样:

for(int i=1;i<=n;i++)
{
	nxt[i]=1e9;
	int x; scanf("%d",&x);
	pre[i]=mp[x]; nxt[lst[i]]=i;
	mp[x]=i;//map离散化
}

这样我们还需要遍历每个区间,极限情况可以卡。

这里用到一个 trick:启发式分裂!!!

启发式分裂(中途相遇法):从两边同时遍历,最坏情况在中间 \(\frac{len}{2}\)。

名字依旧很高级,其实就是每次分成两半,同时进行,防止被卡。用处挺大的。

code
#include<bits/stdc++.h>
using namespace std;
const int N = 200005;
int t;
int n,nxt[N],pre[N];
unordered_map<int,int> mp;

bool dfs(int l,int r)
{
	if(l>=r) return 1;
	int ll=l,rr=r;
	while(ll<=rr)
	{
		if(pre[ll]<l&&nxt[ll]>r)
			return dfs(l,ll-1)&&dfs(ll+1,r);
		if(pre[rr]<l&&nxt[rr]>r)
			return dfs(l,rr-1)&&dfs(rr+1,r);
		ll++,rr--;		
	}
	return 0;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		mp.clear();
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			nxt[i]=1e9;
			int x; scanf("%d",&x);
			pre[i]=mp[x]; nxt[lst[i]]=i;
			mp[x]=i;
		}
		if(dfs(1,n)) printf("non-boring\n");
		else printf("boring\n");
	}
	return 0;
}

二、 扫描线

咕咕咕。。。

标签:return,rr,2024.7,19,ll,dfs,int,区间,模拟
From: https://www.cnblogs.com/ppllxx-9G/p/18312440

相关文章

  • 闲话 719
    定义局部有限序集\(P\)上的莫比乌斯函数\(\mu(L,R)\)是满足如下性质的函数:\[\mu(L,L)=1,\sum_{L\lex\leR}\mu(L,x)=0\]有偏序集\(L(\mathbbF_n^q)\)是\(\mathbbF_n^q\)的子线性空间,偏序关系是包含。设\(|\dimU-\dimV|=d\),证明:\(\mu(U,V)=(-1)^dq^{\binomd2}\)......
  • 周总结7.19
    本周开始主要学习了黑马程序员中MYSQL的进阶篇,学习了1.存储引擎:INNODB,MYISAM,MEMORY,主要需要明白INNODB的特点事务,行级锁,外键;2.索引:是一种高效获取数据的数据结构,索引结构:B+Tree,Hash。B+Tree是主要的索引,最终在叶子结点会存储数据,并形成双向链表,提高了查询的效率,并且由于分叶子结......
  • 学习Java的第五天(2024.7.18)
    1.字符串类:String类String类:是引用类型,默认值为null(注意不是空串"")字符串的声明:publicstaticvoidmain(String[]args){//声明字符串Stringstr="abc你好";System.out.println(str);str=newString("");//和strnewString();输出结果都......
  • 学习Java的第六天(2024.7.19)
    1.容器类、集合类之前学过的容器:数组,但是数组有局限:1.数组存储的数据类型有限制2.数组存储的长度受限2.容器类分为:List,Set,Map3.List类:List是一个接口,他的实现类有:ArrayList,LinkedList,Vectorpublicstaticvoidmain(String[]args){Listlist=newArrayLi......
  • 07-19 题解
    07-19题解B思路实质:有一个完全图,删掉一些边,然后在图上找一棵生成树但是图的边数是\(n^2\)级别的,极其稠密找生成树的步骤:从一个点开始,把与它相连的,不在同一连通块的点连在一起所以我们只要确保每次都能在尽量少的步数内找到一个合法点一共有n个点,确定一个点之......
  • 暑假集训CSP提高模拟2
    A.活动投票主元素问题,用摩尔投票#include<bits/stdc++.h>usingnamespacestd;intn,a=-1,acnt,x;intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i){ scanf("%d",&x); if(acnt==0){ a=x; acnt++; } elseif(a==x){ acnt++......
  • 为了Python换源,我开发了一个库「pipco 0.0.19」
    你好,我是悦创。有时候某个源又出问题,或者频繁切换源。我就想开发一个库可以切换的,链接:https://pypi.org/project/pipco/库是开源的,可以自行学习或者使用。使用方法:安装pipinstallpipco查看帮助pcohelp当你需要使用Python时,Pip是一个非常重要的工具,它用于安......
  • 2024.7 做题记录 2 / 顾影自怜了几回 直到看见妄自蕤
    CF653E不难发现其实就是在假想中建立出可以存在的边的图,要求跟\(1\)相连的连通块个数\(\leqk\)且与\(1\)的连边个数\(\geqk\)且全图联通,这个我们只需要知道其去掉\(1\)的连通性就很好讨论了。我们其实不能直接建出这个极度稠密的图,但是我们可以用数据结构优化建图,......
  • cf1809D-1900-66min
    重点在于看出来操作1至多执行一次,之后就很容易了,加上一些预处理的小优化就能过,就是代码逻辑比较复杂,对coding能力有一些要求 #include<iostream>#include<cstring>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<vector>#include......
  • P1954
    对于一个拓扑图,可以建反图。首先考虑连边,从a到b的代表val[a]<val[b]。那么DAG上每条链上的时间都递减。同时因为拓扑的性质,时间的要求是可以保证的。从入度为0的结点开始考虑贪心,让限制紧的人先飞,所以我们可以将队列换成优先队列,这样就可以满足这个性质了,因为题目保证有解。然后想......