無標題文章

# 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

####題解

本題看著比較復雜登舞,看起來比較像模擬題,其實是一道數(shù)學題萝究,仔細理解題意,可以看出驯妄,將序列中的每一個元素對x取模可以得到0-x-1的數(shù)(記為M序列)合砂,所以MEX取決于M序列的個數(shù)和多余出來的那部分數(shù)青扔,我們只需要對每次讀取的數(shù)字進行更新和維護,記錄此時M序列的個數(shù)和多出來的那部分數(shù)翩伪,此時M序列的個數(shù)應該為M序列中最少數(shù)量的那個元素的個數(shù)微猖,此時這個元素必定已經(jīng)用完,所以在新多出來的序列中這個元素必然缺少缘屹,所以這個元素就是多出來序列的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)

###題解

首先將問題分解囊颅,要使整個矩陣滿足要求,我們使矩陣的每一列滿足要求即可傅瞻,下面求解每一列對應的最少步數(shù)踢代,我們需要保證結果的正確行所以每一列的所有元素都要考慮,以第一列為例子嗅骄,我們用cnt數(shù)組表示每個循環(huán)移位計算不用替換的元素個數(shù)胳挎,所以每進行一次移位我們需要的操作次數(shù)為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;

}

```

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屏积,隨后出現(xiàn)的幾起案子医窿,更是在濱河造成了極大的恐慌,老刑警劉巖炊林,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姥卢,死亡現(xiàn)場離奇詭異,居然都是意外死亡渣聚,警方通過查閱死者的電腦和手機独榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕枝,“玉大人棺榔,你說我怎么就攤上這事“溃” “怎么了症歇?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵郎笆,是天一觀的道長。 經(jīng)常有香客問我当船,道長题画,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任德频,我火速辦了婚禮苍息,結果婚禮上,老公的妹妹穿的比我還像新娘壹置。我一直安慰自己竞思,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布钞护。 她就那樣靜靜地躺著盖喷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪难咕。 梳的紋絲不亂的頭發(fā)上课梳,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音余佃,去河邊找鬼暮刃。 笑死,一個胖子當著我的面吹牛爆土,可吹牛的內(nèi)容都是我干的椭懊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼步势,長吁一口氣:“原來是場噩夢啊……” “哼氧猬!你這毒婦竟也來了?” 一聲冷哼從身側響起坏瘩,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤盅抚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桑腮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泉哈,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年破讨,在試婚紗的時候發(fā)現(xiàn)自己被綠了丛晦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡提陶,死狀恐怖烫沙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙笆,我是刑警寧澤锌蓄,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布升筏,位于F島的核電站,受9級特大地震影響瘸爽,放射性物質(zhì)發(fā)生泄漏您访。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一剪决、第九天 我趴在偏房一處隱蔽的房頂上張望灵汪。 院中可真熱鬧,春花似錦柑潦、人聲如沸享言。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽览露。三九已至,卻和暖如春譬胎,著一層夾襖步出監(jiān)牢的瞬間差牛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工堰乔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留多糠,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓浩考,卻偏偏與公主長得像,于是被迫代替她去往敵國和親被盈。 傳聞我的和親對象是個殘疾皇子析孽,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容