結果
| 問題 |
No.2251 Marking Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-03-26 22:26:15 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,717 bytes |
| コンパイル時間 | 4,363 ms |
| コンパイル使用メモリ | 235,656 KB |
| 実行使用メモリ | 27,008 KB |
| 最終ジャッジ日時 | 2024-09-19 10:02:28 |
| 合計ジャッジ時間 | 8,912 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 2 |
| other | WA * 40 |
ソースコード
#include <atcoder/all>
#include <bits/stdc++.h>
// url https://yukicoder.me/problems/no/2251
#define rep(i, a, b) for(int i = a; i < b; i++)
#define rrep(i, a, b) for(int i = b - 1; i >= a; i--)
#define all(x) (x).begin(), (x).end()
#define pb(x) push_back(x);
template <class T> bool chmax(T &a, const T &b) {
if(a < b) {
a = b;
return 1;
}
return 0;
}
template <class T> bool chmin(T &a, const T &b) {
if(b < a) {
a = b;
return 1;
}
return 0;
}
typedef long long ll;
typedef long double lld;
using namespace std;
using namespace atcoder;
using mint = static_modint<998244353>;
// using mint = static_modint<1000000007>;
const ll mod = 998244353;
// const ll mod=1e9+7;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
const string zton = "0123456789";
const string atoz = "abcdefghijklmnopqrstuvwxyz";
const string ATOZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const ll inf = (1ll << 60);
// const int inf=(1<<30);
lld dist(lld x1, lld x2, lld y1, lld y2) {
lld res = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
res = sqrt(abs(res));
return res;
}
lld arg(lld x, lld y) {
const lld eps = 1e-8;
lld res = 0;
if(abs(x) + abs(y) <= eps)
return 0.0;
else if(abs(x) <= eps) {
if(y >= 0.0)
return (M_PI / 2);
else
return (M_PI / 2 + M_PI);
} else if(abs(y) <= eps) {
if(x >= 0.0)
return 0.0;
else
return M_PI;
}
res = atan2(abs(y), abs(x));
if(x <= 0 && y >= 0)
res = (M_PI - res);
else if(x <= 0 && y <= 0)
res += (M_PI);
else if(x >= 0 && y <= 0)
res = (M_PI * 2 - res);
return res;
}
ll gcd(ll a, ll b) {
if(a == 0 || b == 0)
return a + b;
ll r;
r = a % b;
if(r == 0) {
return b;
} else {
return gcd(b, r);
}
}
typedef pair<ll, int> P;
ll A[1010][1010];
int H,W;
mint ans_H(){
P ah[H*W];
rep(i,0,H)rep(j,0,W){
ah[i*W+j]={A[i][j],i*W+j};
}
sort(ah,ah+H*W);
reverse(ah,ah+H*W);
bool used[H];fill(used,used+H,false);
mint res=0;
mint ad=pow_mod(2,H-1,mod);
rep(i,0,H)rep(j,0,W){
int h=ah[i*W+j].second/W;
if(used[h])continue;
res+=ah[i*W+j].first*ad;
used[h]=true;
ad/=2;
}
return res;
}
mint ans_W(){
P ah[H*W];
rep(i,0,H)rep(j,0,W){
ah[i*W+j]={A[i][j],i*W+j};
}
sort(ah,ah+H*W);
reverse(ah,ah+H*W);
bool used[W];fill(used,used+W,false);
mint res=0;
mint ad=pow_mod(2,W-1,mod);
rep(i,0,H)rep(j,0,W){
int w=ah[i*W+j].second%W;
if(used[w])continue;
res+=ah[i*W+j].first*ad;
used[w]=true;
ad/=2;
}
res-=ah[0].first;
return res;
}
mint check(){
P ah[H*W];
rep(i,0,H)rep(j,0,W){
ah[i*W+j]={A[i][j],i*W+j};
}
sort(ah,ah+H*W);
reverse(ah,ah+H*W);
int h2=(H+1)/2;
int w2=(W+1)/2;
int cnt_h2[h2][W];
rep(i,0,h2)rep(j,0,W)cnt_h2[i][j]=0;
int cnt_w[W];fill(cnt_w,cnt_w+W,0);
mint res=0;
mint b=pow_mod(2,h2-1,mod);
mint a=pow_mod(2,W-1,mod);
mint ab=a*b;
bool exit_flag=false;
rep(i,0,H)rep(j,0,W){
int h=ah[i*W+j].second/W;
int w=ah[i*W+j].second%W;
cnt_h2[h/2][w]++;
res+=ab*ah[i*W+j].first;
ab/=2;
cout << ah[i*W+j].first << " " << res.val() << endl;
if(cnt_h2[h/2][w]==2){
exit_flag=true;
if(i*W+j<H*W-1&&ah[i*W+j].first==ah[i*W+j+1].first){
res-=ah[i*W+j].first;
res+=ah[i*W+j+1].first;
}
}
}
return res;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> H >> W;
rep(i,0,H)rep(j,0,W)cin >> A[i][j];
P perm[H*W];
rep(i,0,H)rep(j,0,W){
perm[i*W+j]={A[i][j],i*W+j};
}
sort(perm,perm+H*W);
reverse(perm,perm+H*W);
dsu uf(H+W);
int sz=H+W;
mint ans=0;
// ll pre=-1;
// queue<P> q;
rep(i,0,H*W){
// if(pre!=perm[i].first){
// while(!q.empty()){
// P p=q.front();q.pop();
// int h=p.first;
// int w=p.second;
// uf.merge(h,H+w);
// sz--;
// }
// }
int h=perm[i].second/W;
int w=perm[i].second%W;
if(uf.same(h,H+w)){
continue;
}
mint add=perm[i].first;
add*=pow_mod(2,sz-2,mod);
ans+=add;
// q.push({h,w});
// pre=perm[i].first;
}
cout << ans.val() << endl;
// ans+=ans_H();
// ans+=ans_W();
// ans+=check();
// cout << ans.val() << endl;
}