Submission #1308366

#TimeUsernameProblemLanguageResultExecution timeMemory
1308366ojuz_userCouncil (JOI23_council)C++20
100 / 100
519 ms34384 KiB
#include <bits/stdc++.h>
using namespace std;

#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
inline ll ran(ll l, ll r)
{
    return uniform_int_distribution<ll> (l, r)(rng);
}

inline void rf()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    if(fopen(file".inp","r"))
    {
        freopen(file".inp","r",stdin);
        freopen(file".out","w",stdout);
    }
}

const int mod=1e9+7;
const int maxn=3e5+15;
const ll inf=1e16;

template<typename T> inline void add(T &x, const T &y)
{
    x+=y;
    if(x>=mod) x-=mod;
    if(x<0) x+=mod;
}

template<typename T> inline bool maxi(T &a, T b)
{
    if(a>=b) return 0;
    a=b; return 1;
}

template<typename T> inline bool mini(T &a, T b)
{
    if(a<=b) return 0;
    a=b; return 1;
}

int n, m;
bool a[maxn][25];
int zero[maxn], cnt[25];
vi tmp[2];
pii id[(1<<20)+5];
struct cand{int val, p;} b1[(1<<20)+5], b2[(1<<20)+5];

inline void addc(cand &a, cand &b, const cand &x)
{
    if(x.p==0 || a.p==x.p || b.p==x.p) return;
    if(x.val>a.val) b=a, a=x;
    else if(x.val>b.val) b=x;
}

inline void addp(pii &mask, int x)
{
    if(x==0 || mask.fi==x || mask.se==x) return;
    if(mask.fi==0) mask.fi=x;
    else if(mask.se==0) mask.se=x;
}

inline void merge(pii &a, const pii &b)
{
    addp(a, b.fi);
    addp(a, b.se);
}

signed main()
{
    rf();
    cin>>n>>m;
    ff(i, 1, n) ff(j, 0, m-1)
    {
        bool bit; cin>>bit; a[i][j]=bit;
        if(bit) ++cnt[j];
        else zero[i]|=(1<<j);
    }

    ff(i, 1, n) addp(id[zero[i] ], i);
    ff(i, 0, m-1) ff(mask ,0, (1<<m)-1) if(!((mask>>i)&1))
    {
        int nmask=(mask|(1<<i));
        merge(id[mask], id[nmask]);
    }

    int all=(1<<m)-1;
    ff(mask, 0, all)
    {
        b1[mask]=b2[mask]={-1, 0};
        int c=__builtin_popcount(mask);
        if(id[mask].fi) addc(b1[mask], b2[mask], {c, id[mask].fi});
        if(id[mask].se) addc(b1[mask], b2[mask], {c, id[mask].se});
    }
    ff(i, 0, m-1) ff(mask, 0, all) if((mask>>i)&1)
    {
        int sub=(mask^(1<<i) );
        addc(b1[mask], b2[mask], b1[sub]);
        addc(b1[mask], b2[mask], b2[sub]);
    }

    int sl=0;
    ff(i, 0, m-1)
    {
        if(cnt[i]>=n/2+2) ++sl;
        else if(cnt[i]<n/2) cn;
        else tmp[cnt[i]-n/2].pb(i);
    }
    ff(boss, 1, n)
    {
        int ans=sl;
        vi bit;
        for(auto i:tmp[1])
        {
            if(!a[boss][i]) ++ans;
            else bit.pb(i);
        }
        for(auto i:tmp[0]) if(!a[boss][i]) bit.pb(i);
        sort(all(bit));
        int mask=0;
        for(auto i:bit) mask|=(1<<i);
        int mx=0;
        if(b1[mask].p!=0 && b1[mask].p!=boss) mx=b1[mask].val;
        else if(b2[mask].p!=0 && b2[mask].p!=boss) mx=b2[mask].val;
        if(mx<0) mx=0;
        ans+=mx;
        cout<<ans<<nl;
    }
    re;
}

Compilation message (stderr)

council.cpp: In function 'void rf()':
council.cpp:40:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |         freopen(file".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
council.cpp:41:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |         freopen(file".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...