首页 > 其他分享 >8月17日思维训练

8月17日思维训练

时间:2023-08-18 16:55:44浏览次数:51  
标签:思维 17 训练 int sum mid maxn 奶牛 mod

8月17日思维训练

CF1545B AquaMoon and Chess

题目大意:

给定一个长度为n的棋盘的状态,位置 \(i\) 为 \(1\) 代表该位置有棋子,为 \(0\) 则说明没有棋子。如果位置 \(i+2\) 是空的,位置 \(i+1\) 非空,则位置 \(i\) 的棋子可以移动到位置 \(i+2\),反之,同理。问通过上述操作可以达到的状态数,\(mod 998244353\) 后输出

思路:

做这道题,最重要的就是发现 \(11\) 这一条性质。例如 \(11010\),可以转化出来的有:\(11010\),\(01110\),\(01011\) 三种。我们发现两个 \(1\) 始终是贴在一起的,所以我们不妨把字符串分成三个部分:\(a\) 个 \(1\),\(b\) 个 \(11\),\(c\) 个 \(0\)。我们发现 \(1\) 是跟着 \(11\) 的移动被动移动的,所以 \(1\) 在哪里对答案没有任何影响,我们只需要处理 \(11\) 和 \(0\) 的情况,我们又发现它们可以互换位置,一共有 \(a+c\) 个位置,其中 \(a\) 个位置要给 \(11\),那答案就为:\(C_{a+c}^{a}\)。

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+1;
const int mod=998244353;
int T;
int f[maxn];
int n;
string str;
int a[maxn];
inline int power(int a,int b)
{
	int sum=1;
	while(b)
	{
		if(b&1)
			sum=(sum*a)%mod;
		a*=a;
		a%=mod;
		b>>=1;
	}
	return sum;
}
inline int C(int n,int m)
{
	return f[n]*power(f[m],mod-2)%mod*power(f[n-m],mod-2)%mod;
}
signed main()
{
	std::ios::sync_with_stdio(false);
	cin>>T;
	f[0]=1;
	for(int i=1;i<=100000;++i)
		f[i]=(f[i-1]*i)%mod;
	while(T--)
	{
		cin>>n;
		cin>>str;
		str=" "+str;
		for(register int i=1;i<=n;++i)
			a[i]=(str[i]=='1');
		int number11=0,number0=0;
		for(register int i=1;i<=n;++i)
		{
			if(a[i]&&a[i+1])
			{
				++number11;
				++i;
			}
			number0+=(a[i]==0);
		}
		cout<<C(number11+number0,number11)<<endl;
	}
	return 0;
}

P5835 [USACO19DEC] Meetings S]

题目大意:

有两个牛棚位于一维数轴上的点 \(0\) 和 \(L\) 处。同时有 \(N\) 头奶牛位于数轴上不同的位置(将牛棚和奶牛看作点)。每头奶牛 \(i\) 初始时位于某个位置 \(x_i\),用一个等于 \(1\) 或 \(-1\) 的整数 \(d_i\) 表示向左还是向右走。每头奶牛还拥有重量。所有奶牛始终以恒定的速度移动,直到以下事件之一发生:

如果奶牛 \(i\) 移动到了一个牛棚,则奶牛 \(i\) 停止移动

当奶牛 \(i\) 和 \(j\) 占据了相同的点的时候,并且这一点不是一个牛棚,则发生了相遇。此时,两只奶牛调头返回

令 \(T\) 等于停止移动的奶牛(由于到达两个牛棚之一)的重量之和至少等于所有奶牛的重量之和的一半的最早时刻。请求出在时刻 \(0 \ldots T\)(包括时刻 \(T\))之间发生的奶牛对相遇的总数。

思路:

首先,我们可以用两头奶牛相遇后掉头返回,证明奶牛从左往右的体重序列不会发生改变,这个结论先放着,接着,我们再看,我们其实是可以在时间 \(T\) 上二分的(随着时间的增加,停止移动的奶牛的体重之和是单调不减的)。那 check 函数怎么写呢?

inline bool check(int x)
{
	int L=1,R=n,cnt=0;
	for(int i=1;i<=n;++i)
	{
		if(a[i].d==1)cnt+=(a[i].x+x>=l?a[R--].w:0);
		else cnt+=(a[i].x-x<=0?a[L++].w:0);
	}
	return cnt*2>=sum;
}

那为什么向右的奶牛可以到达 \(L\) 点,加上的重量却是当前最右端的呢?这就可以用到前面的结论了:奶牛从左往右的体重序列不会发生改变。最后,我们求出了时间 \(T\) 后,对每一个向左走的奶牛找到与它相遇的位置最右的奶牛,二分即可,最后统计答案就行了

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e4+1;
struct node
{
	int w,x,d;
}a[maxn];
int n,l,sum,ans;
int f[maxn],tot;
inline bool cmp(node x,node y){return x.x<y.x;}
inline bool check(int x)
{
	int L=1,R=n,cnt=0;
	for(int i=1;i<=n;++i)
	{
		if(a[i].d==1)cnt+=(a[i].x+x>=l?a[R--].w:0);
		else cnt+=(a[i].x-x<=0?a[L++].w:0);
	}
	return cnt*2>=sum;
}
signed main()
{
	std::ios::sync_with_stdio(false);
	cin>>n>>l;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i].w>>a[i].x>>a[i].d;
		sum+=a[i].w;
	}
	sort(a+1,a+n+1,cmp);
	int L=0,R=1145141919;
	while(L+1<R)//二分时间,最终答案是R 
	{
		int mid=(L+R)>>1;
		if(check(mid))R=mid;
		else	L=mid;
	}
	for(int i=1;i<=n;++i)
	{
		if(a[i].d==-1)
		{
			int ll=0,rr=tot+1;
			int xx=a[i].x-R*2;//可以相遇的位置 
			while(ll+1<rr)
			{
				int mid=(ll+rr)>>1;
				if(f[mid]>=xx)rr=mid;
				else ll=mid;
			}
			ans+=tot-rr+1;
		}
		else
			f[++tot]=a[i].x;
	}
	cout<<ans<<endl;
	return 0;
}

标签:思维,17,训练,int,sum,mid,maxn,奶牛,mod
From: https://www.cnblogs.com/PenguinChen/p/17638163.html

相关文章

  • Visual Studio (VS)2017开发工具下载和安装教程
    MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品。是目前最流行的Windows平台应用程序的集成开发环境。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。软件获取: www.momorj.com/?......
  • 817考试总结
    暑假玩了三周太开心了。第一周去了桂林广西自驾游,去了千户苗寨漓江北屿银滩等地方;后两周回了老家巫溪,天天游泳,还和小表弟玩了几天,最后恋恋不舍的回重庆上课了。不扯远了来总结一下开学第一场考试 今天上午9:20何老板突然叫我们准备考试什么突击检查。一看试题,只有三道。......
  • 第十节 面向对象综合训练(拓展)
    练习一:​ 自行完成切换美女图片的功能。需求如下:需求详解:1,在功能选项中添加更换图片,在更换图片里面再添加美女,动物,运动。​代码中功能是JMenu,更换图片也是JMenu,美女,动物,运动是三个JMenuItem​代码如下://创建菜单并添加到界面当中//1.创建菜单JMenuBar的对象J......
  • ubuntu 18.04 git2.17.1升级 2.41
    默认安装版本一、添加git官方源sudoadd-apt-repositoryppa:git-core/ppa根据提示回车继续二、更新仓库包索引sudoaptupdate不更新,即便git官方有更新,你也搜索不到三、查看有什么软件可以更新aptlist--upgradable可以看到左边红箭头,显示是最新的git2.......
  • 【2023-08-17】工作思想
    20:00一个人的名字,早晚是要没有的,能把微薄的力量融进祖国的强盛之中,便足以自慰了。                                                 ——于敏昨天听到何太跟她同事相......
  • 笔记整理--C语言--数组指针和指针数组的区别 - hongcha_717 - 博客园——转载
    【转载】:原文http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html数组指针和指针数组的区别数组指针(也称行指针)定义int(*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个......
  • CentOS9中的Glibc2.17源码编译升级到Glibc2.31
    一、准备工作1、配置yum阿里镜像源查看yum当前配置的仓库,如果yum配置的不是阿里云源,请配置阿里云源。yumrepolistall验证是否能ping通阿里云#如果不能ping通可能是DNS没有配置pingmirrors.aliyun.com备份官方的原yum源配置mv/etc/yum.repos.d/CentOS-Base.r......
  • OpenCV3.2图像分割 实例4:GMM(高斯混合模型)样本数据训练与预言
    1#include<opencv2/opencv.hpp>2#include<iostream>34usingnamespacecv;5usingnamespacecv::ml;6usingnamespacestd;78intmain(intargc,char**argv){9Matimg=Mat::zeros(500,500,CV_8UC3);10RNGrng(123......
  • UVA11714 Blind Sorting 题解
    题目链接思路一道结论题,代码实现非常简单。把此题拆分成两个小问题。在最坏的情况下,需要几次询问,才能找出最大的数。在最坏的情况下,需要几次询问,才能找出次大数。对于找出最大的数,可以模拟二分查找来解决,每次将左边界右移或右边界左移,最终得到最大数。因此在最坏的情......
  • CF1769B1 Копирование файлов I 题解
    题目链接题目大意从小到大输出满足\(\frac{100\timesx}{a_i}=\frac{100\times(\sum_{j=1}^{i-1}a_j+x)}{\suma_j}\)时它们的值。思路看到数据范围\(n\leq100\),考虑暴力枚举传输每一个字节时的情况,判断\(a\)和\(b\)的值是否相等即可。对于答案,我们使用set来储......