其他测试点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]);
}