比赛 2024暑假C班集训B 评测结果 AAATAATTAAAAAAAATAAA
题目名称 天天爱射击 最终得分 80
用户昵称 flyfree 运行时间 46.488 s
代码语言 C++ 内存使用 84.33 MiB
提交时间 2024-07-11 11:43:22
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10000010
#define MAXM 200010
int l[MAXN],r[MAXN],cnt[MAXN],s[MAXN][5],root[MAXM],ans[MAXM],hrd[MAXM];
int n,m,idx,bj;
int qs_l[MAXM],qs_r[MAXM];
void build(int lz,int rz,int p){
    l[p]=lz,r[p]=rz;
    if(lz==rz)return;
    int mid=(lz+rz)/2;
    s[p][0]=++idx;
    build(lz,mid,idx);
    s[p][1]=++idx;
    build(mid+1,rz,idx);
}
void add_(int p,int q,int num){
//    cout<<p<<" "<<q<<" "<<l[q]<<" "<<r[q]<<endl;
    cnt[p]=cnt[q]+1,l[p]=l[q],r[p]=r[q];
    if(l[p]==r[p])return;
    int mid=(l[p]+r[p])/2;
    if(num<=mid){
        s[p][0]=++idx;
        s[p][1]=s[q][1];
        add_(idx,s[q][0],num);
    }else{
        s[p][1]=++idx;
        s[p][0]=s[q][0];
        add_(idx,s[q][1],num);
    }
}
int cz(int now,int lz,int rz){
//    cout<<now<<" "<<lz<<" "<<rz<<endl;
    if(l[now]>=lz&&r[now]<=rz)return cnt[now];
    int mid=(l[now]+r[now])/2,ansz=0;
    if(lz<=mid)ansz+=cz(s[now][0],lz,rz);
    if(rz>mid)ansz+=cz(s[now][1],lz,rz);
    return ansz;
}
int main(){
    freopen("shooting.in","r",stdin);
    freopen("shooting.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
//        cin>>qs_l[i]>>qs_r[i]>>hrd[i];
        scanf("%d%d%d",&qs_l[i],&qs_r[i],&hrd[i]);
        bj=max(bj,qs_r[i]);
    }
    root[0]=++idx;
    build(1,bj,idx);
    for(int i=1;i<=m;i++){
        int x;
        scanf("%d",&x);
        root[i]=++idx;
//        cout<<i<<" "<<x<<endl; 
        if(x<=bj)add_(root[i],root[i-1],x);
    }
    for(int i=1;i<=n;i++){
        int lz=1,rz=m+1;
        while(lz<rz){
//            cout<<lz<<" "<<rz<<endl;
            int mid=(lz+rz)/2;
            if(cz(root[mid],qs_l[i],qs_r[i])>=hrd[i])rz=mid;
            else lz=mid+1;
        }
        ans[lz]++;
    }
    for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
//    return cerr<<clock()<<"ms"<<endl,0;
    return 0;
}