algorithm

935 div2 C. Manhattan Permutations

rkawk 2024. 8. 7. 15:03

๋ฌธ์ œ

ํ’€์ด

์กฐ๊ฑด์€ ์ฐพ์•˜๋Š”๋ฐ ์ˆœ์—ด์„ ์ถœ๋ ฅ์„ ๋ชปํ•ด์„œ ํ‹€๋ ธ๋‹ค....

 

์šฐ์„  identity permutation ์—์„œ ์ˆ˜์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ” ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ฐจ์˜ ํ•ฉ์€ ์—ญ์ˆœ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ํŠน์ • x์™€ y์— ๋Œ€ํ•œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค๋ฉด, abs(x-y) + abs(x-y)์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‘ ์Œ์‹ ๋‚˜์˜ค๊ฒŒ ๋˜๋ฏ€๋กœ ํ™€์ˆ˜๊ฐ€ ๋‹ต์ด ๋  ์ˆ˜ ์—†๋‹ค.

 

์ˆœ์—ด์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆ˜ํ•™์ ์ธ ๊ทœ์น™์„ ์ฐพ์•„์•ผ๋œ๋‹ค.

[1, 2, 3, 4, 5, 6 ~~~~ xn] ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. 

1์˜ ์œ„์น˜๋ฅผ ํŠน์ •ํ•œ xi์™€ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฐ’์€ 1 - xi, xi - 1์ด๋‹ค. ์ฐจ์˜ ์ ˆ๋Œ“๊ฐ’์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฒฐ๊ตญ (xi - 1) * 2 ( xi > 1 ) ์ด ๋œ๋‹ค.

1์˜ ์œ„์น˜์™€ xi ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ฐจ์˜ ์ ˆ๋Œ“๊ฐ’์ด ํฌ๋‹ค.

K๊ฐ€ 0์ด ๋ ๋•Œ๊นŒ์ง€, 1๊ณผ xi๋ฅผ ๋ฐ”๊พธ๊ณ , 2์™€ xj๋ฅผ ๋ฐ”๊พธ๊ณ  ~~~ ์ด๋ ‡๊ฒŒ ์›€์ง์ด๋ฉด์„œ ์ˆœ์—ด์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ 1๊ณผ ๋์ ์„ lo, hi ๋กœ ์žก๊ณ , ์ด๋ฅผ ํˆฌํฌ์ธํ„ฐ๋กœ ์›€์ง์ด๋ฉด์„œ ์–ด๋–ค ์ˆ˜์™€ ์–ด๋–ค ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋Š”์ง€ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 

 

#include <iostream>

// util
#include <algorithm>
#include <cmath>
#include <stdlib.h>
#include <stdint.h>

// data structure
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <deque>

#define INTMAX 987654321
#define ll long long
#define pii std::pair<int,int>
#define vi std::vector<int>
#define pll std::pair<long long , long long>
#define vl std::vector<long long>
#define for_N(N) for(int i=0; i<N; i++)

using namespace std;
int T;
int main() {
    cin>>T;
    while(T--) {
        ll n, k; cin>>n>>k;
        ll arr[200002]={0};
        for(int i=1; i<=n; i++) arr[i] = i;
        ll max_s = 0;
        for(int i=1; i<=n; i++) {
            max_s += abs(arr[i] - arr[n-i+1]);
        }
        if(k > max_s || k%2 == 1) {
            cout<<"NO\n";
        } 
        else {
            int lo = 1, hi = n;
            while(lo < hi) {
                if(k >= abs(arr[lo] - arr[hi]) * 2) {
                    k -= abs(arr[lo] - arr[hi]) * 2;
                    swap(arr[lo], arr[hi]);
                    lo++;
                    hi--;
                } else {
                    hi --;
                }
            }
            cout<<"YES\n";
            for(int i=1; i<=n; i++) cout<<arr[i]<<" ";
            cout<<'\n';
        }
    }
}

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

27. Remove Element  (0) 2025.03.21
DP - ์•„์ดํ…œ์„ ์ ์ ˆํžˆ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ  (0) 2025.03.21
๋ฐฑ์ค€ 2671  (0) 2024.08.02
๋ฐฑ์ค€ 14848  (0) 2024.08.02
๋ฐฑ์ค€ 1953  (0) 2024.08.01