比赛 |
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;
}