社区讨论

人生第一次没有过B

学术版参与者 16已保存回复 19

讨论操作

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

当前回复
19 条
当前快照
1 份
快照标识符
@lqi3zqj9
此快照首次捕获于
2023/12/23 21:41
2 年前
此快照最后确认于
2023/12/24 08:35
2 年前
查看原帖
求问刚才 AT 的 B 题,是我的思路有什么问题吗?
思路大概是:先看 llrr 是不是在树上,在计算中间的数目。然后如果它们都不在树上,将 llrr 左移到最近的那一个有树的地方,在看其中有多少个树。如果有任意一个点在树上,如果都在树上就特判一些,其它直接套公式。
结果过了 1919 个数据,就一个死活没有过,求代码纠错或者新的思路。
代码如下:
CPP
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
long long a,m,l,r;
long long ans;
int flag1,flag2;
int main(){
	cin>>a>>m>>l>>r;
	if(abs(l-a)%m==0){
		//cout<<"kkk!\n";
		ans++;
		flag1=1;
	}
	if(abs(r-a)%m==0){
		//cout<<"si!\n";
		ans++;
		flag2=1;
	}
	if(flag1==0&&flag2==0){
		if(l<a){
		    l=l-(m-abs(l-a)%m);
		}
		else{
			l=l-abs(l-a)%m;
		}
		if(r<a){
		    r=r-(m-abs(r-a)%m);
		}
		else{
			r=r-abs(r-a)%m;
		}
		//cout<<l<<" "<<r<<"\n";
		if(l!=r) ans=ans+(r-l)/m;
	}
	else{
		if(flag1==1&&flag2==1){
			ans=ans+(r-l)/m-1;
		}
		else ans=ans+(r-l)/m;
	}
	/*if(flag1==0&&flag2==0){
		//cout<<"yep!\n";
		if(l!=r) ans=ans+(r-l)/m+1;
	}
	else{
		ans=ans+(r-l)/m;
	}*/
	if(flag1==1&&flag2==1&&l==r) ans--;
	cout<<ans<<"\n";
	return 0;
}
本来以为这次只能做完 DD 结果没想到做完了 EE 但是 BB 没过。。。。。。

回复

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

正在加载回复...