A~C
太简单,不放了。
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[i−1]<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[i−1]+a[i]⌋;
当 a [ i − 1 ] > a [ i ] a[i-1]>a[i] a[i−1]>a[i]时,由绝对值不等式画出图像,依据图像得左边界 y y y为 ⌈ a [ i − 1 ] + a [ i ] 2 ⌉ ⌈\frac{a[i-1]+a[i]}{2}⌉ ⌈2a[i−1]+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
思路
记 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]=n−i+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+cnt≤cnt1,此时先手一定能在后手染完前染完,先手必胜;
2.如果 c n t 1 + c n t < c n t 2 cnt1+cnt<cnt2 cnt1+cnt<cnt2,此时后手必胜,没有等号的原因是先后手原因;
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就能出来,为什么我考试的时候想不到,好气啊!