結果
| 問題 |
No.2956 Substitute with Average
|
| コンテスト | |
| ユーザー |
pockyny
|
| 提出日時 | 2025-07-14 02:34:58 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,317 ms / 3,000 ms |
| コード長 | 1,867 bytes |
| コンパイル時間 | 788 ms |
| コンパイル使用メモリ | 90,212 KB |
| 実行使用メモリ | 139,284 KB |
| 最終ジャッジ日時 | 2025-07-14 02:35:37 |
| 合計ジャッジ時間 | 34,303 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
typedef long long ll;
unordered_map<int,ll> um[40][40];
int a[200010],s[200010];
int main(){
int i,j,k,n; cin >> n;
for(i=1;i<=n;i++) cin >> a[i];
ll ans = 0;
s[0] = 0;
for(i=1;i<=n + 2;i++) s[i] = s[i - 1] + a[i - 1];
for(i=1;i<=n + 1;i++){
// [l,i)で、平均がa[l - 1]でもa[i]でもないやつ
ans += i - 1;
for(j=0;j<=30;j++){
// a[l - 1]==jのものについて数える
// 平均がa[i]を引く
int val1 = s[i] - i*a[i];
if(um[j][a[i]].find(val1)!=um[j][a[i]].end()){
ans -= um[j][a[i]][val1];
}
// 平均がjを引く
int val2 = s[i] - i*j;
if(a[i]!=j && um[j][j].find(val2)!=um[j][j].end()){
ans -= um[j][j][val2];
}
}
// for(int l=1;l<i;l++){
// if(s[l] - l*a[i]==s[i] - i*a[i]) ans--;
// else if(s[l] - l*a[l - 1]==s[i] - i*a[l - 1]) ans--;
// }
// cout << " i == " << i << " " << ans << " " << um[0][1][-1] << " " << s[i] - i*a[i] << "\n";
for(j=0;j<=30;j++) um[a[i - 1]][j][s[i] - i*j]++;
}
// int deb = 0;
// for(int l=1;l<=n;l++){
// for(int r=l + 1;r<=n + 1;r++){
// // [l,r)で条件を満たすやつ
// int sum = 0;
// for(i=l;i<r;i++) sum += a[i];
// if((r - l)*a[l - 1]!=sum && (r - l)*a[r]!=sum) deb++;
// }
// }
// cout << "ans == " << ans << " " << deb << "\n";
vector<pair<int,ll>> v;
for(i=1;i<=n;i++){
if(v.size()==0 || v.back().first!=a[i]){
v.push_back({a[i],1});
}else{
v.back().second++;
}
}
ans -= v.size();
ans++;
cout << ans << "\n";
}
pockyny