社区讨论
人生第一次没有过B
学术版参与者 16已保存回复 19
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 19 条
- 当前快照
- 1 份
- 快照标识符
- @lqi3zqj9
- 此快照首次捕获于
- 2023/12/23 21:41 2 年前
- 此快照最后确认于
- 2023/12/24 08:35 2 年前
求问刚才 AT 的 B 题,是我的思路有什么问题吗?
思路大概是:先看 和 是不是在树上,在计算中间的数目。然后如果它们都不在树上,将 和 左移到最近的那一个有树的地方,在看其中有多少个树。如果有任意一个点在树上,如果都在树上就特判一些,其它直接套公式。
结果过了 个数据,就一个死活没有过,求代码纠错或者新的思路。
代码如下:
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;
}
本来以为这次只能做完 结果没想到做完了 但是 没过。。。。。。
回复
共 19 条回复,欢迎继续交流。
正在加载回复...