結果
問題 | No.1975 Zigzag Sequence |
ユーザー |
![]() |
提出日時 | 2022-06-16 10:59:13 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 358 ms / 2,000 ms |
コード長 | 2,166 bytes |
コンパイル時間 | 1,284 ms |
コンパイル使用メモリ | 119,248 KB |
実行使用メモリ | 51,716 KB |
最終ジャッジ日時 | 2024-10-06 03:35:07 |
合計ジャッジ時間 | 7,938 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 33 |
ソースコード
#include <iostream>#include <stdio.h>#include <cmath>#include <vector>#include <tuple>#include <bitset>#include <map>#include <queue>#include <time.h>#include <utility>#include <numeric>#include <deque>#include <cassert>#include <sstream>#include <cctype>#include <unordered_map>#include <algorithm>#include <chrono>#define ll long long#include <time.h>#define mod % 1000000007#define rep(i,n) for(long long i = 0;i < n;i ++)ll MAX = 5'000'000'000'000'000'000LL;using namespace std;ll A = 17;ll A2 = 1LL<<17;struct fenwick_tree{vector<vector<ll>> v;void start(){vector<ll> V(A2,0);rep(i,A)v.push_back(V);}void add(ll n,ll val){for(int i = 0;i < A;i ++){v[i][n>>i] += val;}}ll sum(ll n){n ++;ll s = 0;ll u = 0;ll d = A2;for(ll i = A-1;i >= 0;i --){ll m = (u+d)/2;if(m == n){s += v[i][u>>i];break;}if(m<n){s += v[i][u>>i];u = m;}if(m>n){d = m;}}return s;}};vector<ll> conv(vector<ll> a){auto b = a;sort(b.begin(),b.end());ll c = b.size();map<ll,ll> mp;for(int i = c-2;i >= 0;i --){if(b[i] == b[i+1])b.erase(b.begin()+i);}c = b.size();rep(i,c){mp[b[i]] = i+2;}rep(i,int(a.size())){a[i] = mp[a[i]];}return a;}int main(){vector<ll> exp;exp.push_back(1);rep(i,1000000)exp.push_back((exp[i]*2)mod);ll n;cin >> n;vector<ll> a(n);rep(i,n)cin >> a[i];a = conv(a);vector<ll> lup(n);vector<ll> ldown(n);fenwick_tree f;f.start();rep(i,n){lup[i] = (f.sum(A2-2)-f.sum(a[i])) mod;ldown[i] = f.sum(a[i]-1) mod;f.add(a[i],exp[i]);}vector<ll> rup(n);vector<ll> rdown(n);fenwick_tree g;g.start();rep(i,n){rup[n-1-i] = (g.sum(A2-2)-g.sum(a[n-1-i])) mod;rdown[n-1-i] = g.sum(a[n-1-i]-1) mod;g.add(a[n-1-i],exp[i]);}ll ans = 0;rep(i,n){ans += (rup[i]*lup[i]) mod;ans += (ldown[i]*rdown[i]) mod;}cout << ans mod << endl;return 0;}