首页 > 其他分享 >模拟赛总结

模拟赛总结

时间:2024-02-15 11:12:38浏览次数:28  
标签:总结 gcd int tr t1 序列 now 模拟

2024.2.6 【寒假集训】20240206测试

T1 珠子

T2 数组

这个题,我没考虑到的是要保留全部的 \(x,y\) 操作信息,以及上一次 \(A\) 操作的时间等等。

代码(参考 lcy):

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int t1[500001],t2[500001];
int lst[50000100];
int pos,dx;
signed main()
{
	cin>>n>>m;
	int su=(n+1)*n/2;
	pos=0,t1[0]=1,t2[0]=0;
//	for(int i=1;i<=n;i++)lst[i]=i;
	for(register int i=1;i<=m;++i)
	{
		char c=getchar();
		int x,y;cin>>x>>y;
		t1[i]=x,t2[i]=y;
		if(c=='A')
		{
			pos=i,dx=0;
			printf("%lld\n",x*su+n*y);
		}
		else
		{
			if(lst[t1[i]]<=pos)
			{
				dx+=t2[i]-(t1[i]*t1[pos]+t2[pos]);
				lst[t1[i]]=i;
			}
			else
			{
				int last=lst[t1[i]];
				dx-=t2[last]-(t1[i]*t1[pos]+t2[pos]);
				dx+=t2[i]-(t1[i]*t1[pos]+t2[pos]);
				lst[t1[i]]=i;
			}
			printf("%lld\n",t1[pos]*su+t2[pos]*n+dx);
		}
	}
	return 0;
}

T3 幸运区间

题意:在序列 \(a\) 中,求出所有子序列 \(b\) 中, \(\gcd(b)=1\) 的个数。

\[\sum_{x=1}^{n}\sum_{y=x}^{n}[\gcd(x \sim y)==1] \]

(\(\sim\) 表示从 \(x\) 到 \(y\) 的所有元素)

考虑画出一个表示所有子序列的 \(\gcd\) 的三角形矩阵:

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

我们可以看到,从最下面开始,对于每个左端点确定的区间,只要在右端点为 \(r\) 的时候 \(\gcd=1\) ,那么从\([l,r]\) 到 \([l,n]\),所有区间的 \(\gcd=1\)。

有一个定理:只要一个序列的子序列 \(\gcd=1\),那么这个序列 \(\gcd=1\)。

所以,我们需要实现两个东西:

  1. 查找区间 \([l,r]\) 的 \(\gcd\)。

  2. 找到对于一个 \(l\in [1,n]\),\(r\) 最小并且 \(\gcd=1\) 的子序列,统计答案 ans+=n-r+1

对于查找,由上面的定理可知, \(\gcd\) 具有传递性,因此我们可以构建一棵线段树来实现此操作。

tr[now].gcd=__gcd(tr[lid].gcd,tr[rid].gcd);

对于找到一个 \(l\)、满足条件的最小的 \(r\),我们考虑直接 for 循环去找(区间伸缩)。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[200100];
class emw{
	public:
		#define lid now<<1
		#define rid now<<1|1
		void build(int now,int l,int r)
		{
			if(l==r){
				tr[now].g=a[l];return ;
			}
			int mid=(l+r)>>1;
			build(lid,l,mid),build(rid,mid+1,r);
			tr[now].g=__gcd(tr[lid].g,tr[rid].g);
		}
		int getgcd(int now,int l,int r,int x,int y)
		{
			if(x<=l&&r<=y)return tr[now].g;
			int mid=(l+r)>>1;
			int res=0;
			if(x<=mid) res=__gcd(res,getgcd(lid,l,mid,x,y));
			if(y>mid) res=__gcd(res,getgcd(rid,mid+1,r,x,y));
			return res;
		}
	private:
		struct segTree{
			int g;
		}tr[200100<<2]; 
}st;
int ans;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	st.build(1,1,n);
	int l=1,r=1;
	for(l=1;l<=n;l++)
	{
		r=max(l,r);
		while(l<=r&&r<=n)
		{
			if(st.getgcd(1,1,n,l,r)==1)
			{
				break;
			}
			r++;
		}
		ans+=(n-r+1);
	}
	cout<<ans;
	return 0;
}

T4 找不同

标签:总结,gcd,int,tr,t1,序列,now,模拟
From: https://www.cnblogs.com/ccjjxx/p/18016054

相关文章

  • 反悔贪心(模拟费用流)
    反悔贪心(模拟费用流)贪心本身是不能反悔的,但如果当前最优解不是全局最优解,我们就需要通过反悔来贴近全局最优解。一般用堆来实现,即堆中维护当前可以用来反悔的决策,然后每次取最优的决策。其实从更一般的角度,反悔贪心就是建出费用流模型,然后用数据结构来模拟增广的操作。一些例题......
  • C#实现异步编程的常用方式总结
    随着现代软件对性能和响应速度的要求越来越高,异步编程已经成为许多开发者必须掌握的技能。C#提供了多种实现异步编程的方式,每种方式都有其特定的适用场景和优缺点。本文将详细介绍C#中实现异步编程的常用方式,帮助读者更好地理解并选择合适的异步编程方法。一、Task和TaskC#......
  • Codeforces Round 925 (Div. 3) 赛后总结
    此次总结借鉴了Register_int,0x3ea,幻想家协会会长的题解。感谢大佬。RecoveringaSmallString题目大意:将字母a-z编号为1-26,给出一个整数,此整数为三个字母之和,求改字符串的最小字典序。分析可以暴力循环,或者分情况讨论.我们只要尽力保持越前面的字母越小越好。#include<i......
  • 2023年度总结
    今年的年度总结比往年来的都要晚一些,1、2月份事情很多,当然拖延症也占了一部分,索性把今年的年度总结战线拉的长一些,说说最近的故事。 2023年全年大事件真正意义旅游晋升成功考公失败生病家人和我-开始奇怪养生之旅参加婚礼-去了河北的很多地方看房子 往年的详细解说......
  • 【运维测试】移动测试自动化知识总结第1篇:移动端测试介绍(代码笔记已分享)
    本系列文章md笔记(已分享)主要讨论移动测试相关知识。主要知识点包括:移动测试分类及android环境搭建,adb常用命令,appium环境搭建及使用,pytest框架学习,PO模式,数据驱动,Allure报告,Jenkins持续集成。掌握操作app的基本api,掌握元素定位及获取元素信息的api,掌握事件操作api,掌握app模拟手势......
  • 树状数组模拟_ABC340_E - Mancala 2
    目录问题简述思路分析参考代码做题反思问题简述原题参考:E-Mancala2初始给出长度为n、m的数组a、b,要求给出m次操作后的数组a,每一次的操作流程如下:设定变量c=0;取出a[b[i]]中的数字保证手上有一个球的情况下进行以下操作:c++向a[(b[i]+c)%n]中放1可以看原题,原题有......
  • AtCoder Beginner Contest 340 考试总结
    前言可惜的是我是VP的,却打得相对较好(服了。得分明细:ABCDEFGTotal√√√√√√×2625改题明细:ABCDEFG√√√√√√×第一次打AT,发挥还可以。A.ArithmeticProgressionProblem打印一个包含第一项\(A\),最后一项\(B\)......
  • codeforce:800-900分段刷题总结
    1.博弈论WalletExchange爱丽丝和鲍勃很无聊,于是他们决定用自己的钱包玩一个游戏。爱丽丝的钱包里有a枚硬币,而鲍勃的钱包里有b枚硬币。双方轮流玩,由爱丽丝先走棋。在每个回合中,玩家将按顺序执行以下步骤:选择与对手交换钱包,或保留现有钱包。从玩家当前钱包中取出1个硬......
  • ruffle 基于webassembly 的flash player 模拟器
    ruffle基于webassembly的flashplayer模拟器包含的特性安全 基于rust以及wasm避免一些安全问题安装简单免费开源说明官方还提供了一个demo站点可以快速体验功能参考资料https://github.com/ruffle-rs/rufflehttps://ruffle.rs/https://ruffle.rs/downloads#websi......
  • 匀加速运动模拟python,(matplotlib)
    importnumpyasnpimportmatplotlibmatplotlib.use("TKAgg")importmatplotlib.pyplotaspltg=9.8s=100ds=0.00001#单位米v0=0.001#m/sv=[v0]t=[ds/v0]t_sum=0ds_num=int(s/ds)x=[]y=[]foriinrange(ds_num+1):ifi==0:continue......