首页 > 代码库 > NOJ 1072 The longest same color grid(尺取)

NOJ 1072 The longest same color grid(尺取)

Problem 1072: The longest same color grid

 

Time Limits:  1000 MS   Memory Limits:  65536 KB

64-bit interger IO format:  %lld   Java class name:  Main

 

Description

There are n grid, m kind of color. Grid number 1 to N, color number 1 to M. 
The color of each grid is painted in one of the m colors. Now let you remove the Grid does not exceed K, get a new sequence.
Ask you the same color and continuous length of the grid sequence is the length of the number?

Input

The first line of input T, T group data. (T <= 20)
The next line of input three numbers n, m and k. (1 < n, m,k <= 10^5)
The next line of input n number, indicating that the color of each grid. (1 <= a[i] <= m)

Output

For each group of data output the same color and continuous grid sequence length.

Sample Input

110 2 21 2 1 2 1 1 2 1 1 2

Output for Sample Input

5

Hint

For example we can delete the fourth position and the seventh position

 

 

题意:给你一个连续的数字染色序列,你最多可以去掉k个格子使得某些格子变成连续的,比如样例的去掉第二和第四个格子,中间的便有5个1是连续的……

学长出的题,刚看到真的是跪了,1e5的范围知道肯定不能两个for去暴力,想过尺取法,然而只是在原序列上进行尺取,这样并不知道到底删除[L,R]中哪几个点才能得到最大的连续长度。

后来学长说是用vector数组记录每一种颜色所出现的下标,对每一种颜色的vector进行尺取,若设左右游标为L、R,则区间内的元素下标就是 $vector[color][Li……Ri]$,区间总长度(闭区间)为 $vector[color][R]-vector[color][L]+1$,所删除的块为记为 $cnt$个,则可获得 $vector[color][R]-vector[color][L]+1-cnt$,依次对每一个颜色的vector进行尺取更新答案即可

代码:

#include <stdio.h>#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define CLR(arr,val) memset(arr,val,sizeof(arr))#define LC(x) (x<<1)#define RC(x) ((x<<1)+1)#define MID(x,y) ((x+y)>>1)typedef pair<int,int> pii;typedef long long LL;const double PI=acos(-1.0);const int N=1e5+7;int arr[N];vector<int>vec[N];void init(int m){    for (int i=0; i<=m; ++i)//这里写成 <m 又让我WA了一次,苦逼        vec[i].clear();}int main(void){    int tcase,n,m,k,i,color;    scanf("%d",&tcase);    while (tcase--)    {        scanf("%d%d%d",&n,&m,&k);        init(m);        for (i=1; i<=n; ++i)        {            scanf("%d",&color);            vec[color].push_back(i-1);            //printf("%d<-%d\n",color,i-1);        }        int ans=1;        for (i=1; i<=m; ++i)        {            if(vec[i].empty())                continue;            int L=0,R=0;            int cnt=0;            int SZ=vec[i].size();            while (L<SZ)            {                while (R<SZ)                {                    ++R;                    if(R>=SZ)                    {                        --R;                        break;                    }                    //printf("[%d %d]\n",vec[i][R-1],vec[i][R]);                    cnt=cnt+vec[i][R]-vec[i][R-1]-1;                    if(cnt>k)                    {                        cnt=cnt-(vec[i][R]-vec[i][R-1]-1);                        --R;                        break;                    }                }                int now=vec[i][R]-vec[i][L]-cnt+1;                if(now>ans)                    ans=now;                ++L;                if(L>=SZ)                    break;                else                    cnt=cnt-(vec[i][L]-vec[i][L-1]-1);            }        }        printf("%d\n",ans);    }    return 0;}

NOJ 1072 The longest same color grid(尺取)