Submission #1444842


Source Code Expand

#pragma region include
#include <iostream>
#include <iomanip>
#include <stdio.h>

#include <sstream>
#include <algorithm>
#include <cmath>
#include <complex>

#include <string>
#include <cstring>
#include <vector>
#include <tuple>
#include <bitset>

#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>

#include <fstream>
#include <random>
//#include <time.h>
#include <ctime>
#pragma endregion //#include
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion //typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9+7;
const LL LINF = (LL)1e18+20;
const double PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace::std;

void solve(){
	int N,M;
	cin >> N >> M;
	
	vector< map<int,int> > num(M);
	map<int,int> amaSum;
	int X;
	for(int i=0;i<N;++i){
		cin >> X;
		num[X%M][X]++;
		amaSum[X%M]++;
	}

	int ans = 0;
	map<int,int>::iterator itr,end;

	for(int i=0;i<M;++i){
		int ter = M-i;
		if( ter < i ) break;

		if( i == 0 ){
			ans += amaSum[0]/2;
		}else if(i == ter){
			int A = amaSum[i];
			ans += A/2;
		}else{
			int A = amaSum[i];
			int B = amaSum[ter];
			if( A > B ){
				int nokori = A-B;
				ans += B;
				itr = num[i].begin();
				end = num[i].end();
				for(;itr!=end && nokori;++itr){
					int sub = (itr->second)/2;
					int res = ( min(nokori,sub*2) ) /2 ;
					ans += res;
					nokori -= res*2;
				}
			}else if( B > A ){
				//A > Bと同等の処理
				int nokori = B-A;
				ans += A;
				itr = num[ter].begin();
				end = num[ter].end();
				for(;itr!=end && nokori;++itr){
					int sub = (itr->second)/2;
					int res = ( min(nokori,sub*2) ) /2 ;
					ans += res;
					nokori -= res*2;
				}
			}else{//A==B
				ans += A;
			}
		}
	}
	cout << ans << endl;
}

#pragma region main
signed main(void){
	std::cin.tie(0);
	std::ios::sync_with_stdio(false);
	std::cout << std::fixed;//小数を10進数表示
	cout << setprecision(16);//小数点以下の桁数を指定//coutとcerrで別	

	solve();
}
#pragma endregion //main()

Submission Info

Submission Time
Task D - Pair Cards
User akarin55
Language C++14 (GCC 5.4.1)
Score 700
Code Size 2301 Byte
Status AC
Exec Time 65 ms
Memory 14336 KB

Judge Result

Set Name sample all
Score / Max Score 0 / 0 700 / 700
Status
AC × 2
AC × 34
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, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01-01.txt AC 1 ms 256 KB
01-02.txt AC 36 ms 3200 KB
01-03.txt AC 36 ms 3200 KB
01-04.txt AC 36 ms 3200 KB
01-05.txt AC 36 ms 3200 KB
01-06.txt AC 36 ms 3200 KB
01-07.txt AC 36 ms 3200 KB
01-08.txt AC 37 ms 3328 KB
01-09.txt AC 39 ms 3456 KB
01-10.txt AC 46 ms 7040 KB
01-11.txt AC 58 ms 12544 KB
01-12.txt AC 9 ms 256 KB
01-13.txt AC 19 ms 4352 KB
01-14.txt AC 42 ms 4992 KB
01-15.txt AC 42 ms 4992 KB
01-16.txt AC 43 ms 4992 KB
01-17.txt AC 43 ms 4992 KB
01-18.txt AC 44 ms 5248 KB
01-19.txt AC 45 ms 6144 KB
01-20.txt AC 65 ms 14336 KB
01-21.txt AC 19 ms 384 KB
01-22.txt AC 19 ms 384 KB
01-23.txt AC 19 ms 512 KB
01-24.txt AC 19 ms 512 KB
01-25.txt AC 25 ms 3328 KB
01-26.txt AC 37 ms 9856 KB
01-27.txt AC 46 ms 12032 KB
01-28.txt AC 20 ms 9856 KB
01-29.txt AC 8 ms 3968 KB
01-30.txt AC 22 ms 9600 KB
sample-01.txt AC 1 ms 256 KB
sample-02.txt AC 1 ms 256 KB