社区讨论

样例过了 10pts 求查错

P5317简单模拟参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo23l3ut
此快照首次捕获于
2023/10/23 07:26
2 年前
此快照最后确认于
2023/11/03 07:46
2 年前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct item{//物品 
	int sx,sly,sry,speed;//初始状态 
	int t;//出现时间
	int tag;//被第tag个操作标记 
	int score;//被第tag个操作标记可得的分数 
	int state;//状态 0=未出现,1=已出现,2=已标记,3=此时被标记,等待更优标记,4=已消失 
}items[2001];
struct oper{//事件 
	int time;//事件发生的时间 
	int sp;//生成物品的编号 
	int dsp;//消失物品的编号 
	int ta;//标记的编号 
	int uta;//取消标记的编号 
}opers[10001];
int tags_pos[2001];//第i个标记的位置 
int d0,s1,s2,w;//判定区间,基础得分,连击得分,最大失误次数
int cnt,n,m,debug_sum;//事件数,物品数,操作数 
int miss_cnt,dsp_cnt,combo,score,end_combo;//miss数,已消失数,连击数,分数,combo是否在本时刻中断 
inline long long read();
inline void write(long long x);
inline void read_all();
void miss(int now);
void sp(int now);
void ta(int now);
void uta(int now);
void change_state(int now);
bool cmp(oper x,oper y);
main(){
	read_all();
	sort(opers+1,opers+cnt+1,cmp);
	for(int id=1;id<=cnt;id++){
		end_combo=0;
		miss(id);//所有由移动造成的miss事件以某个顺序依次发生。
		sp(id);//在这一时刻出现的物体同时出现。
		ta(id);//所有标记造成的得分事件以某个顺序依次发生
		uta(id);//所有取消标记造成的得分事件以某个顺序依次发生+所有由操作造成的miss事件以某个顺序依次发生
		change_state(id);//所有物体的状态同时改变
	}
	return 0;
}
bool cmp(oper x,oper y){
	if(x.time!=y.time) return x.time<y.time;//时间
	if(x.dsp!=y.dsp) return x.dsp>y.dsp;//消失 
	if(x.sp!=y.sp) return x.sp>y.sp;//出现 
	if(x.ta!=y.ta) return x.ta>y.ta;//标记 
	return x.uta>y.uta; //取消 
}
inline void read_all(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		items[i].sx=read();
		items[i].sly=read();
		items[i].sry=read();
		items[i].t=read();
		items[i].speed=read();
		++cnt;
		opers[cnt].time=items[i].t;
		opers[cnt].sp=i;
		++cnt;
		int tmp=items[i].sly/items[i].speed+1;
		opers[cnt].time=items[i].t+tmp;
		opers[cnt].dsp=i;
	}
	for(int i=1;i<=m;i++){
		tags_pos[i]=read();
		int st=read();
		int ed=read();
		++cnt;
		opers[cnt].time=st;
		opers[cnt].ta=i;
		++cnt;
		opers[cnt].time=ed;
		opers[cnt].uta=i;
	}
	d0=read(),s1=read(),s2=read(),w=read();
}
inline long long read(){
	long long nn=0;
	int mm=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			mm=-1;
		}
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		nn=(nn<<3)+(nn<<1)+ch-'0';
		ch=getchar();
	}
	return nn*mm;
}
inline void write(long long x){
	if(x<0){
		x-=x+x;
		putchar('-');
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
void miss(int now){
	if(opers[now].dsp!=0){
		if(items[opers[now].dsp].state==1){
			end_combo=1;
//			printf("%d:%d miss at %d\n",opers[now].dsp,items[opers[now].dsp].state,opers[now].time);
			items[opers[now].dsp].state=4;
			miss_cnt++;
			dsp_cnt++;
		}
		if(miss_cnt>w){
//			printf("end by normal miss\n");
			printf("%d\n%d",score,opers[now].time);
			exit(0);
		}
	}
}
void sp(int now){
	if(opers[now].sp!=0){
		items[opers[now].sp].state=1;	
	}
}
void ta(int now){
	if(opers[now].ta!=0){
//		printf("Debug:tag (%d,0) at %d\n",tags_pos[opers[now].ta],opers[now].time);
		for(int i=1;i<=n;i++){
			if(items[i].state==1||items[i].state==3){
				int dis=(tags_pos[opers[now].ta]-items[i].sx)*(tags_pos[opers[now].ta]-items[i].sx)+(items[i].sly-items[i].speed*(opers[now].time-items[i].t))*(items[i].sly-items[i].speed*(opers[now].time-items[i].t));
				if(dis<=d0*d0){
//					printf("taged:%d\n",i);
					int tmp_score=(d0*d0-dis)*s1;
					if(items[i].state==1){
						items[i].score=tmp_score;
						items[i].tag=opers[now].ta;
						items[i].state=3;
						combo++;
						score+=combo*s2;
						//debug
//						debug_sum+=combo*s2;
					}
					if(items[i].score<tmp_score){
						score+=(tmp_score-items[i].score);
						items[i].score=tmp_score;
						items[i].tag=opers[now].ta;
					}
					if(items[i].score==tmp_score){
						if(tags_pos[opers[now].ta]<tags_pos[items[i].tag]){
							items[i].tag=opers[now].ta;
						}
					}
				}
			}
		} 	
	}
}
void uta(int now){
	if(opers[now].uta!=0){
//		printf("Debug:untag (%d,0) at %d\n",tags_pos[opers[now].uta],opers[now].time);
		for(int i=1;i<=n;i++){
			if(items[i].state==2&&items[i].tag==opers[now].uta){
				int dis=(tags_pos[opers[now].ta]-items[i].sx)*(tags_pos[opers[now].ta]-items[i].sx)+(items[i].sry-items[i].speed*(opers[now].time-items[i].t))*(items[i].sry-items[i].speed*(opers[now].time-items[i].t));
				if(dis<=d0*d0){
					int tmp_score=(d0*d0-dis)*s1;
					combo++;
					score+=tmp_score+combo*s2;
					//debug
//					debug_sum+=combo*s2;
				}
				else{
					end_combo=1;
					miss_cnt++;
				}
				items[i].state=4;
				dsp_cnt++;
			}
		} 	
	}
}
void change_state(int now){
	if(opers[now].time==opers[now+1].time) return ;
	if(opers[now].dsp!=0){
		if(items[opers[now].dsp].state==1){
			items[opers[now].dsp].state=4;
//			printf("miss at %d\n",opers[now].time);
			miss_cnt++;
			dsp_cnt++;
			end_combo=1;
		}
		if(miss_cnt>w){
//			printf("end by miss\n");
			printf("%d\n%d",score,opers[now].time);
			exit(0);
		}
	}
	if(dsp_cnt>=n){
//		printf("end normal\n");
		printf("%d\n%d",score,opers[now].time);
		exit(0);
	}
	if(end_combo==1){
		combo=0;
	}
	for(int i=1;i<=n;i++){
		if(items[i].state==3&&items[i].sly==items[i].sry){
			items[i].state=4;
			score+=items[i].score;
			dsp_cnt++;
			debug_sum+=items[i].score;
		}
		if(items[i].state==3&&items[i].sly!=items[i].sry){
			items[i].state=2;
			score+=items[i].score;
			debug_sum+=items[i].score;
		}
	}
//	printf("score sum:%d at %d\n",debug_sum,opers[now].time);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...