結果
| 問題 |
No.2229 Treasure Searching Rod (Hard)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-13 17:37:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 203 ms / 2,000 ms |
| コード長 | 2,453 bytes |
| コンパイル時間 | 1,149 ms |
| コンパイル使用メモリ | 108,692 KB |
| 最終ジャッジ日時 | 2025-02-15 10:14:07 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<numeric>
#include<queue>
#include<cmath>
#include <unordered_set>
using namespace std;
typedef long long ll;
const ll INF=1LL<<60;
typedef pair<int,int> P;
typedef pair<int,P> PP;
const ll MOD=998244353;
ll mod_pow(ll x,ll y,ll mod){
ll res=1;
while(y>0){
if(y&1){
res*=x;
res%=mod;
}
x*=x;
x%=mod;
y/=2;
}
return res;
}
int main(){
int H,W,K;
cin>>H>>W>>K;
vector<int> x(K),y(K);
vector<ll> v(K);
for(int k=0;k<K;k++){
cin>>x[k]>>y[k]>>v[k];
}
ll inv2=mod_pow(2,MOD-2,MOD);
auto cumsum=[&](ll n){
//1+2+3+...+n
ll res=n%MOD;
res*=(n+1)%MOD;
res%=MOD;
res*=inv2;
res%=MOD;
return res;
};
//[l,r]
auto cumdif=[&](ll l,ll r){
ll res=cumsum(r);
if(l>=1){
res-=cumsum(l-1);
res+=MOD;
res%=MOD;
}
return res;
};
//タカラが(px,py)にある
auto f=[&](ll px,ll py){
ll t=px+py;
ll u=px-py;
ll lb=max(1LL,1-u);
ll c1=cumdif(lb,py);//[lb,py]
c1+=u*(py-lb+1)%MOD;
c1%=MOD;
ll ub=min(1LL*W,t-1);
//cout<<"ub="<<ub<<endl;
ll len=ub;
len-=(py-1+MOD)%MOD;
len+=MOD;
len%=MOD;
ll c2=t*len%MOD;
//c2-=( cumsum(ub) - cumsum(py-1)+MOD )%MOD;
c2-=cumdif(py,ub);
c2+=MOD;
c2%=MOD;
ll res=(c1+c2)%MOD;
res-=(px)%MOD;
res+=MOD;
res%=MOD;
return res;
};
/*
auto f=[&](ll px,ll py){
ll t=px+py;
ll u=px-py;
ll c1=py*t%MOD;
c1-=cumsum(py);
c1+=MOD;
c1%=MOD;
ll c2=u*(W-py+1)%MOD;
c2-=(cumsum(W) - cumsum(py-1)+MOD)%MOD;
c2+=MOD;
c2%=MOD;
ll res=(H*W)%MOD;
res-=c1;
res+=MOD;
res%=MOD;
res-=c2;
res+=MOD;
res%=MOD;
res+=px;
res%=MOD;
return res;
};
*/
ll ans=0;
for(int k=0;k<K;k++){
//cout<<"k="<<k<<",f(x[k],y[k])="<<f(x[k],y[k])<<endl;
ans+=v[k]*f(x[k],y[k])%MOD;
ans%=MOD;
}
cout<<ans<<endl;
}