求问刚才 AT 的 B 题,是我的思路有什么问题吗?
思路大概是:先看 l 和 r 是不是在树上,在计算中间的数目。然后如果它们都不在树上,将 l 和 r 左移到最近的那一个有树的地方,在看其中有多少个树。如果有任意一个点在树上,如果都在树上就特判一些,其它直接套公式。
结果过了 19 个数据,就一个死活没有过,求代码纠错或者新的思路。
代码如下:
#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;
}
本来以为这次只能做完 D 结果没想到做完了 E 但是 B 没过。。。。。。