QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#565154#9310. Permutation Counting 4wangqiWA 189ms163700kbC++142.2kb2024-09-15 20:26:322024-09-15 20:26:32

Judging History

你现在查看的是最新测评结果

  • [2024-09-18 14:56:40]
  • hack成功,自动添加数据
  • (/hack/835)
  • [2024-09-18 14:41:06]
  • hack成功,自动添加数据
  • (/hack/831)
  • [2024-09-17 12:14:52]
  • hack成功,自动添加数据
  • (/hack/825)
  • [2024-09-15 20:26:32]
  • 评测
  • 测评结果:WA
  • 用时:189ms
  • 内存:163700kb
  • [2024-09-15 20:26:32]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
pair<int,int> a[N], b[N];
struct P{
	int l, r;
	vector<int> c;
}tr[N * 4];

void build(int id, int l, int r){
	tr[id].l = l, tr[id].r = r;
	tr[id].c.resize(r - l + 1);
	if(l == r){
		tr[id].c[0] = b[l].second;
		return;
	}
	int mid = (l + r) >> 1, lf = id * 2, rt = id * 2 + 1;
	build(lf, l, mid); build(rt, mid + 1, r);
	int i = 0, j = 0, ct1 = mid - l + 1, ct2 = r - mid, idx = 0;
	while(i < ct1 && j < ct2){
		if(tr[lf].c[i] <= tr[rt].c[j]){
			tr[id].c[idx ++] = tr[lf].c[i ++];
		}else{
			tr[id].c[idx ++] = tr[rt].c[j ++];
		}
	}
	
	while(i < ct1){
		tr[id].c[idx ++] = tr[lf].c[i ++];
	}
	while(j < ct2){
		tr[id].c[idx ++] = tr[rt].c[j ++];
	}
}

int find_low(int id, int l, int r, int x){
	int l1 = tr[id].l, r1 = tr[id].r, mid = (l1 + r1) >> 1;
	
	if(l <= l1 && r1 <= r){
		int cnt = tr[id].c.end() - lower_bound(tr[id].c.begin(), tr[id].c.end(), x);
		return cnt;
	}
	int lf = id * 2, rt = id * 2 + 1;
	if(r <= mid){
		return find_low(lf, l, r, x);
	}else if(l >= mid + 1){
		return find_low(rt, l, r, x); 
	}else{
		return find_low(lf, l, r, x) + find_low(rt, l, r, x);
	}
	
}

void solve(){
	
	int n; cin >> n;
	
	for(int i = 0; i < n; i ++){
		cin >> a[i].first >> a[i].second;
	}
	sort(a, a + n);
	
	priority_queue<pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > qk;
	int l = 0;
	
	for(int i = 1; i <= n; i ++){
		
		while(l < n && a[l].first <= i){
			qk.push({a[l].second, a[l].first});
			l ++;
		}
		if(qk.size() == 0){
			cout << "0";
			return;
		}else{
			int l = qk.top().second, r = qk.top().first;
			if(l <= i && i <= r){
				b[i] = {l, r};
				qk.pop();
			}else{
				cout << "0";
				return;
			}
			
		}
	}
	build(1, 1, n);
	
	int ans = 0;
	for(int i = 1; i <= n; i ++){
		
		int up = b[i].second, ed = b[i].first;
		if(ed > i - 1) continue;
		ans += find_low(1, ed, i - 1, up);
		
	}
	ans = ans % 2;
	cout << ans;
}

signed main(){
	
	ios::sync_with_stdio(NULL);
	cin.tie(0); cout.tie(0);
	
	int T; cin >> T;
	while(T --){
		solve();
		cout << '\n';
	}
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 15ms
memory: 163284kb

input:

4
5
1 2
1 5
1 2
1 2
2 2
5
1 1
2 4
2 3
5 5
3 4
5
3 5
1 2
3 4
3 5
3 3
5
1 5
1 4
4 5
5 5
1 2

output:

0
1
0
0

result:

ok 4 tokens

Test #2:

score: -100
Wrong Answer
time: 189ms
memory: 163700kb

input:

66725
14
7 7
4 6
7 8
8 13
2 13
6 13
6 10
14 14
1 10
9 11
7 9
3 8
4 12
5 12
12
2 6
3 6
7 11
2 5
1 1
6 12
8 12
2 3
7 9
7 8
1 10
1 4
10
4 8
4 4
6 10
9 10
2 3
2 7
1 3
3 4
2 2
3 10
20
3 12
10 14
19 20
19 20
1 9
7 9
13 16
17 17
16 18
2 11
5 19
6 17
11 17
3 6
3 11
7 20
8 17
3 18
10 15
9 20
16
5 10
2 10
2 1...

output:

0
0
0
0
1
1
0
0
0
1
1
0
0
0
0
0
1
0
0
0
1
1
0
0
0
0
1
1
0
1
0
0
1
1
1
1
1
1
0
1
0
0
0
0
1
0
1
1
0
1
1
0
0
0
0
0
0
0
0
1
0
1
1
1
1
0
0
1
0
0
0
0
0
1
1
0
1
0
0
0
1
0
1
1
0
1
1
1
0
1
0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
1
0
1
1
0
1
1
1
1
1
1
0
0
0
1
0
1
0
0
1
0
0
0
0
1
0
0
0
0
1
1
0
0
1
1
0
1
0
1
0
0
0
0
0
0
...

result:

wrong answer 1st words differ - expected: '1', found: '0'