社区讨论
样例过了 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 条回复,欢迎继续交流。
正在加载回复...