1. 程式人生 > 其它 >B. Moamen and k-subarrays

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;
}