Submission #994845


Source Code Expand

#include<iostream>
#include<vector>
#include<iomanip>
#include<algorithm>
#include<numeric>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
using ulong = unsigned long;
using ll = long long;
const int M = 1e9 + 7;
#pragma unused(M)

int main(){
    int n, m;
    cin >> n >> m;
    vector<pair<int, int>> vec;
    map<int, map<int, int>> nums;
    for(int i=0;i<n;i++){
        int x;
        cin >> x;
        vec.emplace_back(x % m, x);
        nums[x % m][x]++;
    }
    // sort(vec.begin(), vec.end());

    // int num = vec[1].second;
    // int num2 = lower_bound(vec.begin(), vec.end(), pair<int, int>{m - num, -1}) -> second;
    // cout<<num<<' '<<num2<<endl;
    // println(nums);
    int ans = 0;

    for(int i=0;i<m;i++){
        if(i == (m - i) % m){
            ans += nums[i].size() / 2;
        }else{
            if(i > (m - i) % m){ break; }
            if(!nums.count(i) || !nums.count((m - i) % m)){ continue; }
            auto& m1 = nums[i];
            auto& m2 = nums[(m - i) % m];
            int s1 = 0, s2 = 0;
            for(auto& p : m1){ s1 += p.second; }
            for(auto& p : m2){ s2 += p.second; }
            ans += min(s1, s2);
            if(s1 == s2){ continue; }
            if(s1 < s2){
                swap(s1, s2);
                swap(m1, m2);
            }
            if(s1 > s2){
                vector<int> v;
                for(auto& p : m1){ v.push_back(p.second); }
                sort(v.begin(), v.end());
                for(int& i : v){
                    int d = min(i, s2);
                    s2 -= d;
                    i -= d;
                }
                for(int& i : v){
                    ans += i / 2;
                }
            // }else{
            }
        }
    }
    cout << ans << endl;
    return 0;

    bool changed = true;
    while(changed){
        changed = false;
        for(int i=0;i<m;i++){
            if(!nums.count(i) || !nums.count((m - i) % m)){ continue; }

            auto p1 = nums[i].begin(), p2 = nums[(m - i) % m].begin();
            while(p1 != nums[i].end() && p1 -> second != 1){ p1++; }
            if(p1 == nums[i].end()){ continue; }
            int n1 = p1 -> first;
            while(p2 != nums[(m - i) % m].end() && (p2 -> second == 0 || n1 == p2 -> first)){ p2++; }
            if(p2 == nums[(m - i) % m].end()){ continue; }
            int n2 = p2 -> first;

            // cout<<n1<<' '<<n2<<endl;
            if(n1 != n2){
                nums[i][n1]--;
                nums[(m - i) % m][n2]--;
                // cout<<' '<<n1<<' '<<n2<<endl;
                ans++;
                changed = true;
                i--;
            }
        }
    }

    for(int i=0;i<m;i++){
        if(!nums.count(i) || !nums.count((m - i) % m)){ continue; }

        auto p1 = nums[i].begin(), p2 = nums[(m - i) % m].begin();
        while(p1 != nums[i].end() && p1 -> second == 0){ p1++; }
        if(p1 == nums[i].end()){ continue; }
        int n1 = p1 -> first;
        while(p2 != nums[(m - i) % m].end() && (p2 -> second == 0 || n1 == p2 -> first)){ p2++; }
        if(p2 == nums[(m - i) % m].end()){ continue; }
        int n2 = p2 -> first;

        // cout<<n1<<' '<<n2<<endl;
        if(n1 != n2){
            nums[i][n1]--;
            nums[(m - i) % m][n2]--;
            // cout<<' '<<n1<<' '<<n2<<endl;
            ans++;
            i--;
        }
    }

    for(int i=0;i<m;i++){
        if(!nums.count(i)){ continue; }
        for(auto& p : nums[i]){
            if(p.second >= 2){
                ans += p.second / 2;
            }
        }
    }
    cout << ans << endl;

    return 0;
}

Submission Info

Submission Time
Task D - Pair Cards
User sumoooru
Language C++14 (Clang 3.8.0)
Score 0
Code Size 3782 Byte
Status WA
Exec Time 150 ms
Memory 13556 KB

Judge Result

Set Name sample all
Score / Max Score 0 / 0 0 / 700
Status
AC × 2
AC × 13
WA × 19
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 9 ms 888 KB
01-02.txt WA 110 ms 3956 KB
01-03.txt WA 111 ms 3956 KB
01-04.txt WA 112 ms 4212 KB
01-05.txt WA 111 ms 4084 KB
01-06.txt WA 112 ms 4084 KB
01-07.txt WA 113 ms 4084 KB
01-08.txt WA 113 ms 4084 KB
01-09.txt WA 117 ms 4212 KB
01-10.txt WA 126 ms 6900 KB
01-11.txt WA 132 ms 8948 KB
01-12.txt WA 80 ms 1400 KB
01-13.txt WA 81 ms 1400 KB
01-14.txt AC 119 ms 5748 KB
01-15.txt AC 120 ms 5748 KB
01-16.txt AC 120 ms 5748 KB
01-17.txt AC 121 ms 5748 KB
01-18.txt AC 120 ms 6004 KB
01-19.txt AC 121 ms 6644 KB
01-20.txt AC 150 ms 13556 KB
01-21.txt WA 92 ms 1528 KB
01-22.txt WA 92 ms 1528 KB
01-23.txt WA 91 ms 1528 KB
01-24.txt WA 94 ms 1528 KB
01-25.txt WA 95 ms 1784 KB
01-26.txt WA 95 ms 1784 KB
01-27.txt AC 71 ms 6904 KB
01-28.txt WA 8 ms 640 KB
01-29.txt AC 4 ms 384 KB
01-30.txt AC 3 ms 256 KB
sample-01.txt AC 3 ms 256 KB
sample-02.txt AC 3 ms 256 KB