제출 #1162329

#제출 시각아이디문제언어결과실행 시간메모리
1162329brintonCouncil (JOI23_council)C++20
6 / 100
152 ms22080 KiB
#include <bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); //start here int N,k; cin >> N >> k; vector<vector<int>> A(N,vector<int>(k)); for(auto &i:A){ for(auto &j:i)cin >> j; } // 0: < 絕,1: = 絕, 2: = 絕+1, 3: > 絕+1; vector<int> cnt(k,0); for(auto &v:A){ for(int i = 0;i < k;i++){ cnt[i] += v[i]; } } vector<array<pair<int,int>,2>> dp((1 << k),{make_pair(0,-1),make_pair(0,-1)});//{{cnt1,loc1},{cnt2,loc2}}; for(int loc = 0;loc < N;loc++){ auto i = A[loc]; // reverse int key = 0; for(auto &j:i){ key*=2; key += j; } // cout << ((~key)&((1 << k)-1)) << endl; key = ((~key)&((1 << k)-1)); dp[key][1] = max(dp[key][1],{__builtin_popcount(key),loc}); if(dp[key][1] > dp[key][0])swap(dp[key][1],dp[key][0]); } // push lazy tag for(int mask = (1 << k)-1;mask >= 0;mask--){ // push_down for(int i = 0;i < k;i++){ if((mask|(1 << i)) == mask){ // push_0 int nxt = mask-(1 << i); auto [cnt1,loc1] = dp[mask][0]; auto [cnt2,loc2] = dp[mask][1]; dp[nxt][1] = max(dp[nxt][1],{cnt1-1,loc1}); if(dp[nxt][1] > dp[nxt][0])swap(dp[nxt][1],dp[nxt][0]); dp[nxt][1] = max(dp[nxt][1],{cnt2-1,loc2}); if(dp[nxt][1] > dp[nxt][0])swap(dp[nxt][1],dp[nxt][0]); } } } // bitmask dp for(int mask = 0;mask < (1 << k);mask++){ // pull up for(int i = 0;i < k;i++){ if((mask|(1 << i)) == mask){ int prev = mask-(1 << i); dp[mask][1] = max(dp[mask][1],dp[prev][0]); if(dp[mask][1] > dp[mask][0]) swap(dp[mask][1],dp[mask][0]); dp[mask][1] = max(dp[mask][1],dp[prev][1]); if(dp[mask][1] > dp[mask][0]) swap(dp[mask][1],dp[mask][0]); // dp[mask] = max(dp[mask],dp[mask-(1 << i)]); } } } // for(int i = 0;i < (1 << k);i++){ // cout << i << ":" << dp[i] << endl; // } for(int loc = 0;loc < N;loc++){ auto v = A[loc]; // answer query int ans = 0; int mask = 0; for(int i = 0;i < k;i++){ if(cnt[i] > N/2+1){ // cout << "A"; ans++; continue; } if(cnt[i] < N/2){ // cout << "B"; continue; } if(v[i] == 1){ if(cnt[i] == N/2){ // cout << "C"; continue; }else{ // cout << "D"; mask |= (1 << (k-i-1)); } }else{ if(cnt[i] == N/2){ // cout << "E"; mask |= (1 << (k-i-1)); }else{ // cout << "F"; ans++; continue; } } } // cout << ans << " " << mask << endl; if(dp[mask][0].second == loc){ ans += dp[mask][1].first; }else{ ans += dp[mask][0].first; } cout << ans << '\n'; } } /* dp[i] = {{cnt1,mask1},{cnt2,mask2}}; */
#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...