首页 > 其他分享 >2024.7.27模拟赛9

2024.7.27模拟赛9

时间:2024-08-06 17:55:03浏览次数:6  
标签:tmp 27 2024.7 int LL tot ++ 模拟 left

模拟赛

炸裂场,交互 + 提答

T1 ラーメンの食べ比べ

交互题,没做过。。。

\(N \le 400\),有 \(600\) 次询问,其实还挺水的。

先考虑二分,两两一组比较,会得到 \(200\) 个较大的和 \(200\) 个较小的,还剩 \(400\) 次查询。

既然还剩 \(400\) 次查询,那也不用考虑二分了,直接 \(200\) 个暴力比较就好了。

注意交互写法。

code
#include<bits/stdc++.h>
using namespace std;
#include "ramen.h"
const int N = 605;
int cnt1,cnt2;
int a[N],b[N];

void Ramen(int N)
{
	if(N==1)
	{
		Answer(0,0);
	}
	for(int i=0;i<N;i+=2)
	{
		if(i+1>=N) break;
		if(Compare(i,i+1)==1) a[++cnt1]=i,b[++cnt2]=i+1;
		else a[++cnt1]=i+1,b[++cnt2]=i;
	}
	if(N&1)
	{
		if(Compare(N-1,a[1])==1) a[1]=N-1;
		else b[++cnt2]=N-1;
	}
	int mx=a[1];
	for(int i=2;i<=cnt1;i++)
	{
		if(Compare(mx,a[i])==-1) mx=a[i];
	}
	int mi=b[1];
	for(int i=2;i<=cnt2;i++)
	{
		if(Compare(b[i],mi)==-1) mi=b[i];
	}
	Answer(mi,mx);
}

T2 Substring of Sorted String

其实挺裸的线段树。

我们考虑一个区间如果是合法的,那么它一定是单调不下降的。

如果在线段树中直接维护是否合法,还需要分讨合并。所以我们不如只维护区间的单调性,先不管是否合法。

于是维护的信息有左右端点,各个字母出现次数(最后要用),单调性。

最终我们对查询的区间中字母的出现次数和整个序列的出现次数比较。

除了边界的两个以外,其他字母的出现次数都应该和整个序列的出现次数一样。

code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n,m,cnt[26];
char s[N],t[N];
struct T
{
	int l,r,cnt[26];
	int mx,mi; 
	bool y=1;
} tr[N<<2];
void pushup(int k)
{
	tr[k].mi=tr[k<<1].mi; tr[k].mx=tr[k<<1|1].mx;
	for(int i=0;i<26;i++) tr[k].cnt[i]=tr[k<<1].cnt[i]+tr[k<<1|1].cnt[i];	
	if(!tr[k<<1].y||!tr[k<<1|1].y) tr[k].y=0;
	else tr[k].y=tr[k<<1].mx<=tr[k<<1|1].mi;
}

void bui(int k,int l,int r)
{
	tr[k].l=l; tr[k].r=r;
	if(l==r) return tr[k].y=1,tr[k].mi=tr[k].mx=s[l]-'a',tr[k].cnt[s[l]-'a']++,void(0);
	int mid=l+r>>1;
	bui(k<<1,l,mid); bui(k<<1|1,mid+1,r);
	pushup(k);
}
void mdf(int k,int p,char v)
{
	if(tr[k].l==tr[k].r)
	{
		tr[k].cnt[s[p]-'a']--;
		tr[k].cnt[v-'a']++;
		cnt[v-'a']++; cnt[s[p]-'a']--;
		tr[k].mx=tr[k].mi=v-'a';
		s[p]=v; tr[k].y=1;
		return;
	}
	int mid=tr[k].l+tr[k].r>>1;
	if(p<=mid) mdf(k<<1,p,v);
	else mdf(k<<1|1,p,v);
	pushup(k);
}
T que(int k,int l,int r)
{
	if(l<=tr[k].l&&tr[k].r<=r)
	{
		return tr[k];
	}
	int mid=tr[k].l+tr[k].r>>1;
	if(r<=mid) return que(k<<1,l,r);
	else if(l>mid) return que(k<<1|1,l,r);
	else
	{
		T r1=que(k<<1,l,r),r2=que(k<<1|1,l,r),r3;
		r3.mi=r1.mi; r3.mx=r2.mx;
		for(int i=0;i<26;i++) r3.cnt[i]=r1.cnt[i]+r2.cnt[i];	
		if(!r1.y||!r2.y) r3.y=0;
		else r3.y=r1.mx<=r2.mi;
		return r3;
	}
}
int main()
{
//	freopen("1.in","r",stdin);
//	freopen("o2.out","w",stdout);
	scanf("%d",&n);
	scanf("%s",s+1);
	for(int i=1;i<=n;i++) cnt[s[i]-'a']++;
	bui(1,1,n);
	scanf("%d",&m);
	while(m--)
	{
		int c; scanf("%d",&c);
		if(c==1)
		{
			int x;char y; scanf("%d %c",&x,&y);
			mdf(1,x,y);
		}
		else 
		{
			int l,r; scanf("%d%d",&l,&r);
			T q=que(1,l,r);
			if(q.y)
			{
				bool fl=0;
				for(int i=q.mi+1;i<q.mx;i++) if(q.cnt[i]!=cnt[i]) 
				{
					fl=1; break;
				}
				if(fl) puts("No");
				else puts("Yes");
			}
			else puts("No");
		}
	}
	return 0;
}

T3 Edge Elimination

一开始觉得贪心挺好想的,每次找出大于 \(x\) 的最小的子树,然后从大到小删子树。

然后大样例挂了一个。。。

其实再想一想会发现上述情况不一定是最优的,考虑最终删成一条链的情况,这个贪心显然就假了。

那我们就遍历一下最上端留下的节点是哪个,也就是遍历留下的树的根节点的深度。

其实到这里就已经 AC 了。但是还有一种奇葩思路。(以下思路正确性不保证)

其实遍历深度是不必要的,因为如果一棵大于 \(x\) 的非最小的子树能成为答案的话,

那么一定能通过整棵树删去子树达到,所以只需要判断整棵树和大于 \(x\) 的最小的子树就可以。(至少可以过)

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t;
LL k,d,x;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld%lld%lld",&d,&k,&x);
		LL tot=0,left; LL ans=0,ans1=0;
		for(int i=0;i<=d;i++)
		{
			tot=tot*k+1;
			if(tot==x)
			{
				if(i==d) printf("0\n");
				else printf("1\n");
				goto X;
			}
			else if(tot>x)
			{
				ans=(i==d)?0:1,left=tot;
				while(left>x)
				{
					tot=(tot-1)/k;
					LL tmp=(left-x)/tot;
					left-=tmp*tot; ans+=tmp;
				}
				break;
			}
		}
		tot=0;
		for(int i=0;i<=d;i++) tot=tot*k+1; left=tot;
		while(left>x)
		{
			tot=(tot-1)/k;
			LL tmp=(left-x)/tot;
			left-=tmp*tot; ans1+=tmp;
		}
		printf("%lld\n",min(ans1,ans));
		X:;
	}
	return 0;	
}

T4 双人猜数游戏

提答,挺好玩的,先咕着。。。

咕咕咕。。。

标签:tmp,27,2024.7,int,LL,tot,++,模拟,left
From: https://www.cnblogs.com/ppllxx-9G/p/18345735

相关文章

  • Profinet远程IO模块:模拟量输入输出模块_参数及选型说明
    模拟量输入、输出模块是XD系列现场常用的IO模块。分为输入和输出两种类型,按照信号类型分为电压型和电流型,16位分辨率,通道分为4通道和8通道!产品型号信息模块指示灯模拟量量程对应数值(以下为4通道型号,8通道同理)XD3004的使用注:默认配置1:0-10V。(1).配置参数1:0-10v,输入1......
  • 暑假集训CSP提高模拟14
    刚放假回来,好困……赛时rank38,T1100,T20,T30,T40打了T1后迷迷糊糊,半睡不睡的。这还能抢一个T1首切?T1BA烙饼问题。答案是\(\max(\max(a_i),\left\lceil\frac{\sum_{i=1}^na_i}{\min(n,m)}\right\rceil)\)还有一个二分答案的做法。但我们好像没有人写……点此查看......
  • 『模拟赛』暑假集训CSP提高模拟14
    Rank题目泰国尼添所以暴力挂一点分也能拿到22/98A.BA签到题。总记得小时候在《冒险岛数学奇遇记》的第28册左右看到过这道题,关键在于你可以分次烙完一张饼。举例2口锅5张饼,54433,最优策略的一种是先将5的那张饼烙3单位时间,然后烙一张4一张3;另一口锅......
  • 基于两颗CH582芯片实现GPIO模拟SPI全双工通讯__从机通过GPIO中断读写数据
    简介:此程序是根据标准SPI协议规范使用模式0编写的一份模拟SPI全双工数据收发例程,经过测试,一个字节收发时长可压缩至最低115us左右,约9091字节每秒=73Kbps的通讯速率,注释中尽可能解释了每一步的含义,后续有想法应该会对其进行优化。注:笔者开发经验较少,在编程上或许复杂了一些。......
  • SSM高校就业管理信息系统827n6 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1
     本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:学生,企业,操作必看,企业信息,档案,政策法规,通知公告,就业新闻,招聘会,招聘信息,企业审核,解约申请,签约信息,就业小课堂,学校审核开题报告内容一、......
  • 暑假集训CSP提高模拟14
    暑假集训CSP提高模拟14组题人:@H_Kaguya|@LYinMX\(T1\)P209.BA\(30pts\)部分分\(30pts\):输出\(\left\lceil\dfrac{\sum\limits_{i=1}^{m}a_{i}}{n}\right\rceil\)。数形结合,将\(\{a\}\)抽象成矩形,烙饼抽象成海报覆盖,最终有\(\max(\max\limits_{i=1}^{m}......
  • 月薪 27K,年薪 40 的甲方网络安全负责人面试题(二面)上
    二面相比于一面,比较偏向于技术方向,由于篇幅原因,预计会分2到3次发出。Fastjson反序列化漏洞是哪个版本,能说一下它的原理和修复方式吗,修复之后还有其他绕过方式吗?我们常说的最经典的FastJson反序列化漏洞是1.2.22-1.2.24版本的。FastJson它本身有一个叫做自省的......
  • 热烈祝贺华企盾科技获得ISO/IEC 27001信息安全管理体系认证证书!
    近日,北京华企盾科技有限责任公司顺利通过权威认证机构的严格审核,获得“ISO/IEC27001信息安全管理体系认证证书”。认证范围涵盖与计算机软硬件销售及软件运维相关的信息安全管理活动等。信息安全管理实用规则ISO/IEC27001是国际上具有代表性的信息安全管理体系标准,已在世界各......
  • 模拟实现 memcpy --浅谈C语言
    内存拷贝-memcpy描述C库函数void*memcpy(void*str1,constvoid*str2,size_tn)从存储区str2复制n个字节到存储区str1。memcpy是最快的内存到内存复制子程序。它通常比必须扫描其所复制数据的strcpy,或必须预防以处理重叠输入的memmove更高效。memcpy,memcpy......
  • 2024上岸|鱼类增养殖学(927)129备考攻略
    前言......