結果
問題 | No.1733 Sum of Sorted Subarrays |
ユーザー |
|
提出日時 | 2021-11-05 22:11:09 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 554 ms / 3,000 ms |
コード長 | 12,190 bytes |
コンパイル時間 | 3,461 ms |
コンパイル使用メモリ | 218,040 KB |
最終ジャッジ日時 | 2025-01-25 12:23:05 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
ソースコード
#include <bits/stdc++.h>using namespace std;namespace Rec{template<class Fun>class y_combinator_result {Fun fun_;public:template<class T>explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) {}template<class ...Args>decltype(auto) operator()(Args &&...args) {return fun_(std::ref(*this), std::forward<Args>(args)...);}};template<class Fun>decltype(auto) y_combinator(Fun &&fun) {return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));}}//fast IO by yosupostruct Scanner {FILE* fp = nullptr;char line[(1 << 15) + 1];size_t st = 0, ed = 0;void reread() {memmove(line, line + st, ed - st);ed -= st;st = 0;ed += fread(line + ed, 1, (1 << 15) - ed, fp);line[ed] = '\0';}bool succ() {while (true) {if (st == ed) {reread();if (st == ed) return false;}while (st != ed && isspace(line[st])) st++;if (st != ed) break;}if (ed - st <= 50) reread();return true;}template <class T, enable_if_t<is_same<T, string>::value, int> = 0>bool read_single(T& ref) {if (!succ()) return false;while (true) {size_t sz = 0;while (st + sz < ed && !isspace(line[st + sz])) sz++;ref.append(line + st, sz);st += sz;if (!sz || st != ed) break;reread();}return true;}template <class T, enable_if_t<is_integral<T>::value, int> = 0>bool read_single(T& ref) {if (!succ()) return false;bool neg = false;if (line[st] == '-') {neg = true;st++;}ref = T(0);while (isdigit(line[st])) {ref = 10 * ref + (line[st++] - '0');}if (neg) ref = -ref;return true;}template <class T> bool read_single(vector<T>& ref) {for (auto& d : ref) {if (!read_single(d)) return false;}return true;}void read() {}template <class H, class... T> void read(H& h, T&... t) {bool f = read_single(h);assert(f);read(t...);}Scanner(FILE* _fp) : fp(_fp) {}};struct Printer {public:template <bool F = false> void write() {}template <bool F = false, class H, class... T>void write(const H& h, const T&... t) {if (F) write_single(' ');write_single(h);write<true>(t...);}template <class... T> void writeln(const T&... t) {write(t...);write_single('\n');}Printer(FILE* _fp) : fp(_fp) {}~Printer() { flush(); }private:static constexpr size_t SIZE = 1 << 15;FILE* fp;char line[SIZE], small[50];size_t pos = 0;void flush() {fwrite(line, 1, pos, fp);pos = 0;}void write_single(const char& val) {if (pos == SIZE) flush();line[pos++] = val;}template <class T, enable_if_t<is_integral<T>::value, int> = 0>void write_single(T val) {if (pos > (1 << 15) - 50) flush();if (val == 0) {write_single('0');return;}if (val < 0) {write_single('-');val = -val; // todo min}size_t len = 0;while (val) {small[len++] = char('0' + (val % 10));val /= 10;}for (size_t i = 0; i < len; i++) {line[pos + i] = small[len - 1 - i];}pos += len;}void write_single(const string& s) {for (char c : s) write_single(c);}void write_single(const char* s) {size_t len = strlen(s);for (size_t i = 0; i < len; i++) write_single(s[i]);}template <class T> void write_single(const vector<T>& val) {auto n = val.size();for (size_t i = 0; i < n; i++) {if (i) write_single(' ');write_single(val[i]);}}};using ll=long long;//#define int ll#define rng(i,a,b) for(int i=int(a);i<=int(b);i++)#define rep(i,b) rng(i,0,b-1)#define gnr(i,b,a) for(int i=int(b);i>=int(a);i--)#define per(i,b) gnr(i,b-1,0)#define pb push_back#define eb emplace_back#define fi first#define se second#define bg begin()#define ed end()#define all(x) x.bg,x.ed#define si(x) int(x.size())#ifdef LOCAL#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl#else#define dmp(x) void(0)#endiftemplate<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}template<class t> using vc=vector<t>;template<class t> using vvc=vc<vc<t>>;using pii=pair<int,int>;using vi=vc<int>;template<class t,class u>ostream& operator<<(ostream& os,const pair<t,u>& p){return os<<"{"<<p.a<<","<<p.b<<"}";}template<class t> ostream& operator<<(ostream& os,const vc<t>& v){os<<"{";for(auto e:v)os<<e<<",";return os<<"}";}#define mp make_pair#define mt make_tuple#define one(x) memset(x,-1,sizeof(x))#define zero(x) memset(x,0,sizeof(x))#ifdef LOCALvoid dmpr(ostream&os){os<<endl;}template<class T,class... Args>void dmpr(ostream&os,const T&t,const Args&... args){os<<t<<" ";dmpr(os,args...);}#define dmp2(...) dmpr(cerr,__LINE__,##__VA_ARGS__)#else#define dmp2(...) void(0)#endifusing uint=unsigned;using ull=unsigned long long;using pil=pair<int,ll>;using pli=pair<ll,int>;using pll=pair<ll,ll>;template<class t,size_t n>ostream& operator<<(ostream&os,const array<t,n>&a){return os<<vc<t>(all(a));}template<int i,class T>void print_tuple(ostream&,const T&){}template<int i,class T,class H,class ...Args>void print_tuple(ostream&os,const T&t){if(i)os<<",";os<<get<i>(t);print_tuple<i+1,T,Args...>(os,t);}template<class ...Args>ostream& operator<<(ostream&os,const tuple<Args...>&t){os<<"{";print_tuple<0,tuple<Args...>,Args...>(os,t);return os<<"}";}template<class t>void print(t x,int suc=1){cout<<x;if(suc==1)cout<<"\n";if(suc==2)cout<<" ";}ll read(){ll i;cin>>i;return i;}vi readvi(int n,int off=0){vi v(n);rep(i,n)v[i]=read()+off;return v;}template<class T>void print(const vector<T>&v,int suc=1){rep(i,v.size())print(v[i],i==int(v.size())-1?suc:2);}string readString(){string s;cin>>s;return s;}template<class T>T sq(const T& t){return t*t;}//#define CAPITALvoid yes(bool ex=true){#ifdef CAPITALcout<<"YES"<<"\n";#elsecout<<"Yes"<<"\n";#endifif(ex)exit(0);}void no(bool ex=true){#ifdef CAPITALcout<<"NO"<<"\n";#elsecout<<"No"<<"\n";#endifif(ex)exit(0);}void possible(bool ex=true){#ifdef CAPITALcout<<"POSSIBLE"<<"\n";#elsecout<<"Possible"<<"\n";#endifif(ex)exit(0);}void impossible(bool ex=true){#ifdef CAPITALcout<<"IMPOSSIBLE"<<"\n";#elsecout<<"Impossible"<<"\n";#endifif(ex)exit(0);}constexpr ll ten(int n){return n==0?1:ten(n-1)*10;}const ll infLL=LLONG_MAX/3;#ifdef intconst int inf=infLL;#elseconst int inf=INT_MAX/2-100;#endifint topbit(signed t){return t==0?-1:31-__builtin_clz(t);}int topbit(ll t){return t==0?-1:63-__builtin_clzll(t);}int botbit(signed a){return a==0?32:__builtin_ctz(a);}int botbit(ll a){return a==0?64:__builtin_ctzll(a);}int popcount(signed t){return __builtin_popcount(t);}int popcount(ll t){return __builtin_popcountll(t);}bool ispow2(int i){return i&&(i&-i)==i;}ll mask(int i){return (ll(1)<<i)-1;}template<class t>bool inc(t a,t b,t c){return a<=b&&b<=c;}template<class t> void mkuni(vc<t>&v){sort(all(v));v.erase(unique(all(v)),v.ed);}ll rand_int(ll l, ll r) { //[l, r]#ifdef LOCALstatic mt19937_64 gen;#elsestatic mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());#endifreturn uniform_int_distribution<ll>(l, r)(gen);}template<class t>int lwb(const vc<t>&v,const t&a){return lower_bound(all(v),a)-v.bg;}struct modinfo{uint mod,root;};template<modinfo const&ref>struct modular{static constexpr uint const &mod=ref.mod;static modular root(){return modular(ref.root);}uint v;//modular(initializer_list<uint>ls):v(*ls.bg){}modular(ll vv=0){s(vv%mod+mod);}modular& s(uint vv){v=vv<mod?vv:vv-mod;return *this;}modular operator-()const{return modular()-*this;}modular& operator+=(const modular&rhs){return s(v+rhs.v);}modular&operator-=(const modular&rhs){return s(v+mod-rhs.v);}modular&operator*=(const modular&rhs){v=ull(v)*rhs.v%mod;return *this;}modular&operator/=(const modular&rhs){return *this*=rhs.inv();}modular operator+(const modular&rhs)const{return modular(*this)+=rhs;}modular operator-(const modular&rhs)const{return modular(*this)-=rhs;}modular operator*(const modular&rhs)const{return modular(*this)*=rhs;}modular operator/(const modular&rhs)const{return modular(*this)/=rhs;}modular pow(int n)const{modular res(1),x(*this);while(n){if(n&1)res*=x;x*=x;n>>=1;}return res;}modular inv()const{return pow(mod-2);}/*modular inv()const{int x,y;int g=extgcd(v,mod,x,y);assert(g==1);if(x<0)x+=mod;return modular(x);}*/friend modular operator+(int x,const modular&y){return modular(x)+y;}friend modular operator-(int x,const modular&y){return modular(x)-y;}friend modular operator*(int x,const modular&y){return modular(x)*y;}friend modular operator/(int x,const modular&y){return modular(x)/y;}friend ostream& operator<<(ostream&os,const modular&m){return os<<m.v;}friend istream& operator>>(istream&is,modular&m){ll x;is>>x;m=modular(x);return is;}bool operator<(const modular&r)const{return v<r.v;}bool operator==(const modular&r)const{return v==r.v;}bool operator!=(const modular&r)const{return v!=r.v;}explicit operator bool()const{return v;}};extern constexpr modinfo base{998244353,0};using mint=modular<base>;const int SZ = (1<<18);mint po[SZ];struct Tree{mint S[SZ+SZ];int K[SZ+SZ];void UDT(int nd){S[nd]=S[nd*2]+S[nd*2+1];}void init(int nd, int b, int e){if(b==e){S[nd]=1;return;}int m = (b+e)>>1;init(nd*2,b,m);init(nd*2+1,m+1,e);UDT(nd);}void Add2(int nd, int x){K[nd]+=x;S[nd]*= po[x];}void Spread(int nd){//printf("sp\n");Add2(nd*2,K[nd]);Add2(nd*2+1,K[nd]);K[nd]=0;}void Add(int nd, int b, int e, int s, int l, int x){if(s>l)return;if(s<=b&&e<=l){Add2(nd,x);return;}Spread(nd);int m = (b+e)>>1;if(s<=m)Add(nd*2,b,m,s,l,x);if(l>m)Add(nd*2+1,m+1,e,s,l,x);UDT(nd);}mint Sum(int nd, int b, int e, int s, int l){//printf("%d %d %d %d\n",b,e,s,l);if(s>l)return 0;if(s<=b&&e<=l)return S[nd];Spread(nd);int m = (b+e)>>1;mint r = 0;//printf("%d\n",nd);if(s<=m)r += Sum(nd*2,b,m,s,l);if(l>m)r += Sum(nd*2+1,m+1,e,s,l);//printf("o %d\n",nd);return r;}mint Get(int n, int a){mint t = Sum(1,1,n,a,n);mint z = Sum(1,1,n,a,a);//printf("%d %d\n",t.v,z.v);return t/z;}}T1,T2;int main(){cin.tie(0);ios::sync_with_stdio(0);cout<<fixed<<setprecision(20);Scanner sc(stdin);Printer pr(stdout);int n;po[0]=1;rep(i,SZ-1)po[i+1]=po[i]*2;sc.read(n);vi w(n+1);vc<pii>A;rng(i,1,n){sc.read(w[i]);A.pb({w[i],i});}sort(all(A));T1.init(1,1,n);T2.init(1,1,n);mint res=0;rep(i,n){int a = A[i].se;mint r1 = T1.Get(n,a);mint r2 = T2.Get(n,n-a+1);res += r1*r2*w[a];T1.Add(1,1,n,a,n,1);T2.Add(1,1,n,n-a+1,n,1);}printf("%d\n",res.v);}