人生第一次没有过B
  • 板块学术版
  • 楼主skyskyCCC
  • 当前回复19
  • 已保存回复19
  • 发布时间2023/12/23 21:40
  • 上次更新2023/12/24 08:35:40
查看原帖
人生第一次没有过B
541739
skyskyCCC楼主2023/12/23 21:40

求问刚才 AT 的 B 题,是我的思路有什么问题吗?

思路大概是:先看 ll 和 rr 是不是在树上,在计算中间的数目。然后如果它们都不在树上,将 ll 和 rr 左移到最近的那一个有树的地方,在看其中有多少个树。如果有任意一个点在树上,如果都在树上就特判一些,其它直接套公式。

结果过了 1919 个数据,就一个死活没有过,求代码纠错或者新的思路。

代码如下:

#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 没过。。。。。。

2023/12/23 21:40
加载中...