社区讨论

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 条回复,欢迎继续交流。

正在加载回复...