답안 #345844

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
345844 2021-01-08T09:45:51 Z Ruxandra985 Election (BOI18_election) C++14
0 / 100
8 ms 492 KB
#include <bits/stdc++.h>
#define DIMN 500010
using namespace std;
int v[DIMN];
pair <int , int> cod[DIMN];
deque <int> dqr , dql;
struct segm_tree{
    int l , r , lmax , rmin;
} aint[4 * DIMN];

int sol;

void build (int nod ,int st,int dr){
    int mid = (st + dr)/2;
    if (st == dr){

        aint[nod].lmax = aint[nod].l = cod[st].first;
        aint[nod].rmin = aint[nod].r = cod[st].second;

        return;
    }

    build (2*nod,st,mid);
    build (2*nod+1,mid+1,dr);

    aint[nod].l = min(aint[2 * nod].l , aint[2 * nod + 1].l);
    aint[nod].lmax = max(aint[2 * nod].lmax , aint[2 * nod + 1].lmax);


    aint[nod].r = max(aint[2 * nod].r , aint[2 * nod + 1].r);
    aint[nod].rmin = min(aint[2 * nod].rmin , aint[2 * nod + 1].rmin);

}

void query (int nod , int st , int dr , int l , int r){
    int mid = (st + dr)/2;

    if (l <= st && dr <= r){ /// sunt in interval bun

        if (aint[nod].lmax < l || aint[nod].rmin > r){ /// tot intervalul e prost

            sol += (dr - st + 1);
            return;

        }
        if (aint[nod].l >= l && aint[nod].r <= r) /// tot intervalul e bun
            return;

        /// o parte din interval e buna si alta e proasta

        query(2 * nod , st , mid , l , r);
        query(2 * nod + 1, mid + 1 , dr , l , r);


    }
    else {

        if (l <= mid)
            query(2 * nod , st , mid , l , r);
        if (mid + 1 <= r)
            query(2 * nod + 1 , mid + 1 , dr , l , r);

    }


}

int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n, q , i , l , r;
    char c;
    fscanf (fin,"%d\n",&n);
    for (i = 1 ; i <= n ; i++){
        c=fgetc (fin);
        if (c == 'C')
            v[i] = 1;
        else v[i] = -1;
    }

    for (i = n ; i ; i--){
        if (v[i] == 1)
            dqr.push_back(i);
    }

    for (i = 1 ; i <= n ; i++){
        if (v[i] == 1){

            cod[i] = make_pair(i , i);
            dql.push_back(i);

        }
        else {

            if (dql.empty())
                l = 0;
            else {
                l = dql.back();
                dql.pop_back();
            }

            while (!dqr.empty() && dqr.front() < i)
                dqr.pop_front();

            if (dqr.empty())
                r = n + 1;
            else {
                r = dqr.front();
                dqr.pop_front();
            }

            cod[i] = make_pair(l , r);
        }
    }

    build (1 , 1 , n);

    fscanf (fin,"%d",&q);
    for (;q;q--){
        fscanf (fin,"%d%d",&l,&r);
        /// anulezi orice pct din l r care are unul sau doua capete in afara lui l r

        sol = 0;
        query (1 , 1 , n , l , r);

        fprintf (fout,"%d\n",sol);

    }
    return 0;
}

Compilation message

election.cpp: In function 'int main()':
election.cpp:74:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   74 |     fscanf (fin,"%d\n",&n);
      |     ~~~~~~~^~~~~~~~~~~~~~~
election.cpp:119:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  119 |     fscanf (fin,"%d",&q);
      |     ~~~~~~~^~~~~~~~~~~~~
election.cpp:121:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  121 |         fscanf (fin,"%d%d",&l,&r);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 492 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 492 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 492 KB Output isn't correct
2 Halted 0 ms 0 KB -