社区讨论
TLE 2个 90pts 求助
P8593「KDOI-02」一个弹的投参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lpfjk0r8
- 此快照首次捕获于
- 2023/11/26 21:54 2 年前
- 此快照最后确认于
- 2023/11/27 12:55 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
const double g = 9.8;
int n,m,a[N],b[N],x,y,v;
struct node{
int x,y,pos;
double xt;
}d[N];
struct fnode{
int weili,jianshao;
}f[N];
struct ffnode{
int weili,jianshao;
}ff[N];
int lowbit(int x){
return x&(-x);
}
int getsum(int x){
int sum=0;
while(x>0){
sum+=b[x];
x-=lowbit(x);
}
return sum;
}
void add(int x,int y){
while(x<=n){
b[x]+=y;
x+=lowbit(x);
}
}
bool cmp1(node a,node b){
if(a.y==b.y) return a.x<b.x;
return a.y<b.y;
}
bool cmp3(node a,node b){
return a.xt<b.xt;
}
bool cmp4(ffnode a,ffnode b){
return (a.weili-a.jianshao>0? a.jianshao:a.weili)>(b.weili-b.jianshao>0? b.jianshao:b.weili);
}
map<int,int>mp;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x>>y>>v;
d[i].y=y;
d[i].x=x;
d[i].xt=x*1.0+v*1.0*sqrt(2.0*y/g);
mp[d[i].x]=i;
}
sort(d+1,d+n+1,cmp3);
d[1].pos=1;
int pos=1;
for(int i=2;i<=n;i++){
if(d[i].xt-d[i-1].xt<=0.000000001){
d[i].pos=d[i-1].pos;
}else{
d[i].pos=++pos;
}
}
sort(d+1,d+n+1,cmp1);//排序
for(int i=1;i<=n;i++){
int j=i;
while(d[j].y==d[j+1].y) j++;
for(int k=i;k<=j;k++){
f[k].weili=k-i-getsum(d[k].pos);
add(d[k].pos,1);
}
for(int k=i;k<=j;k++){add(d[k].pos,-1);}
for(int k=j;k>=i;k--){
f[k].weili+=getsum(d[k].pos);
add(d[k].pos,1);
}
for(int k=j;k<=i;k++){add(d[k].pos,-1);}
i=j;
}
for(int i=1;i<=n;i++){cin>>ff[i].jianshao;}
for(int i=1;i<=n;i++){
ff[mp[d[i].x]].weili=f[i].weili;
}
sort(ff+1,ff+n+1,cmp4);
long long ans=0;
for(int i=1;i<=m;i++){ff[i].weili=max(0,ff[i].weili-ff[i].jianshao);}
for(int i=1;i<=n;i++){ans+=(long long)ff[i].weili;}
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...