Submission #993030


Source Code Expand

//1時間経過しました(大嘘)。嘘解法をお伝えします。
//貪欲に「Mの倍数」ペアを作って, 残った数であれする。
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
using namespace std;

int n, m;
int x[100000];
int cnt[100001];		//mod Mして値をカウント
int used[100001];		//mod Mして値をカウント -> Mの倍数ペアを作る -> いくつ使ったか?

void input() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> x[i];
		cnt[x[i] % m]++;
	}
}

//usedを使って, 同じ数で作る
int unko() {
	typedef pair<int, int> P;
	
	static int k_cnt[100000] = {0};	//k_cnt[i] = Mで割ってi余る要素のうち, 奇数個のものの個数
	map<int, int> m_cnt;
	
	for (int i = 0; i < n; i++) {
		if (m_cnt.find(x[i]) == m_cnt.end()) {
			m_cnt[x[i]] = 0;
		}
		m_cnt[x[i]]++;
	}
	
	for (map<int, int>::iterator it = m_cnt.begin(); it != m_cnt.end(); it++) {
		int val = (*it).first;
		int cnt = (*it).second;
		if (cnt % 2 == 1) k_cnt[val % m]++;
	}
	
	static int loss[100000] = {0};		//loss[i] = 奇数で残ってしまう整数の個数
	for (int i = 0; i < m; i++) {
		if (k_cnt[i] >= used[i]) {
			loss[i] = k_cnt[i] - used[i];
		}
		else {
			loss[i] = (used[i] - k_cnt[i]) % 2;
		}
	}
	
	int ret = 0;
	for (int i = 0; i < m; i++) {
		ret += (cnt[i] - loss[i]) / 2;
	}
	return ret;
}

signed main() {
	input();
	
	int ans = 0;
	for (int i = 0; i < m; i++) {
		int p = m - i;
		if (i == 0) p = 0;
		
		if (i == 0 || i == p) {
			int plus = cnt[i] / 2;
			ans += plus;
			cnt[i] -= 2 * plus;
			used[i] += 2 * plus;
		}
		else {
			int plus = min(cnt[i], cnt[p]);
			ans += plus;
			cnt[i] -= plus;
			cnt[p] -= plus;
			used[i] += plus;
			used[p] += plus;
		}
	}
	
	ans += unko();
	
	cout << ans << endl;
	return 0;
}

Submission Info

Submission Time
Task D - Pair Cards
User startcpp
Language C++14 (GCC 5.4.1)
Score 700
Code Size 2089 Byte
Status AC
Exec Time 83 ms
Memory 6912 KB

Judge Result

Set Name sample all
Score / Max Score 0 / 0 700 / 700
Status
AC × 2
AC × 32
Set Name Test Cases
sample sample-01.txt, sample-02.txt
all sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt
Case Name Status Exec Time Memory
01-01.txt AC 2 ms 256 KB
01-02.txt AC 70 ms 3584 KB
01-03.txt AC 71 ms 3584 KB
01-04.txt AC 71 ms 3584 KB
01-05.txt AC 71 ms 3584 KB
01-06.txt AC 70 ms 3584 KB
01-07.txt AC 71 ms 3584 KB
01-08.txt AC 71 ms 3584 KB
01-09.txt AC 71 ms 3584 KB
01-10.txt AC 72 ms 4224 KB
01-11.txt AC 73 ms 5120 KB
01-12.txt AC 31 ms 640 KB
01-13.txt AC 32 ms 1152 KB
01-14.txt AC 81 ms 5376 KB
01-15.txt AC 82 ms 5376 KB
01-16.txt AC 81 ms 5376 KB
01-17.txt AC 82 ms 5376 KB
01-18.txt AC 81 ms 5376 KB
01-19.txt AC 82 ms 5504 KB
01-20.txt AC 83 ms 6912 KB
01-21.txt AC 44 ms 768 KB
01-22.txt AC 46 ms 768 KB
01-23.txt AC 44 ms 768 KB
01-24.txt AC 44 ms 896 KB
01-25.txt AC 45 ms 1280 KB
01-26.txt AC 47 ms 2432 KB
01-27.txt AC 42 ms 4096 KB
01-28.txt AC 6 ms 1920 KB
01-29.txt AC 4 ms 896 KB
01-30.txt AC 4 ms 1408 KB
sample-01.txt AC 3 ms 256 KB
sample-02.txt AC 3 ms 256 KB