Codeforces Round #839 (Div. 3)

A~C

太简单,不放了。

D. Absolute Sorting

D. Absolute Sorting

思路

解法:一种做法是每次比较相邻的两个值,每一对都能对所求产生一个范围,取所有范围的交集即可。

初始范围 [ l , r ] [l,r] [l,r] [ − i n f , i n f ] [-inf,inf] [inf,inf];

a [ i − 1 ] < a [ i ] a[i-1]<a[i] a[i1]<a[i]时,由绝对值不等式画出图像,依据图像得左边界 x x x − i n f -inf inf, 右边界 y y y ⌊ a [ i − 1 ] + a [ i ] 2 ⌋ ⌊\frac{a[i-1]+a[i]}{2}⌋ 2a[i1]+a[i];

a [ i − 1 ] > a [ i ] a[i-1]>a[i] a[i1]>a[i]时,由绝对值不等式画出图像,依据图像得左边界 y y y ⌈ a [ i − 1 ] + a [ i ] 2 ⌉ ⌈\frac{a[i-1]+a[i]}{2}⌉ 2a[i1]+a[i], 右边界为 i n f inf inf;

每次 l = m a x ( l , x ) l=max(l,x) l=max(l,x) r = m i n ( r , y ) r=min(r,y) r=min(r,y)即可。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e5+5;
const ll inf=1e9;
ll t,n,m,x,y,k;
ll a[maxn];
int main()
{
	cin>>t;
	while(t--){
		cin>>n;
		for(ll i=1;i<=n;i++)cin>>a[i];
		ll x=-inf,y=inf;
		ll l=-inf,r=inf;
		for(ll i=2;i<=n;i++){
			if(a[i-1]<a[i])y=(a[i-1]+a[i])/2;
			else if(a[i-1]>a[i])x=ceil((a[i-1]+a[i])*1.0/2);
			l=max(l,x),r=min(r,y);
		}
		if(l>r)cout<<-1<<endl;
		else if(r>=0&&r<=1e9)cout<<r<<endl;
	}
	return 0;
}

反思

没想到这题这么简单,就是朴素地对每两个相邻的数求范围,然后全部取交集。真不知道自己为什么这么笨。

E. Permutation Game

E. Permutation Game

思路

c n t 1 cnt1 cnt1 p [ i ] = i p[i]=i p[i]=i的个数,显然 c n t 1 cnt1 cnt1是先手不需要进行染色的个数, c n t 2 cnt2 cnt2 p [ i ] = n − i + 1 p[i]=n-i+1 p[i]=ni+1的个数,即后手不需要进行染色的个数,记 c n t cnt cnt为两种情况都不是的个数。

先手需要染的个数为 c n t 2 + c n t cnt2+cnt cnt2+cnt,而且一定优先染 c n t 2 cnt2 cnt2;

后手需要染的个数为 c n t 1 + c n t cnt1+cnt cnt1+cnt,而且一定优先染 c n t 1 cnt1 cnt1;

1.如果 c n t 2 + c n t ≤ c n t 1 cnt2+cnt≤cnt1 cnt2+cntcnt1,此时先手一定能在后手染完前染完,先手必胜;

2.如果 c n t 1 + c n t < c n t 2 cnt1+cnt<cnt2 cnt1+cntcnt2,此时后手必胜,没有等号的原因是先后手原因;

3.否则,最后 c n t 1 cnt1 cnt1 c n t 2 cnt2 cnt2一定都被染完,只剩下 c n t cnt cnt中的一个,先后手肯定都不会染色,否则染完之后,对手就会重排使得自己获胜,故此时平局。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=5e5+5;
ll t,n,m,x,y,k;
ll p[maxn];
int main()
{
	cin>>t;
	while(t--){
		cin>>n;
		for(ll i=1;i<=n;i++)cin>>p[i];
		ll cnt1=0,cnt2=0;
		for(ll i=1;i<=n;i++){
			if(p[i]==i)cnt1++;
			else if(p[i]==n-i+1)cnt2++;
		}
		ll cnt=n-cnt1-cnt2;
		if(cnt2+cnt<=cnt1)cout<<"First"<<endl;
		else if(cnt1+cnt<cnt2)cout<<"Second"<<endl;
		else cout<<"Tie"<<endl;
	}
	return 0;
}

反思

心态崩了,真的崩了,原来真的是if-else就能出来,为什么我考试的时候想不到,好气啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keguaiguai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值