# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1260866 | new_acc | Council (JOI23_council) | C++20 | 596 ms | 18900 KiB |
#include <iostream>
#include <vector>
using namespace std;
constexpr int MB = 20;
constexpr int N = 3e5 + 10;
typedef pair<int,int> desc;
pair<desc, desc> dp[1 << MB];
int glosuja[MB];
int slowa[N];
int main() {
for (int i=0;i<(1<<MB);i++) dp[i].first.second=dp[i].second.second=-1;
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
int slowo = 0, ile = 0;
for (int b = 0; b < m; b++) {
int t;
scanf("%d", &t);
glosuja[b]+=t;
ile += t;
slowo |= t << b;
}
slowa[i]=slowo;
slowo = ~slowo & ((1<<m)-1);
if (dp[slowo].first.first == 0) dp[slowo].first = {m-ile,i};
else dp[slowo].second = {m-ile,i};
}
for (int i=(1<<m)-1;i>=0;i--) {
for (int b=0;b<m;b++) {
if ((i & (1 << b)) == 0) continue;
int newi = i ^ (1<<b);
if (dp[i].second.first) {
dp[newi].first=dp[newi].second={dp[i].second.first-1,dp[i].second.second};
dp[newi].first.second=dp[i].first.second;
}
else if (dp[i].first.first && dp[i].first.second!=dp[newi].first.second) {
if (dp[i].first.second!=dp[newi].first.second) swap(dp[newi].first,dp[newi].second);
dp[newi].first = {dp[i].first.first-1,dp[i].first.second};
}
}
}
for (int i = 0; i < (1 << m); i++) {
for (int b = 0; b < m; b++) {
if ((i & (1 << b)) != 0) continue;
int newi = i | 1<<b;
if (dp[newi].first<dp[i].first) {
if (dp[i].first.second!=dp[newi].first.second) swap(dp[newi].first,dp[newi].second);
dp[newi].first=dp[i].first;
dp[newi].second = max(dp[newi].second,dp[i].second);
}
else if (dp[newi].second<dp[i].first && dp[i].first.second!=dp[newi].first.second) dp[newi].second=dp[i].first;
else if (dp[newi].second<dp[i].second && dp[i].second.second!=dp[newi].first.second) dp[newi].second=dp[i].second;
}
}
int majority = (n-2)/2 + 1;
for (int i=0;i<n;i++) {
int newslowo = 0, ileja=0, wyn=0, ilegeneralnie=0;
for (int b=0;b<m;b++) {
int red=0;
if ((slowa[i] & (1<<b)) != 0) red=1;
if (glosuja[b]-red == majority) {
newslowo |= 1<<b;
if (red==0)
ileja++;
ilegeneralnie++;
}
else if (glosuja[b]-red > majority) wyn++;
}
if (dp[newslowo].first.first==ileja)
wyn+=dp[newslowo].second.first;
else
wyn+=dp[newslowo].first.first;
printf("%d\n",wyn);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |