結果

提出番号 641
提出者 Pulmn
言語 C++
提出日時 2017-07-31 17:16:27
問題名 (35)Queue
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 1ms 8352KB
2 AC 100% 2ms 8000KB
3 AC 100% 1ms 8336KB
4 AC 100% 1ms 7680KB
5 AC 100% 1ms 7776KB
6 AC 100% 23ms 14864KB
7 AC 100% 23ms 14256KB
8 AC 100% 13ms 10640KB
9 AC 100% 9ms 10288KB
10 AC 100% 8ms 9728KB
11 AC 100% 8ms 9824KB
12 AC 100% 9ms 10464KB
13 AC 100% 16ms 14080KB
14 AC 100% 8ms 7968KB
15 AC 100% 36ms 22768KB
16 AC 100% 41ms 24512KB
17 AC 100% 11ms 10688KB
18 AC 100% 24ms 13440KB
19 AC 100% 33ms 18672KB
20 AC 100% 31ms 14800KB
21 AC 100% 44ms 23040KB
22 AC 100% 1ms 8320KB
23 AC 100% 3ms 7488KB
24 AC 100% 1ms 7792KB
25 AC 100% 1ms 7472KB
26 AC 100% 1ms 8336KB
27 AC 100% 1ms 7744KB

ソースコード

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef vector<ll> vl;
typedef vector<pair<ll,ll> > vp;
const ll mod=1e9+7;

ll n;
vp p,q;
vl b,c,d;
set<ll> st;

void f(ll l,ll r,ll x){
	p.push_back({l,x});
	q.push_back({r,x});
}

int main(){
	ios::sync_with_stdio(0);
	cin>>n;
	b=vl(n);
	c=vl(n+1);
	for(int i=0;i<n;i++){
		ll k,t;
		cin>>k>>t;
		if(k==-1) continue;
		if(t<n) f(t,t+1,i);
		else{
			t-=n;
			ll tmp=n-k+1,l=t/tmp*(k-1)+k,s=t/tmp*(1-k)+t%tmp;
			if(s>=0) f(s,s+l,i);
			else{
				f(n+s,n,i);
				f(0,s+l,i);
			}
		}
		b[i]++;
	}
	sort(p.begin(),p.end());
	sort(q.begin(),q.end());
	ll ps=p.size(),qs=q.size(),pi=0,qi=0,I=0,res=1;
	st.insert(-1);
	for(int i=0;i<n;i++){
		while(pi<ps&&p[pi].first<=i){
			st.insert(p[pi].second);
			pi++;
		}
		while(qi<qs&&q[qi].first<=i){
			st.erase(q[qi].second);
			qi++;
		}
		auto it=st.end();
		it--;
		c[n-*it-1]++;
	}
	for(int i=n-1;i>=0;i--) if(b[n-i-1]){
		if(!c[i]){
			cout<<-1<<endl;
			return 0;
		}
		(res*=c[i])%=mod;
		c[i]--;
	}
	for(int i=n;i>=0;i--) for(int j=0;j<c[i];j++) d.push_back(n-i);
	for(int i=0;i<n;i++) if(!b[i]){
		ll it=upper_bound(d.begin(),d.end(),i)-d.begin();
		if(it<=I){
			cout<<-1<<endl;
			return 0;
		}
		(res*=it-I)%=mod;
		I++;
	}
	cout<<res<<endl;
}