1083.等しい差があるかどうか(20)


1083.等しい差(20)時間制限400 msメモリ制限65536 kBコード長制限8000 B判定プログラムStandard作成者CHEN,Yee
N枚のカードを与え、表に1、2、…、Nをそれぞれ书き、それを全部裏返し、カードを洗い、裏に1、2、…、Nをそれぞれ书く.各カードの正反対両面の数字を減算(大きく減少)し、N個の非負の差を得ますが、その中に等しい差がありますか?入力フォーマット:1行目に正の整数N(2<=N<=10000)を入力し、1行目に1~Nのトランプ後の配列を与え、i番目の数はiが正面に書かれたカードの裏面の数字を表す.≪出力フォーマット|Output Format|oem_src≫:「≪差分繰返し回数|Difference Repeat Number|oem_src≫」のフォーマットに従って、行ごとに1つの結果を出力します.入力サンプル:8 3 5 8 6 2 1 4 7出力サンプル:5 2 3 2 2
可能ピット:問題の中で出力する必要があるのは繰り返しカウントがあり、一度だけ現れた場合、出力する必要はありません.
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
using namespace std;
const int Maxn = 10010;
struct info {
    int val;
    int cnt;
};

info record[Maxn];

int main() {
#ifdef _DEBUG
    freopen("data.txt", "r", stdin);
#endif // _DEBUG
    int n; cin >> n;
    for (int i = 1; i <= n; ++i) {
        int data; cin >> data;
        int val = abs(data - i);
        record[val].val = val;
        ++record[val].cnt;
    }
    sort(record, record + Maxn, [](info a, info b) {if (a.val != b.val) return a.val > b.val; return a.cnt > b.cnt; });
    for (int i = 0; record[i].cnt; ++i) {
        if (record[i].cnt > 1 ) cout << record[i].val << " " << record[i].cnt << endl;
    }
    return 0;
}