solution

括弧列はnest深さの配列をsegment木とかで区間min取って二分探索する感じのが典型(典型)。 その方向で上手くやればできる。 しかも今回はよく見るとstack一本で十分(ありがち)で$O(|S|)$

implementation

#include <bits/stdc++.h>
using ll = long long;
using namespace std;

int main() {
    // input
    string s; cin >> s;

    // solve
    map<int, int> stk;
    int nest = 0;
    ll answer = 0;
    for (char c : s) {
        if (c == '(') {
            stk[nest] += 1;
            ++ nest;
        } else {
            stk[nest] = 0;
            -- nest;
            answer += stk[nest];
        }
    }

    // output
    cout << answer << endl;
    return 0;
}