Cod sursa(job #2417622)

Utilizator akaprosAna Kapros akapros Data 30 aprilie 2019 16:47:18
Problema Heavy Path Decomposition Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#define maxN 100002
#define maxL 32
#define ll long long
#define pii pair < int, int >
using namespace std;


FILE *fin = freopen("fft2d.in", "r", stdin);
FILE *fout = freopen("fft2d.out", "w", stdout);

int f, n;
vector < pii > V[maxL];

ll dp[maxN];
map < int, int > cnt[maxL][maxL];

ll ans;

int main()
{
    scanf("%d%d", &f, &n);
    for (int i = 0; i < n; ++ i)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        V[x].push_back(pii{y, i});
    }

    ans = (1 << (f - 1));
    ans = (1LL * ans * ans);
    for (pii it : V[f - 1])
    {
        int x = it.first;
        dp[it.second] = 1;
        //msk[f - 1] = x;
        cnt[f - 1][f - 1][x] += dp[it.second];
        for (int i = f - 2; i >= 0; -- i)
        {
            if (x & (1 << (f - i - 2))) x ^= (1 << (f - i - 2));
            //msk[i] = x;
            cnt[i][f - 1][x] += dp[it.second];
        }
        ans -= (1LL << (f - 1));
    }
    for (int lev = f - 2; lev >= 0; -- lev)
    {
        for (pii it : V[lev])
        {
            int x = it.first;
            dp[it.second] = 1 << (f - lev - 1);
            dp[it.second] -= cnt[lev][lev][x];
            for (int i = lev + 1; i < f; ++ i)
            {
                if (x & (1 << (f - i - 1))) x ^= (1 << (f - i - 1));
                dp[it.second] -= cnt[lev][i][x];
            }
            x = it.first;
            cnt[lev][lev][x] += dp[it.second];
            for (int i = lev - 1; i >= 0; -- i)
            {
                if (x & (1 << (f - i - 2))) x ^= (1 << (f - i - 2));
                cnt[i][lev][x] += dp[it.second];
            }
            x = it.first;
            for (int i = lev + 1; i < f; ++ i)
            {
                if (x & (1 << (f - i - 1))) x ^= (1 << (f - i - 1));
                cnt[lev][i][x] += dp[it.second];
            }
            ans -= 1LL * (1LL << lev) * dp[it.second];
        }
    }
    printf("%d\n", ans);
    return 0;
}