답안 #621439

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
621439 2022-08-03T19:33:52 Z Iwanttobreakfree Examination (JOI19_examination) C++17
22 / 100
313 ms 34156 KB
#include <iostream>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
#define pii pair<int,int>
unordered_map<int,int> mp_m,mp_i,mp_a,av;
vector<int> BIT,cnt;
int sz=400,ans=0,n,q;
int next(int x){return x + (x&(-x));}
int par(int x){return x - (x&(-x));}
bool cmp(pair<int,pair<pii,pii>>& a,pair<int,pair<pii,pii>>& b){
    if(a.first!=b.first)return a.first<b.first;
    return a.second.first.second>b.second.first.second;
}
int bin_find(int x,vector<int>& v){
    int l=0,r=v.size()-1,ans=v.size();
    while(l<=r){
        int mid=(r+l)/2;
        if(v[mid]<x)l=mid+1;
        else {
            ans=mid;
            r=mid-1;
        }
    }
    return ans;
}
void pupd(int x,int k){
    //cout<<x<<' '<<k<<'\n';
    for(int i=x;i<BIT.size();i=next(i))BIT[i]+=k;
}
int sum(int x){
    int ans=0;
    for(int i=x;i>0;i=par(i)){
        ans+=BIT[i];
        //cout<<i<<' '<<BIT[i]<<'\n';
    }
    return ans;
}
int val(int l,int r){
    return sum(r)-sum(l);
}
void add(int i,vector<vector<int>>& g,vector<int>& exam){
    //cout<<i<<' ';
    for(int x:g[i]){
        cnt[x]++;
        if(cnt[x]==2){
            if(n<3001&&q<3001)pupd(mp_a[exam[x]]+1,+1);
            ans++;
        }
    }
    //cout<<ans<<' '<<'\n';
}
void del(int i,vector<vector<int>>& g,vector<int>& exam){
    //cout<<i<<' ';
    for(int x:g[i]){
        if(cnt[x]==2){
            if(n<3001&&q<3001)pupd(mp_a[exam[x]]+1,-1);
            ans--;
        }
        cnt[x]--;
    }
    //cout<<ans<<'\n';
}
vector<vector<int>> math,info;
void MO(vector<int>& m,vector<int>& in,vector<int>& av,vector<int>& exam){
    int x,y,z;
    vector<pair<int,pair<pii,pii>>> qu(q);
    vector<int> answer(q);
    for(int i=0;i<q;i++){
        cin>>x>>y>>z;
        //cout<<x<<' '<<y<<' '<<z<<'\n';
        qu[i]={x/sz,{{x,y},{z,i}}};
    }
    sort(qu.begin(),qu.end(),cmp);
    int l_math=m.size(),l_info=in.size();
    m.push_back(1e9+7);
    in.push_back(1e9+7);
    for(int i=0;i<q;i++){
        int min_math=qu[i].second.first.first,min_info=qu[i].second.first.second,min_av;
        if(n<3001&&q<3001)min_av=bin_find(qu[i].second.second.first,av);
        else min_av=0;
        //cout<<min_math<<' '<<min_info<<'\n';
        if(min_av==av.size()){
            answer[qu[i].second.second.second]=0;
            continue;
        }
        //cout<<l_math<<' '<<l_info<<'\n';
        while(l_math>0&&m[l_math]>min_math){
            l_math--;
            add(l_math,math,exam);
        }
        while(l_math+1<m.size()&&m[l_math]<min_math){
            del(l_math,math,exam);
            l_math++;
        }
        //cout<<l_math<<' '<<l_info<<'\n';
        while(l_info>0&&in[l_info]>min_info){
            l_info--;
            //cout<<l_info<<' ';
            add(l_info,info,exam);
        }
        //cout<<l_info<<' ';
        while(l_info+1<in.size()&&in[l_info]<min_info){
            del(l_info,info,exam);
            l_info++;
        }
        //cout<<l_math<<' '<<l_info<<' '<<qu[i].second.second<<' '<<ans<<' '<<sum(min_av)<<'\n';
        answer[qu[i].second.second.second]=ans-sum(min_av);
    }
    for(int i=0;i<q;i++)cout<<answer[i]<<'\n';
}
int main(){
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int x,y;
    cin>>n>>q;
    set<int> m,in,av;
    cnt=vector<int>(n);
    vector<int> exam_math(n),exam_info(n),exam_av(n),a,b,c;
    for(int i=0;i<n;i++){
        cin>>x>>y;
        m.insert(x);
        in.insert(y);
        av.insert((x+y));
        exam_math[i]=x;
        exam_info[i]=y;
        exam_av[i]=(x+y);
    }
    mp_m.reserve(131072);
    mp_i.reserve(131072);
    mp_a.reserve(131072);
    int cntm=0,cnti=0,cnta=0;
    for(int x:m){
        mp_m[x]=cntm;
        cntm++;
        a.push_back(x);
    }
    for(int x:in){
        mp_i[x]=cnti;
        cnti++;
        b.push_back(x);
    }
    for(int x:av){
        mp_a[x]=cnta;
        cnta++;
        c.push_back(x);
    }
    BIT=vector<int> (max(cnta,cnti)+1);
    math=vector<vector<int>> (cntm,vector<int>());
    info=vector<vector<int>> (cnti,vector<int>());
    for(int i=0;i<n;i++){
        math[mp_m[exam_math[i]]].push_back(i);
        info[mp_i[exam_info[i]]].push_back(i);
    }
    if(n<3001&&q<3001)MO(a,b,c,exam_av);
    else{
        int z;
        vector<pair<pii,pii>> qu(q);
        for(int i=0;i<q;i++){
            cin>>x>>y>>z;
            qu[i]={{x,y},{z,i}};
        }
        int j=cntm;
        vector<int> answer(q);
        sort(qu.rbegin(),qu.rend());
        //for(int i=0;i<n;i++)pupd(1+mp_i[exam_info[i]],1);
        for(int i=0;i<q;i++){
            int min_math=bin_find(qu[i].first.first,a),min_info=bin_find(qu[i].first.second,b);
            //cout<<min_math<<' '<<min_info<<'\n';
            //cout<<sum(BIT.size()-1)<<'\n';
            while(j>min_math){
                j--;
                for(int student:math[j])pupd(1+mp_i[exam_info[student]],+1);
            }
            answer[qu[i].second.second]=val(min_info,BIT.size()-1);
        }
        for(int i=0;i<q;i++)cout<<answer[i]<<'\n';
    }
}

Compilation message

examination.cpp: In function 'void pupd(int, int)':
examination.cpp:32:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |     for(int i=x;i<BIT.size();i=next(i))BIT[i]+=k;
      |                 ~^~~~~~~~~~~
examination.cpp: In function 'void MO(std::vector<int>&, std::vector<int>&, std::vector<int>&, std::vector<int>&)':
examination.cpp:86:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |         if(min_av==av.size()){
      |            ~~~~~~^~~~~~~~~~~
examination.cpp:95:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |         while(l_math+1<m.size()&&m[l_math]<min_math){
      |               ~~~~~~~~^~~~~~~~~
examination.cpp:106:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |         while(l_info+1<in.size()&&in[l_info]<min_info){
      |               ~~~~~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3540 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 2 ms 3516 KB Output is correct
4 Correct 2 ms 3412 KB Output is correct
5 Correct 2 ms 3520 KB Output is correct
6 Correct 2 ms 3540 KB Output is correct
7 Correct 134 ms 4884 KB Output is correct
8 Correct 119 ms 4880 KB Output is correct
9 Correct 119 ms 4900 KB Output is correct
10 Correct 76 ms 4452 KB Output is correct
11 Correct 82 ms 4448 KB Output is correct
12 Correct 53 ms 3748 KB Output is correct
13 Correct 131 ms 4868 KB Output is correct
14 Correct 124 ms 4872 KB Output is correct
15 Correct 123 ms 4868 KB Output is correct
16 Correct 225 ms 4408 KB Output is correct
17 Correct 233 ms 4436 KB Output is correct
18 Correct 45 ms 3664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 313 ms 33732 KB Output is correct
2 Correct 262 ms 33688 KB Output is correct
3 Correct 312 ms 33852 KB Output is correct
4 Correct 155 ms 24028 KB Output is correct
5 Correct 165 ms 24008 KB Output is correct
6 Correct 72 ms 9904 KB Output is correct
7 Correct 288 ms 33620 KB Output is correct
8 Correct 259 ms 33636 KB Output is correct
9 Correct 260 ms 33572 KB Output is correct
10 Correct 159 ms 23620 KB Output is correct
11 Correct 131 ms 23720 KB Output is correct
12 Correct 51 ms 9164 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 313 ms 33732 KB Output is correct
2 Correct 262 ms 33688 KB Output is correct
3 Correct 312 ms 33852 KB Output is correct
4 Correct 155 ms 24028 KB Output is correct
5 Correct 165 ms 24008 KB Output is correct
6 Correct 72 ms 9904 KB Output is correct
7 Correct 288 ms 33620 KB Output is correct
8 Correct 259 ms 33636 KB Output is correct
9 Correct 260 ms 33572 KB Output is correct
10 Correct 159 ms 23620 KB Output is correct
11 Correct 131 ms 23720 KB Output is correct
12 Correct 51 ms 9164 KB Output is correct
13 Incorrect 292 ms 34156 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3540 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 2 ms 3516 KB Output is correct
4 Correct 2 ms 3412 KB Output is correct
5 Correct 2 ms 3520 KB Output is correct
6 Correct 2 ms 3540 KB Output is correct
7 Correct 134 ms 4884 KB Output is correct
8 Correct 119 ms 4880 KB Output is correct
9 Correct 119 ms 4900 KB Output is correct
10 Correct 76 ms 4452 KB Output is correct
11 Correct 82 ms 4448 KB Output is correct
12 Correct 53 ms 3748 KB Output is correct
13 Correct 131 ms 4868 KB Output is correct
14 Correct 124 ms 4872 KB Output is correct
15 Correct 123 ms 4868 KB Output is correct
16 Correct 225 ms 4408 KB Output is correct
17 Correct 233 ms 4436 KB Output is correct
18 Correct 45 ms 3664 KB Output is correct
19 Correct 313 ms 33732 KB Output is correct
20 Correct 262 ms 33688 KB Output is correct
21 Correct 312 ms 33852 KB Output is correct
22 Correct 155 ms 24028 KB Output is correct
23 Correct 165 ms 24008 KB Output is correct
24 Correct 72 ms 9904 KB Output is correct
25 Correct 288 ms 33620 KB Output is correct
26 Correct 259 ms 33636 KB Output is correct
27 Correct 260 ms 33572 KB Output is correct
28 Correct 159 ms 23620 KB Output is correct
29 Correct 131 ms 23720 KB Output is correct
30 Correct 51 ms 9164 KB Output is correct
31 Incorrect 292 ms 34156 KB Output isn't correct
32 Halted 0 ms 0 KB -