Codeforces Round #804 (Div. 2)

https://codeforces.com/contest/1699/problem

我好困啊……

上一次cf还是在上一次(印象中班主任上课我打题解)

差点就只过一题了,爬了现在div2都干不动了吗

迷迷糊糊的想题想到现在

A:给n,选仨数,使得a^b+b^c+c^a=n。在二进制下,最后一位只能是0or1,且最后一位的结果决定了奇偶性,因此我们枚举了一下最后一位的情况(111,110,100,000)发现最后一位必然是偶数。此时令a和b都是1,c就是(n/2)^1

B:我靠有笨蛋看了一小时才看见了偶数。构造一个n*m的二进制矩阵,使得每个数周围有且只有2个与其不同的数。你看那个样例1and2,啊那个形状就非常的妙啊是不是,最小单位就是2,就把样例2翻转填充就好啦。

例:6*4

0 1 1 0 0 1

1 0 0 1 1 0

1 0 0 1 1 0

0 1 1 0 0 1

C:脑子离家出走,看了好久才看懂题目,and不知道为什么以为是单调栈

题目:给定一个元素为0到n-1的长度为n的序列a,求符合要求的序列b种类

要求:任意一个区间l-r,al到ar的mex(区间中不出现的最小自然数)和bl到br的mex相同

题解:从0开始考虑,因为mex{0}=1,所以0的位置是不能改变的

接下来是1,设0在1的前面(设0到1的区间为(x,y)),因此选定一个区间(l,r),当这个区间中包含了0和1(l<=x<y<=r),mex最小为2,除此之外的其他区间mex最大为1,符合这个条件的1也只有一种情况(位置不动)

然后是2,2的话有两种情况,设2的位置为pos,第一种情况下pos<x or pos>y 可以类比1的情况,得出2的位置唯一解。第二种情况是x<pos<y,区间(l,r)在l<=x<y<=r时mex最小为3,除此之外最大为2,3可以出现在区间(x,y)中任意一个原本没数字的位置,ans*=(r-l-i+1)。

后面同理。

ll n,m;
ll a[N];
ll f[N]; 
int main()
{
	int _;
	_=read();
	while(_--)
	{
		n=read();
		for(int i=1;i<=n;i++)
		{
			a[i]=read();
			f[a[i]]=i; 
		}
		ll l=f[0],r=f[0],ans=1;
		for(int i=1;i<n;i++)
		{
			if(f[i]<l)l=f[i];
			else if(f[i]>r) r=f[i];
			else	ans*=(r-l-i+1);
			ans=ans%mod;
		}
		printf("%d\n",ans);
	}
 } 

D:给一个序列,每次可以删除相邻两个不相同的数字,求最后能构成的最长的相同数字的序列。

首先判断一个区间是否能被完全删除:1、区间长度是否为偶数2、区间所有数字出现次数是否过半

设函数f[i]为从1-i的最长的以a[i]结尾的符合结果的序列,令a[j]=a[i],此时判断他们之间的序列是否能被完全删除,可以的话就进行更新。

最后找到f的最大值。

回头再写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值