結果
| 問題 |
No.956 Number of Unbalanced
|
| コンテスト | |
| ユーザー |
nmnmnmnmnmnmnm
|
| 提出日時 | 2019-12-09 20:58:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 239 ms / 2,000 ms |
| コード長 | 2,926 bytes |
| コンパイル時間 | 974 ms |
| コンパイル使用メモリ | 104,232 KB |
| 実行使用メモリ | 40,736 KB |
| 最終ジャッジ日時 | 2024-06-23 05:39:19 |
| 合計ジャッジ時間 | 7,056 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 24 |
ソースコード
#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
#define sz size()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
#define per(i,a,b) for(ll i=b-1LL;i>=(a);--i)
#define clr(a, b) memset((a), (b) ,sizeof(a))
#define ctos(c) string(1,c)
#define print(x) cout<<#x<<" = "<<x<<endl;
#define MOD 1000000007
template <class T>
struct time_array{
private:
int t;
vector<int> ts;
vector<T> v;
public:
time_array() {}
time_array(int n) : t(0), ts(n, 0), v(n) { }
T& operator[](int i) {
if (ts[i] < t) {
ts[i] = t;
v[i] = T();
}
return v[i];
}
int size() const {
return v.size();
}
void clear() {
++t;
}
};
struct segsum{
long long nn;
time_array<ll> dat1;
time_array<ll> dat2;
segsum(int n): dat1(n), dat2(n){}
void init(long long n1){
nn = 1;
while(nn < n1)nn *= 2;
dat1.clear();
dat2.clear();
}
void add(long long a, long long b, long long x, long long k, long long l, long long r) {
if (a <= l && r <= b) {
dat1[k] += x;
}
else if (l < b && a < r) {
dat2[k] += (min(b, r) - max(a, l)) * x;
add(a, b, x, k * 2 + 1, l, (l + r) / 2);
add(a, b, x, k * 2 + 2, (l + r) / 2, r);
}
}
long long sum(long long a, long long b, long long k, long long l, long long r){
if (b <= l || r <= a)return 0LL;
else if (a <= l && r <= b) {
return (dat1[k] * (r - l) + dat2[k]);
}
else {
long long ret;
ret = (min(b, r) - max(a, l)) * dat1[k];
ret += sum(a, b, k * 2 + 1, l, (l + r) / 2);
ret += sum(a, b, k * 2 + 2, (l + r) / 2, r);
return ret;
}
}
void add(long long a, long long b, long long x){
return add(a,b,x,0,0,nn);
}
long long sum(long long a, long long b){
return sum(a,b,0,0,nn);
}
};
int main(){
ll n;
cin>>n;
vector<vector<ll> > vv(100100,vector<ll>());
rep(i,0,n){
ll a;
cin>>a;
a--;
vv[a].pb(i);
}
ll ans = 0;
time_array<ll> ta(1<<19);
segsum segsum1(1<<20);
rep(i,0,vv.sz){
vv[i].pb(n);
ll p = 1<<17;
ta.clear();
segsum1.init(1<<19);
ll now = -1;
rep(j,0,vv[i].sz){
ll nex = vv[i][j];
ll a = nex-now-1;
ans += ta[p-2]-ta[p-a-2];
segsum1.add(p-a+1,p+1,1);
p -= a;
if(j!=vv[i].sz-1){
segsum1.add(p,p+1,1);
ans += segsum1.sum(0,p+1);
ta[p] = ta[p-1]+segsum1.sum(0,p+1);
p++;
}
now = nex;
}
}
cout << ans << endl;
return 0;
}
nmnmnmnmnmnmnm