結果
問題 | No.1031 いたずら好きなお姉ちゃん |
ユーザー |
![]() |
提出日時 | 2020-04-17 21:59:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 93 ms / 3,500 ms |
コード長 | 2,554 bytes |
コンパイル時間 | 4,483 ms |
コンパイル使用メモリ | 224,856 KB |
最終ジャッジ日時 | 2025-01-09 19:59:44 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:122:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 122 | scanf("%d",&n); | ~~~~~^~~~~~~~~ main.cpp:124:24: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 124 | rep(i, n) scanf("%d", &vi[i]); | ~~~~~^~~~~~~~~~~~~~
ソースコード
//Let's join Kaede Takagaki Fan Club !!#include <bits/stdc++.h>#include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp>using namespace std;typedef long long ll;typedef pair<int,int> P;typedef pair<int,P> P1;typedef pair<P,P> P2;#define pu push#define pb push_back#define mp make_pair#define eps 1e-7#define INF 1000000000#define fi first#define sc second#define rep(i,x) for(int i=0;i<x;i++)#define repn(i,x) for(int i=1;i<=x;i++)#define SORT(x) sort(x.begin(),x.end())#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())#define all(x) x.begin(),x.end()template<class T>void dmp(T a){rep(i,a.size()) cout << a[i] << " ";cout << endl;}template<class T>bool chmax(T&a, T b){if(a < b){a = b;return 1;}return 0;}template<class T>bool chmin(T&a, T b){if(a > b){a = b;return 1;}return 0;}template<class T>void g(T &a){cin >> a;}template<class T>void o(const T &a,bool space=false){cout << a << (space?' ':'\n');}//ios::sync_with_stdio(false);const int mod = 1000000007;template<class T>void add(T&a,T b){a+=b;if(a >= mod) a-=mod;}struct RMQ{#define s (1<<18)int seg[s];void init(){memset(seg, 0, sizeof(seg));}void update(int k,int a){k+=s/2-1; seg[k]=a;while(k>0){k=(k-1)/2;seg[k]=(seg[k*2+1]+seg[k*2+2]);}}int query(int a,int b,int k,int l,int r){if(r<a || b<l) return 0;if(a<=l && r<=b) return seg[k];else{int vl=query(a,b,k*2+1,l,(l+r)/2);int vr=query(a,b,k*2+2,(l+r)/2+1,r);return (vl+vr);}}}rmq;ll ans;vector<int>vec[100005];void solve(vector<int>vi){int n = vi.size();vector<int>mx(n), mn(n);stack<P>st;rep(i, n){while(st.size() && st.top().fi < vi[i]){mx[st.top().sc] = i-1;st.pop();}st.push(mp(vi[i],i));}while(st.size()) { mx[st.top().sc] = n-1; st.pop(); }for(int i=n-1;i>=0;i--){while(st.size() && st.top().fi > vi[i]){mn[st.top().sc] = i+1;st.pop();}st.push(mp(vi[i],i));}while(st.size()) { mn[st.top().sc] = 0; st.pop(); }rep(i, n){vec[i].clear();}rep(i, n) vec[mn[i]].pb(i);rmq.init();for(int i=n-1;i>=0;i--){for(auto at:vec[i+1]) rmq.update(at, 0);int L = i, R = mx[i];ans += rmq.query(L, R, 0, 0, s/2-1);rmq.update(i, 1);}}int main(){int n;scanf("%d",&n);vector<int>vi(n);rep(i, n) scanf("%d", &vi[i]);solve(vi);reverse(all(vi));solve(vi);o(ans);}