无标题文章

# Codeforces Round #615 (Div. 3)

标签(空格分隔): ACM

---

# D. MEX maximizing

## Description:

Recall that MEX of an array is a minimum non-negative integer that does not belong to the array. Examples:

  for the array $[0, 0, 1, 0, 2]$ MEX equals to $3$ because numbers $0, 1$ and $2$ are presented in the array and $3$ is the minimum non-negative integer not presented in the array;  for the array $[1, 2, 3, 4]$ MEX equals to $0$ because $0$ is the minimum non-negative integer not presented in the array;  for the array $[0, 1, 4, 3]$ MEX equals to $2$ because $2$ is the minimum non-negative integer not presented in the array. You are given an empty array $a=[]$ (in other words, a zero-length array). You are also given a positive integer $x$.

You are also given $q$ queries. The $j$-th query consists of one integer $y_j$ and means that you have to append one element $y_j$ to the array. The array length increases by $1$ after a query.

In one move, you can choose any index $i$ and set $a_i := a_i + x$ or $a_i := a_i - x$ (i.e. increase or decrease any element of the array by $x$). The only restriction is that $a_i$ cannot become negative. Since initially the array is empty, you can perform moves only after the first query.

You have to maximize the MEX (minimum excluded) of the array if you can perform any number of such operations (you can even perform the operation multiple times with one element).

You have to find the answer after each of $q$ queries (i.e. the $j$-th answer corresponds to the array of length $j$).

Operations are discarded before each query. I.e. the array $a$ after the $j$-th query equals to $[y_1, y_2, \dots, y_j]$.

## Input:

The first line of the input contains two integers $q, x$ ($1 \le q, x \le 4 \cdot 10^5$) — the number of queries and the value of $x$.

The next $q$ lines describe queries. The $j$-th query consists of one integer $y_j$ ($0 \le y_j \le 10^9$) and means that you have to append one element $y_j$ to the array.

## Output

Print the answer to the initial problem after each query — for the query $j$ print the maximum value of MEX after first $j$ queries. Note that queries are dependent (the array changes after each query) but operations are independent between queries.

## Sample Input:

7 3

0

1

2

2

0

0

10

## Sample Output:

1

2

3

3

4

4

7

## Sample Input:

4 3

1

2

1

2

## Sample Output:

0

0

0

0

####题解

本题看着比较复杂,看起来比较像模拟题,其实是一道数学题,仔细理解题意,可以看出,将序列中的每一个元素对x取模可以得到0-x-1的数(记为M序列),所以MEX取决于M序列的个数和多余出来的那部分数,我们只需要对每次读取的数字进行更新和维护,记录此时M序列的个数和多出来的那部分数,此时M序列的个数应该为M序列中最少数量的那个元素的个数,此时这个元素必定已经用完,所以在新多出来的序列中这个元素必然缺少,所以这个元素就是多出来序列的MEX,更新ans=s.begin()->first * x+s.begin()->second,本题使用的set相关知识应该掌握。

代码1:

```C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int q,x;

    scanf("%d %d",&q,&x);

    vector<int> v(x);

    //set<pair<int, int> > vals;

    set<pair<int, int> > s;

    for(int i=0;i<x;i++)

    {

        s.insert(make_pair(v[i],i));

    }

    for(int i=0;i<q;i++)

    {

        int cus;

        scanf("%d",&cus);

        cus%=x;

        s.erase(make_pair(v[cus], cus));

        v[cus]++;

        s.insert(make_pair(v[cus],cus));

        //cout << s.begin()->first * x + s.begin()->second << endl;

        printf("%d\n",s.begin()->first * x+s.begin()->second);

    }

    return 0;

}

```

代码2:

```C++

#include <bits/stdc++.h>

using namespace std;

const int maxn=400005;

int cnt[maxn];

int main()

{

    int q,x;

    scanf("%d %d",&q,&x);

    int ans=0;

    int j=0;

    for(int i=0;i<q;i++)

    {

        int cur;

        scanf("%d",&cur);

        cnt[cur%x]++;

        while(true)

        {

            if(cnt[j]>0)

            {

                cnt[j]--;

                ans++;

                j=(j+1)%x;

            }

            else

                break;

        }

        printf("%d\n",ans);

    }

    //cout << "Hello world!" << endl;

    return 0;

}

```

### [题目链接](https://codeforces.com/contest/1294/problem/D)

# E. Obtain a Permutation

## Description:

You are given a rectangular matrix of size $n \times m$ consisting of integers from $1$ to $2 \cdot 10^5$.

In one move, you can:

  choose any element of the matrix and change its value to any integer between $1$ and $n \cdot m$, inclusive;  take any column and shift it one cell up cyclically (see the example of such cyclic shift below). A cyclic shift is an operation such that you choose some $j$ ($1 \le j \le m$) and set $a_{1, j} := a_{2, j}, a_{2, j} := a_{3, j}, \dots, a_{n, j} := a_{1, j}$ simultaneously.

  Example of cyclic shift of the first column You want to perform the minimum number of moves to make this matrix look like this:

  In other words, the goal is to obtain the matrix, where $a_{1, 1} = 1, a_{1, 2} = 2, \dots, a_{1, m} = m, a_{2, 1} = m + 1, a_{2, 2} = m + 2, \dots, a_{n, m} = n \cdot m$ (i.e. $a_{i, j} = (i - 1) \cdot m + j$) with the minimum number of moves performed.

## Input:

The first line of the input contains two integers $n$ and $m$ ($1 \le n, m \le 2 \cdot 10^5, n \cdot m \le 2 \cdot 10^5$) — the size of the matrix.

The next $n$ lines contain $m$ integers each. The number at the line $i$ and position $j$ is $a_{i, j}$ ($1 \le a_{i, j} \le 2 \cdot 10^5$).

## Output

Print one integer — the minimum number of moves required to obtain the matrix, where $a_{1, 1} = 1, a_{1, 2} = 2, \dots, a_{1, m} = m, a_{2, 1} = m + 1, a_{2, 2} = m + 2, \dots, a_{n, m} = n \cdot m$ ($a_{i, j} = (i - 1)m + j$).

## Sample Input:

3 3

3 2 1

1 2 3

4 5 6

## Sample Output:

6

## Sample Input:

4 3

1 2 3

4 5 6

7 8 9

10 11 12

## Sample Output:

0

## Sample Input:

3 4

1 6 3 4

5 10 7 8

9 2 11 12

## Sample Output:

2

### [题目链接](https://codeforces.com/contest/1294/problem/E)

###题解

首先将问题分解,要使整个矩阵满足要求,我们使矩阵的每一列满足要求即可,下面求解每一列对应的最少步数,我们需要保证结果的正确行所以每一列的所有元素都要考虑,以第一列为例子,我们用cnt数组表示每个循环移位计算不用替换的元素个数,所以每进行一次移位我们需要的操作次数为n-cnt[i]+i,记为cur,我们只需要找到每一列cur的最小值并把它累加到ans上就可以求解这个问题。

AC代码:

```C++

#include <bits/stdc++.h>

using namespace std;

const int maxn=200001;

//int mp[maxn][maxn];

//int cnt[maxn];

int main()

{

    int n,m;

    scanf("%d %d",&n,&m);

    vector<vector<int> > mp(n, vector<int>(m));

    for(int i=0;i<n;i++)

    {

        for(int j=0;j<m;j++)

        {

            scanf("%d",&mp[i][j]);

            mp[i][j]--;

        }

    }

    long long ans=0;

    for(int j=0;j<m;j++)

    {

        vector<int> cnt(n);

        //memset(cnt,0,sizeof(cnt));

        for(int i=0;i<n;i++)

        {

            if(mp[i][j] % m == j)

            {

                int pos = mp[i][j] / m;

                if(pos<n)

                {

                    cnt[(i-pos+n)%n]++;

                }

            }

        }

        int cur = n-cnt[0];

        for(int i=1; i<n; i++)

        {

            cur = min(cur, n - cnt[i] + i);

        }

        ans+=cur;

    }

    printf("%lld\n",ans);

    //cout << "Hello world!" << endl;

    return 0;

}

```

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容