Beispiel #1
0
 void add(char c)
 {
     if (!bits.bit_at(c - 'a'))
     {
         bits.turn_on(c - 'a');
         next[c - 'a'] = new node();
     }
 }
Beispiel #2
0
void dfs(int v, int u, int d, int &idx)
{
    if(v) {
        dep[v] = d;
        par[v][0] = u;
        int k = 0;
        while(par[par[v][k]][k] >= 0) {
            par[v][k+1] = par[par[v][k]][k];
            k++;
        }
        up.add(idx,1);
        down.add(idx,1);
    }
    in[v] = idx++;
    for(auto &e: G[v])
        if(e.first != u) dfs(e.first, v, d+1, idx);

    if(v) {
        up.add(idx,-1);
        down.add(idx,-1);
    }
    out[v] = idx++;
}
Beispiel #3
0
int main() {
    freopen ("life.out", "w", stdout);
    while (scanf ("%d", &n) != EOF) {
        scanf ("%lf%lf", &l, &r);
        int cnt1 = 0, cnt2 = 0;
        for (int i = 0; i < n; ++i) {
            line li;
            li.input();
            if (sgn(li.a.x - li.b.x) == 0) {
                if (sgn(li.a.x - l) > 0 && sgn(li.a.x - r) < 0)
                    ++cnt2;
            }
            else {
                pl[cnt1] = cal(li, l);
                pr[cnt1] = cal(li, r);
                hr[cnt1] = pr[cnt1];
                id[cnt1] = cnt1;
                ++cnt1;
            }
        }
        sort (id, id + cnt1, comp);
        sort (hr, hr + cnt1);
        int ans = 0;
        n = unique(hr, hr + cnt1) - hr;
        t.clear();
        for (int i = 0; i < cnt1; ++i) {
            int pid = lower_bound(hr, hr + n, pr[id[i]]) - hr + 1;
            ans += t.getsum(pid);
            t.update(pid + 1, 1);
        }
        ans += cnt1 * cnt2;
        printf ("%d\n", ans);
    }
    
    return 0;
}
Beispiel #4
0
void solve()
{
    build_tree();
    char c;
    int u, v, w, r, s, t;
    while(m--) {
        cin >> c;
        if(c == 'I') {
            cin >> r >> s >> t;
            r--;
            u = es[r].first;
            v = es[r].second;
            if(dep[v] > dep[u]) {
                swap(u,v);
                swap(s,t);
            }
            up.add(in[u], -dist[r][0]+s);
            up.add(out[u], dist[r][0]-s);
            down.add(in[u], -dist[r][1]+t);
            down.add(out[u], dist[r][1]-t);
            dist[r][0] = s;
            dist[r][1] = t;
        }
        else {
Beispiel #5
0
int main ()
{
    int kase; for (scanf("%d", &kase); kase; --kase)
    {
        int n; scanf("%d", &n); 
        for (int i = n - 1; i >= 0; i--)
        {
            scanf("%d", &arr[i]);
            tmp[i] = pii(arr[i], i);
        }
        sort(tmp, tmp + n); int mr = 1;
        for (int i = 0; i < n; i++)
        {
            if (i == 0 || tmp[i].X != tmp[i - 1].X) idx[i] = mr++;
            else idx[i] = idx[i - 1];
            if (i == 0) prev[tmp[i].Y] = -1;
            else if (tmp[i].X != tmp[i - 1].X) prev[tmp[i].Y] = tmp[i - 1].Y;
            else prev[tmp[i].Y] = prev[tmp[i - 1].Y];
        }
        for (int i = 0; i < n; i++) arr[i] = bf(arr[i], n);
        fq.clear(), gq.clear();
        for (int i = 0; i < n; i++)
        {
            int kk = mr - arr[i];
            dpf[i] = fq.query(kk) + 1;
            fq.update(kk, dpf[i]);
        }
        memset(maxg, 0, sizeof maxg);
        for (int i = 0; i < n; i++)
        {
            int kk = arr[i];
            dpg[i] = gq.query(kk) + 1;
            gq.update(kk, dpg[i]);
            maxg[arr[i]] = dpg[i];
        }
        for (int i = 1; i < mr; i++) maxg[i] = max(maxg[i], maxg[i - 1]);
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            ans = max(ans, dpf[i] + (arr[i] == 0 ? 0 : maxg[arr[i] - 1]));
            ans = max(ans, dpg[i]);
        }
        printf("%d\n", ans);
    }
    return 0;
}
Beispiel #6
0
 int reduce(bool t) {
     if(child) {
         return child->reduce(data)+(data!=t)?1:0;
     }
     else return(data!=t)?1:0;
 }