結果
問題 | No.2251 Marking Grid |
ユーザー | publfl2 |
提出日時 | 2023-03-17 22:47:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 239 ms / 3,000 ms |
コード長 | 1,461 bytes |
コンパイル時間 | 784 ms |
コンパイル使用メモリ | 59,092 KB |
実行使用メモリ | 23,496 KB |
最終ジャッジ日時 | 2024-09-18 11:56:58 |
合計ジャッジ時間 | 4,285 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
ソースコード
#include <stdio.h> #include <vector> #include <algorithm> #define MOD 998244353 long long int power(long long int a, long long int b) { long long int ans = 1; long long int k = a; while(b) { if(b%2==1) ans*=k, ans%=MOD; b/=2; k*=k, k%=MOD; } return ans; } long long int inv(long long int k) { return power(k,MOD-2); } int next[100010]; int find(int k) { if(k==next[k]) return k; else return next[k] = find(next[k]); } struct str{ int first; int second; long long int value; }; std::vector<str> event; bool cmp(str a, str b) { return a.value<b.value; } int x[1010][1010]; int main() { int a,b; scanf("%d%d",&a,&b); for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) scanf("%d",&x[i][j]); for(int i=1;i<=2*a+2*b;i++) next[i] = i; int C = a + b; for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) event.push_back({i,j,x[i][j]}); std::sort(event.begin(),event.end(),cmp); long long int ans = 0; while(!event.empty()) { int x0 = event.back().first; int y0 = event.back().second; long long int val = event.back().value; event.pop_back(); int s1 = x0, s2 = a+y0; if(find(s1)==find(s2+a+b)) continue; else if(find(s1)==find(s2)) ans += (power(2,C)*val)%MOD, ans %= MOD; else { C--; ans += (power(2,C)*val)%MOD, ans %= MOD; next[find(s1)] = find(s2+a+b); next[find(s1+a+b)] = find(s2); if(find(s1)==find(s1+a+b)) break; if(find(s2)==find(s2+a+b)) break; } } ans *= inv(2), ans %= MOD; printf("%lld",ans); }