CF-1350 D. Orac and Medians 思维
Posted valk3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF-1350 D. Orac and Medians 思维相关的知识,希望对你有一定的参考价值。
Orac and Medians
题意
给出一个长度为n的数组a,以及数字k,在一次操作中可以选择一个区间([l,r]),
把这个区间里所有的数字变成其中位数,数组a的中位数是排好序之后的(a[frac{n+1}{2}])。
问是否可以通过有限次操作,把整个区间变成k
思路
我的理解:
把a中小于k的看做0,等于k的看做1,大于k的看做2,
现在的目标就是n个数字变成1。
-
a中没有1,输出no,很显然
-
a中存在至少两个连续的1,肯定可以:每次操作把全是1的一个区间,
向左或者右扩展一个作为操作区间,新的区间全变成1,依次操作最后n个数字就全为1了。
-
如果a中最多只有连续的一个1:
-
这时如果存在一个1和2相邻:
第一次选择12两个数字,就产生了连续的两个1,和第二种情况相同,可以
-
如果所有的1都和0相邻的:
- 如果存在102这种情况,第一次选择102,这样就得到了111,转为情况2,可以
- 如果存在22或者202,类似于情况2,向左右扩展变成2,就可以让1的相邻位置产生2,变成情况3的第一种,可以
-
其他情况无法得到连续的两个1,不可以
-
综上所述,只要存在k,并且存在两个相差小于等于2的位置上的数字大于等于k就可以。
特判n==1
代码
/*Gts2m ranks first in the world*/
#define pb push_back
#define stop system("pause")
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<string>
#include<algorithm>
#include<iostream>
// #include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;
int arr[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d",&arr[i]);
int flag=0;
for(int i=1;i<=n;i++)
{
if(arr[i]==k)
flag=1;
}
if(flag==0)
{
printf("no
");
continue;
}
flag=0;
for(int i=1;i<n;i++)
{
if(arr[i]>=k)
{
if(arr[i+1]>=k) flag=1;
if(i+2<=n&&arr[i+2]>=k) flag=1;
}
}
if(n==1) flag=1;
if(flag) printf("yes
");
else printf("no
");
}
return 0;
}
以上是关于CF-1350 D. Orac and Medians 思维的主要内容,如果未能解决你的问题,请参考以下文章
CF1350E Orac and Game of Life(BFS)
Codeforces Round #641 (Div. 2) D. Orac and Medians (贪心)
Codeforces Round #641 (Div. 2)D. Orac and Medians