首页 > 其他分享 >CSP-S模拟1

CSP-S模拟1

时间:2022-09-03 21:34:20浏览次数:79  
标签:rll ch ll rg maxn CSP 模拟 define

下发文件和题解

A. 斐波那契

对于上面这张图,尝试从2开始依次写下每个兔子的父亲的标号:

那么转换成数列就是这样的:

1 1 1 2 1 2 3 1 2 3 4 5 ...

可以发现这个序列由多个连续从 1 开始的序列组合到一起,每段长度依次是斐波那契数列里面的每一项.

那么就有以下规律:

令f(i)表示第i个月总共的兔子数量,那么有f(0)=0,f(1)=1.
因为第i个月时只有第i-2个月及以前就有的兔子可以产生下一代,那么就有f(i)=f(i-1)+f(i-2).

这不就是斐波那契数列吗?

那么在第i个月出生的第j个兔子编号显然是f(i-1)+j.

然后就可以倒推它的父亲了. 一个点x的父亲即为x-f(k),当且仅当f(k)<x≤f(k+1).

维护一个map,暴力把左边的点的所有父节点标记,再每次向上递归右边的点的父节点,直至有一个节点被标记,那么这个节点就是要求的lca. 每次找k的时候用lower_bound就可以了.

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define maxn 1000001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return f?-x:x;
}
static inline void write(rll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);putchar(x%10|48);
}
ll m,a,b;
ll f[maxn];
map<ll,bool> g;
bool flag;
int main()
{
	f[1]=1;for(rll i=2;i<=60;i++) f[i]=f[i-1]+f[i-2];
	m=read();
	for(rll i=1;i<=m;i++)
	{
		g.clear();flag=0;
		a=read();b=read();g[a]=1;
		while(a!=1) a=a-f[lower_bound(f+1,f+61,a)-f-1],g[a]=1;
		while(b!=1)
		{
			if(g[b]) { write(b); flag=1; putn; break; }
			b=b-f[lower_bound(f+1,f+61,b)-f-1];
		}
		if(!flag) puts("1");
	}
	return 0;
}

B.数颜色

拿分块水过的,注意把块长调整到230左右就行了.

点击查看代码
#include<bits/stdc++.h>
#define ll int
#define rg register
#define rll rg ll
#define maxn 300001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return f?-x:x;
}
static inline void write(rll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);putchar(x%10|48);
}
ll n,m,op,l,r,c,x;
ll a[maxn],len,st[maxn],ed[maxn],bel[maxn];
short col[550][maxn];
static inline ll query(rll l,rll r,rll c)
{
	rll ans=0;
	if(bel[l]==bel[r]) { for(rll i=l;i<=r;i++) ans+=(a[i]==c); return ans; }
	for(rll i=l;i<=ed[bel[l]];i++) ans+=(a[i]==c);
	for(rll i=bel[l]+1;i<bel[r];i++) ans+=col[i][c];
	for(rll i=st[bel[r]];i<=r;i++) ans+=(a[i]==c);
	return ans;
}
int main()
{
	n=read();m=read();len=min((ll)sqrt(n),230);
	for(rll i=1;i<=n;i++) a[i]=read();
	for(rll i=1;i<=len;i++) st[i]=n/len*(i-1)+1,ed[i]=n/len*i;ed[len]=n;
	for(rll i=1;i<=len;i++) for(rll j=st[i];j<=ed[i];j++) bel[j]=i,col[i][a[j]]++;
	while(m--)
	{
		op=read();
		switch(op)
		{
		case 1:
			l=read();r=read();c=read();
			write(query(l,r,c));putn;
			break;
		case 2:
			x=read();
			if(bel[x]!=bel[x+1]) col[bel[x]][a[x]]--,col[bel[x+1]][a[x+1]]--,col[bel[x+1]][a[x]]++,col[bel[x]][a[x+1]]++;
			swap(a[x],a[x+1]);
			break;
		}
	}
	return 0;
}

标签:rll,ch,ll,rg,maxn,CSP,模拟,define
From: https://www.cnblogs.com/1Liu/p/16653616.html

相关文章

  • android studio 创建模拟器报错问题 An error occurred while creating the AVD. See
    用androidstudio安装模拟器遇到的问题由于我是下载的zip版android,而且自定义了androidsdk路径为D:\andriodSDK\,导创这问题.1.无法创建虚拟设备2.启动设备报错解决方......
  • CCF CSP-J/S 2021第二轮获奖分数线及评级规则
    CCFNOI科学委员会、竞赛委员会召开会议,确定了CCFCSP-J/S2021第二轮评级规则及评级名额方案。提高级一等名额分配方案提高级一等全国认证基准线:100分CCFCSP-J/S第二......
  • CSP_202206-2_寻宝!大冒险!
    CSP_202206-2_寻宝!大冒险题目链接思路相当于判断两个有限集合AB之间是不是满射和单射,只需要保证以下两点A和B元素个数相等A中每个元素都能通过映射\(\psi\)到B中一个......
  • 3.实现redis哨兵,模拟master故障场景
    3.实现redis哨兵,模拟master故障场景实验拓扑图  3.1哨兵的准备实现主从复制架构哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于......
  • Android Studio更改SDK、Gradle以及模拟器默认下载位置
    版本:AndroidStudioChipmunk|2021.2.1Patch2时间:2022年9月1日1、更改SDK位置找到File->Settings->Appearance&Behavior->SystemSettings->AndroidSDK......
  • Appium - 模拟手机滑动操控的操作
    在模拟“滑动操控”的时候,使用的方法就是swipe(),该方法的参数说明如下:start_x:起始横坐标start_y:起始纵坐标end_x:结束时横坐标end_y:结束时纵坐标duration:滑动持续......
  • hzx的CSP-J模拟赛题解
    T1按题意模拟即可,注意不用考虑闰年。T2\(30\%\)的数据:使用\(Floyd\)求出图的全源最短路,时间复杂度\(O(n^3)\)。\(50\%\)的数据:对图上每个点使用\(Dijkstra\)求......
  • 模拟tomcat服务器,sun公司,webapp开发者
    模拟tomcat服务器,sun公司,webapp开发者首先我们思考一下一个动态web应用需要哪些角色参与,角色与角色之间又有多少协议?1.有4种角色,分别是(浏览器开发团队[如谷歌],web服务器......
  • 2022-8-31 每日一题-栈模拟-剑指offer-二分查找
    946.验证栈序列难度中等303收藏分享切换为英文接收动态反馈给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入......
  • 模拟投递信件的程序
    题目1.根据题目要求编写模拟投递信件的程序(1)寄信者(Sender)写了一封信(Letter),并将信件交给邮局(PostOffice)寄送。信的属性包括:收信地址(address)、内容(content)、寄信者信息、......