結果
問題 | No.2236 Lights Out On Simple Graph |
ユーザー |
|
提出日時 | 2023-03-04 02:00:52 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,410 ms / 4,000 ms |
コード長 | 1,766 bytes |
コンパイル時間 | 1,104 ms |
コンパイル使用メモリ | 94,448 KB |
最終ジャッジ日時 | 2025-02-11 05:01:00 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 57 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:27:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 27 | scanf("%d %d", &n, &m); | ~~~~~^~~~~~~~~~~~~~~~~ main.cpp:29:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 29 | scanf("%d %d", &as[i], &bs[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ main.cpp:32:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 32 | for (i=0; i<n; i++) scanf("%d", &cs[i]); | ~~~~~^~~~~~~~~~~~~~
ソースコード
#include<stdio.h>#include<string.h>#include<stdlib.h>#include <map>#include <vector>#include <queue>#include <deque>#include <set>#include <stack>#include <algorithm>#include <array>#include <unordered_set>#include <unordered_map>#include <string>using namespace std;bool rcmp(int a, int b) { return a>b; }typedef long long LL;int as[64], bs[64], cs[64];int main() {int n, i, a, b, d, m, hm, nm;int j, c, r;LL v, one=1, nv, mm, xm;scanf("%d %d", &n, &m);for (i=0; i<m; i++) {scanf("%d %d", &as[i], &bs[i]);as[i]--; bs[i]--;}for (i=0; i<n; i++) scanf("%d", &cs[i]);hm = m/2;map<LL, int> dd1;map<LL, int> dd2;mm = 1<<hm;for (i=0; i<mm; i++) {xm = 0; c=0;for (j=0; j<hm; j++) {if (((1<<j)&i)==0) continue;c++;a=as[j]; b=bs[j];xm^=(one<<a);xm^=(one<<b);}if (dd1.count(xm)) dd1[xm]=min(dd1[xm], c);else dd1[xm]=c;}nm = m-hm;mm =1<<nm;for (i=0; i<mm; i++) {xm = 0; c=0;for (j=0; j<nm; j++) {if (((1<<j)&i)==0) continue;c++;a=as[j+hm]; b=bs[j+hm];xm^=(one<<a);xm^=(one<<b);}if (dd2.count(xm)) dd2[xm]=min(dd2[xm], c);else dd2[xm]=c;}r=-1;xm=0; for (i=0; i<n; i++) if (cs[i]) xm|=(one<<i);if (dd1.count(xm)) r=dd1[xm];if (dd2.count(xm)) {if (r==-1||r>dd2[xm]) r=dd2[xm];}for (auto x : dd1) {mm = x.first; c=x.second;mm^=xm;if (dd2.count(mm)==0) continue;c+=dd2[mm];if (r==-1||r>c) r=c;}printf("%d\n", r);return 0;}