結果

提出番号 640
提出者 Pulmn
言語 C++
提出日時 2017-07-31 17:15:08
問題名 (35)Queue
結果 WA
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 2ms 8304KB
2 WA 0% 2ms 7952KB
3 WA 0% 2ms 7984KB
4 AC 100% 2ms 7984KB
5 AC 100% 2ms 7680KB
6 AC 100% 29ms 14864KB
7 AC 100% 19ms 14256KB
8 AC 100% 17ms 10640KB
9 AC 100% 9ms 10256KB
10 AC 100% 8ms 9728KB
11 AC 100% 8ms 9824KB
12 AC 100% 10ms 10480KB
13 AC 100% 14ms 14048KB
14 WA 0% 8ms 8320KB
15 AC 100% 39ms 22800KB
16 AC 100% 40ms 24512KB
17 AC 100% 14ms 10688KB
18 WA 0% 42ms 13424KB
19 WA 0% 78ms 18656KB
20 WA 0% 74ms 14816KB
21 WA 0% 109ms 23040KB
22 WA 0% 2ms 8320KB
23 WA 0% 2ms 8320KB
24 WA 0% 2ms 7520KB
25 AC 100% 2ms 7680KB
26 WA 0% 2ms 8320KB
27 WA 0% 2ms 7984KB

ソースコード

#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;
			cout<<s<<' '<<s+l<<endl;
			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;
}