RE in #8 求助,本机测试通过
查看原帖
RE in #8 求助,本机测试通过
643820
WangLianda楼主2023/2/23 14:53

其他测试点AC。

这里检测f数组是否等于0,因为取模的原因确实是有可能错的,但是其他人都是可以过的,而且取模错的话应该是WA。

从DKbzoj上下了数据,本机测试是可以通过的。

错误代码:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const long long mod=19940417;
int x[1000005],h[1000005];
int maxx[1000005][2]; 
long long f[1000005][2];
long long t[1000005];
inline long long g(int x) {
	if(!x) return 1;
	if(x<0) return 0;
	return t[x-1];
}
inline long long G(int x) {
	if(x<0) return 0;
	return t[x];
}
inline long long sum(int x) {
	if(x<0) return 0;
	return ((t[x+1]-1)%mod+mod)%mod;
}
pair<int,int> pii[1000005];
int main() {
	t[0]=1;
	for(int i=1;i<=1000000;i++) t[i]=(t[i-1]<<1)%mod;
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++) cin>>pii[i].first>>pii[i].second;
	pii[m]={0,0};
	m++;
	pii[m]={n,0};
	m++;
	sort(pii,pii+m);
	m=unique(pii,pii+m)-pii-1;
	for(int i=0;i<=m;i++) x[i]=pii[i].first,h[i]=pii[i].second;
//	cout<<"*"<<endl;
//	for(int i=0;i<=m;i++)
//		cout<<x[i]<<' '<<h[i]<<endl;
	f[0][0]=1;
	for(int i=1;i<=m;i++) {
		int p=x[i]-x[i-1]-h[i]-h[i-1];
		int k=p>>1;
		if(!h[i]&&!h[i-1]) 
			(f[i][0]+=g(k)*f[i-1][0])%=mod,
			maxx[i][0]=max(maxx[i-1][0],k);
		else if(h[i]-h[i-1]==x[i]-x[i-1]) 
			(f[i][1]+=f[i-1][1]+(!h[i-1]?f[i-1][0]:0))%=mod,
			maxx[i][1]=max({maxx[i-1][1],h[i],(!h[i-1]?maxx[i-1][0]:0)});
		else if(h[i-1]-h[i]==x[i]-x[i-1]) 
			(f[i][0]+=f[i-1][0]+f[i-1][1])%=mod,
			maxx[i][0]=max({maxx[i-1][0],h[i-1],maxx[i-1][1]});
		else {
			if(!h[i])
				(f[i][0]+=g(k)*f[i-1][0]+(g(k)+G(k-1))*f[i-1][1])%=mod,
				maxx[i][0]=max({maxx[i-1][0],maxx[i-1][1],(x[i]-x[i-1]+h[i-1])>>1});
			else if(!h[i-1])
				(f[i][1]+=g(k)*f[i-1][0])%=mod,
				(f[i][0]+=G(k-1)*f[i-1][0])%=mod,
				maxx[i][1]=max(maxx[i-1][0],(x[i]-x[i-1]-h[i])>>1),
				maxx[i][0]=max(maxx[i-1][0],(x[i]-x[i-1]+h[i])>>1);
			else {
				if(f[i-1][1]) 
					(f[i][0]+=f[i-1][1])%=mod,
					maxx[i][0]=max(maxx[i][0],maxx[i-1][1]);
				if(f[i-1][0]*g(k)) 
					(f[i][1]+=f[i-1][0]*g(k))%=mod,
					maxx[i][1]=max(maxx[i][1],maxx[i-1][0]);
				if(f[i-1][0]*G(k-1)) 
					(f[i][0]+=f[i-1][0]*G(k-1))%=mod,
					maxx[i][0]=max(maxx[i][0],maxx[i-1][0]);
				if(f[i-1][1]*sum(k-1)) 
					(f[i][0]+=f[i-1][1]*sum(k-1))%=mod,
					maxx[i][0]=max(maxx[i][0],maxx[i-1][1]);
				if(f[i-1][1]*(g(k)+G(k-1)))
					(f[i][1]+=f[i-1][1]*(g(k)+G(k-1)))%=mod,
					maxx[i][1]=max(maxx[i][1],maxx[i-1][1]);
				if(f[i][1]) 
					maxx[i][1]=max(maxx[i][1],(x[i]-x[i-1]-h[i]+h[i-1])>>1); 
				if(f[i][0]) 
					maxx[i][0]=max(maxx[i][0],(x[i]-x[i-1]+h[i]+h[i-1])>>1);
			}
		}
	}
//	for(int i=0;i<=m;i++) 
//		cout<<i<<':'<<f[i][0]<<"("<<maxx[i][0]<<")"<<' '<<f[i][1]<<"("<<maxx[i][1]<<")"<<endl;
	cout<<(f[m][0]+f[m][1])%mod<<' '<<max(maxx[m][0],maxx[m][1]);
}
2023/2/23 14:53
加载中...