B. Moamen and k-subarrays
codeforces737
題目是k是否大於等於將數列排序需要的最少的分塊
按照題目的意思的話就是當成pair或者結構體排序,只要排序後的個體的原來的位置是連續的就可以劃分為一個分塊
#include<stdio.h>
#include<algorithm>
#include<vector>
//#include<iostream>
//using namespace std;
//inline void tie0() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); }
using namespace std;
const int maxn=2e5+1;
typedef pair<int,int> p;
const int d=1e5;
const int mod=1e9+7;
int main()
{ // tie0();
int t;
scanf("%d",&t);
while(t--)
{ int n,k;
vector<pair<int,int> > v;
scanf("%d%d",&n,&k);
int res=1;
for(int i=1;i<=n;i++)
{ int x;
scanf("%d",&x);
v.push_back(p(x,i));
}
sort(v.begin(),v.end());
for(int i=1;i<n;i++)
{
if(v[i].second!=v[i-1].second+1)
res++;
}
//printf("res=%d\n",res);
if(k>=res)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
看錯題目了想複雜了,沒看到是distinct的數,看題太重要了,處理浪費了好多時間
有相同的元素,就用vector把相同陣列的下標存入,先在相同的陣列內進行查詢可不可以連貫的,後面的也要查
(ps:要是有反例的話,幫忙在評論裡指出,謝謝)
#include<stdio.h>
#include<algorithm>
#include<vector>
//#include<iostream>
//using namespace std;
//inline void tie0() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); }
using namespace std;
const int maxn=1e5+6;
const int d=1e5;
const int inf=1e9+5;
struct node
{
int pos;
int r;
}a[maxn];
int cmp(node q,node w)
{
return q.r<w.r;
}
int main()
{ // tie0();
int t;
scanf("%d",&t);
while(t--)
{ int n,k;
scanf("%d%d",&n,&k);
int res=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].r);
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
vector<int> p;
int fl=0;
for(int i=2;i<=n;i++)
{ if(a[i].r==a[i-1].r)
{ if(!fl)
p.push_back(a[i-1].pos),fl=1,res++;;
if(fl)
{p.push_back(a[i].pos);
}
p.push_back(a[i].pos);
}
else
{ fl=0;
int y=0;
if(!p.empty())
{ for(int j=0;j<p.size();j++)
{
vector<int>::iterator it=find(p.begin(),p.end(),p[j]-1);
if(it!=p.end())
{
y++;
}
else
{
vector<int>::iterator it=find(p.begin(),p.end(),p[j]+1);
if(it!=p.end())
{
y++;
}
else
continue;
}
}
res-=y/2;
vector<int>::iterator it=find(p.begin(),p.end(),a[i].pos-1);
if(it!=p.end())
p.clear();
else
{
if(a[i].pos==a[i-1].pos+1)
;
else
res++;
}
}
else
{
if(a[i].pos==a[i-1].pos+1)
;
else
res++;
}
}
}
//for(int i=1;i<=n;i++)
//printf("%d ",a[i].r);
//printf("\n");
//for(int i=1;i<=n;i++)
//printf("%d ",a[i].pos); printf("\n");
//printf("res=%d\n",res);
if(k>=res)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}