Submission #36210772


Source Code Expand

//言い訳をすると,ICPC ルールでやってます
#include <bits/stdc++.h>

using namespace std;
#define rng(i,a,b) for(int i=(int)a;i<(int)b;i++)
#define rep(i,n) rng(i,0,n)
#define repn(i,n) rng(i,1,n+1)
#define gnr(i,a,b) for(int i=int(b)-1;i>=int(a);i--)
#define per(i,b) gnr(i,0,b)
using ll=long long;
#define int ll
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#define pb push_back
#define si(x) int(x.size())
#define tct template<class t>
#define tctu template<class t,class u>
tct using vc=vector<t>;
using vi=vc<int>;
tct using vvc=vc<vc<t>>;
#define a first
#define b second
using pi=pair<int,int>;
tctu bool chmin(t&a,u b){
	if(a>b){a=b;return true;}
	else return false;
}
tct ostream&operator<<(ostream&os,const vc<t>&vs){
	os<<"{";
	for(auto v:vs)os<<v<<",";
	return os<<"}";
}
tctu ostream&operator<<(ostream&os,pair<t,u> a){
	return os<<"P("<<a.a<<","<<a.b<<")";
}

using uint=unsigned;
const uint mod=998244353;
struct mint{
	uint v;
	mint(ll vv=0){s(vv%mod+mod);}
	mint& s(uint vv){
		v=vv<mod?vv:vv-mod;
		return *this;
	}
	mint operator-()const{return mint()-*this;}
	mint&operator+=(mint r){return s(v+r.v);}
	mint&operator-=(mint r){return s(v+mod-r.v);}
	mint&operator*=(mint r){v=(unsigned ll)v*r.v%mod; return *this;}
	mint&operator/=(mint r){return *this*=r.inv();}
	mint operator+(mint r)const{return mint(*this)+=r;}
	mint operator-(mint r)const{return mint(*this)-=r;}
	mint operator*(mint r)const{return mint(*this)*=r;}
	mint operator/(mint r)const{return mint(*this)/=r;}
	mint pow(ll n)const{
		if(n<0)return inv().pow(-n);
		mint res(1),x(*this);
		while(n){
			if(n&1)res*=x;
			x*=x;
			n>>=1;
		}
		return res;
	}
	mint inv()const{return pow(mod-2);}
};

const ll inf=LLONG_MAX/3;

int eval(pi a,int x){return a.a*x+a.b;}
int fdiv(int a,int b){
	return a/b-((a^b)<0 && a%b);
}
int cdiv(int a,int b){
	return a/b+((a^b)>0 && a%b);
}
int pos(const pi&a,const pi&b){
	return fdiv(a.b-b.b,b.a-a.a);
}
void push(vc<pi>&ls,const pi&a){
	while(si(ls)>=2){
		int s=si(ls);
		if(pos(ls[s-2],ls[s-1])<pos(ls[s-1],a))break;
		ls.pop_back();
	}
	ls.pb(a);
}

mint getsum(pi lw,pi up,int l,int r){
	up.a-=lw.a;
	up.b-=lw.b;
	int v=eval(up,l);
	int w=eval(up,r);
	if(v<0){
		if(w<0){
			return 0;
		}else{
			l+=cdiv(0-v,up.a);
		}
	}else{
		if(w<0){
			r-=cdiv(w-0,up.a);
		}else{
			//do nothing
		}
	}
	if(l<=r){
		return mint(eval(up,l)+eval(up,r)+2)*(r-l+1)/2;
	}else{
		return 0;
	}
}

void slv(){
	int n;cin>>n;
	vi l(n),r(n);
	rep(i,n)cin>>l[i];
	rep(i,n)cin>>r[i];
	
	vc<pi> lw,up;
	rep(i,n)push(lw,pi{i,l[i]});
	per(i,n)push(up,pi{i,r[i]});
	
	//cerr<<lw<<endl;
	//cerr<<up<<endl;
	
	const int dmax=(*max_element(all(r)))/(n-1)+10;
	
	int pre=-dmax;
	int i=0,j=0;
	mint ans=0;
	while(1){
		int lf=pre+1;
		int rt=dmax,tp=-1;
		if(i+1<si(lw)){
			int v=pos(lw[i],lw[i+1]);
			if(chmin(rt,v))tp=0;
		}
		if(j+1<si(up)){
			int v=pos(up[j],up[j+1]);
			if(chmin(rt,v))tp=1;
		}
		
		ans+=getsum(lw[i],up[j],lf,rt);
		
		if(tp==-1)break;
		pre=rt;
		if(tp==0)i++;
		else j++;
	}
	
	cout<<ans.v<<endl;
}

signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	
	slv();
}

Submission Info

Submission Time
Task G - Count Arithmetic Progression
User maroonrk
Language C++ (GCC 9.2.1)
Score 300
Code Size 3284 Byte
Status AC
Exec Time 135 ms
Memory 17784 KiB

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 100 / 100 200 / 200
Status
AC × 2
AC × 15
AC × 29
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
Subtask sample-01.txt, sample-02.txt, sub-01.txt, sub-02.txt, sub-03.txt, sub-04.txt, sub-05.txt, sub-06.txt, sub-max-ans.txt, sub-random-01.txt, sub-random-02.txt, sub-random-03.txt, sub-random-04.txt, sub-random-05.txt, sub-random-06.txt
All degenerate.txt, large-01.txt, large-02.txt, large-03.txt, large-04.txt, large-05.txt, large-06.txt, max-ans.txt, random-01.txt, random-02.txt, random-03.txt, random-04.txt, random-05.txt, random-06.txt, sample-01.txt, sample-02.txt, sub-01.txt, sub-02.txt, sub-03.txt, sub-04.txt, sub-05.txt, sub-06.txt, sub-max-ans.txt, sub-random-01.txt, sub-random-02.txt, sub-random-03.txt, sub-random-04.txt, sub-random-05.txt, sub-random-06.txt
Case Name Status Exec Time Memory
degenerate.txt AC 89 ms 7948 KiB
large-01.txt AC 2 ms 3560 KiB
large-02.txt AC 2 ms 3668 KiB
large-03.txt AC 2 ms 3508 KiB
large-04.txt AC 3 ms 3640 KiB
large-05.txt AC 17 ms 3796 KiB
large-06.txt AC 135 ms 17784 KiB
max-ans.txt AC 3 ms 3620 KiB
random-01.txt AC 2 ms 3644 KiB
random-02.txt AC 2 ms 3584 KiB
random-03.txt AC 2 ms 3672 KiB
random-04.txt AC 5 ms 3664 KiB
random-05.txt AC 14 ms 3688 KiB
random-06.txt AC 88 ms 7868 KiB
sample-01.txt AC 2 ms 3572 KiB
sample-02.txt AC 2 ms 3516 KiB
sub-01.txt AC 2 ms 3512 KiB
sub-02.txt AC 2 ms 3460 KiB
sub-03.txt AC 2 ms 3676 KiB
sub-04.txt AC 3 ms 3644 KiB
sub-05.txt AC 16 ms 3648 KiB
sub-06.txt AC 69 ms 7812 KiB
sub-max-ans.txt AC 4 ms 3556 KiB
sub-random-01.txt AC 2 ms 3528 KiB
sub-random-02.txt AC 2 ms 3580 KiB
sub-random-03.txt AC 2 ms 3640 KiB
sub-random-04.txt AC 3 ms 3608 KiB
sub-random-05.txt AC 13 ms 3720 KiB
sub-random-06.txt AC 70 ms 7820 KiB