제출 #1351451

#제출 시각아이디문제언어결과실행 시간메모리
1351451BigBadBullyBrought Down the Grading Server? (CEOI23_balance)C++20
100 / 100
378 ms82944 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
#define tri array<int, 3>
const int inf = 2e18;
const int mod = 998244353;
const int mxn = 1e6 + 1;
vector<int> fact(mxn+1,1),invfact(mxn+1,1);


int exp(int x, int n)
{
    int res = 1;
    for (; n > 0; res = (n % 2 ? res * x % mod : res), x = x * x % mod, n /= 2)
        ;
    return res;
}

int inv(int x)
{
    return exp(x, mod - 2);
}

void init()
{
    for(int i = 1; i <= mxn; i++)
        fact[i]=fact[i-1]*i%mod;
    invfact[mxn] = inv(fact[mxn]);
    for(int i = mxn-1; i >= 0; i--)
        invfact[i]=invfact[i+1]*(i+1)%mod;
}

int ncr(int n,int r)
{
    if(n<r ||n<0||r<0)
        return 0;
    return fact[n]*invfact[r]%mod*invfact[n-r]%mod;
}


void solve()
{
    int n,s,t;
    cin >> n >> s >> t;
    vector<vector<int>> v(n,vector<int>(s));
    for(auto&a:v)for(int&x:a)cin>>x;
    vector<list<pii>> g(t+1);
    function<void(int,int)> fun = [&](int l,int r)
    {
        if(l==r)return;
        int h = r-l+1>>1;
        vector<pair<int&,int&>> edg;
        int tmp1=0,tmp2=0;
        for(int r = 0;r < n; r++)
            for(int i = l; i < l+h; i++)
            g[v[r][i]].push_back({v[r][i+h],edg.size()}),
            g[v[r][i+h]].push_back({v[r][i],edg.size()}),
            edg.push_back({v[r][i],v[r][i+h]});
        int prev = -1;
        for(int r = 0;r < n; r++)
            for(int i = l;i < l+h;i++)
                for(int cur = i;cur <= i+h;cur+=h)
                if(g[v[r][cur]].size()%2)
                {
                    if(prev==-1)
                        prev = v[r][cur];
                    else
                    {
                        g[prev].push_back({v[r][cur],edg.size()});
                        g[v[r][cur]].push_back({prev,edg.size()});
                        edg.push_back({tmp1,tmp2});
                        prev = -1;
                    }
                }
            
        vector<int> vis(edg.size(),0);
        function<void(int)> dfs = [&](int cur)
        {
            while(g[cur].size())
            {
                while(g[cur].size()&&vis[g[cur].back().ss])
                    g[cur].pop_back();
                if(g[cur].size())
                {
                    pii a = g[cur].back();
                    vis[a.ss]=1;
                    g[cur].pop_back();
                    if(cur==edg[a.ss].ss)
                        swap(edg[a.ss].ff,edg[a.ss].ss);
                    dfs(a.ff);
                }
            }
        };
        for(int r = 0;r < n; r++)
            for(int i = l; i < l+h; i++)
            dfs(v[r][i]),dfs(v[r][i+h]);
        fun(l,(l+r)/2);
        fun((l+r)/2+1,r);
    };
    fun(0,s-1);
    for(auto a:v)
    {
        for(int x:a)
            cout<<x<<' ';
        cout<<'\n';
    }
        
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    init();

    int t=1;
    //cin >>t;
    while(t--)solve();
        
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...