QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572761#9310. Permutation Counting 4TheDuskBreezeWA 206ms11460kbC++142.2kb2024-09-18 16:16:572024-09-18 16:16:57

Judging History

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

  • [2024-09-18 16:16:57]
  • 评测
  • 测评结果:WA
  • 用时:206ms
  • 内存:11460kb
  • [2024-09-18 16:16:57]
  • 提交

answer

#include<bits/stdc++.h>
#define lc p << 1
#define rc p << 1 | 1
using namespace std;

using ll = long long;
using ull = unsigned long long;

constexpr int N = 1e6 + 10;

ull v[N];
void pre() {
	v[0] = 2187;
	for (int i = 1; i < N; i++) {
		v[i] = v[i - 1] * 3;
	}
}

struct Segment_Tree {
	struct T {
		int l, r;
		ull tag, val;
	};

	int n;
	vector<T> tr;
	void init(int n) {
		this -> n = n;
		tr.resize(n << 2 + 1);
	}

	void pushup(int p) {
		tr[p].val = tr[lc].val + tr[rc].val;
	}

	void pushdown(int p) {
		if (tr[p].tag) {
			tr[lc].val += (tr[lc].r - tr[lc].l + 1) * tr[p].tag;
			tr[rc].val += (tr[rc].r - tr[rc].l + 1) * tr[p].tag;
			tr[lc].tag += tr[p].tag;
			tr[rc].tag += tr[p].tag;
			tr[p].tag = 0;
		}
	}

	void build(int p, int l, int r) {
		tr[p].l = l, tr[p].r = r, tr[p].tag = 0;
		if (l == r) {
			tr[p].val = 0;
			return;
		}
		int mid = (l + r) >> 1;
		build(lc, l, mid);
		build(rc, mid + 1, r);
		pushup(p);
	}

	void update(int p, int l, int r, int L, int R, ull k) {
		if (tr[p].l >= L && tr[p].r <= R) {
			tr[p].val += (tr[p].r - tr[p].l + 1) * k;
			tr[p].tag += k;
			return;
		}
		pushdown(p);
		int mid = (l + r) >> 1;
		if (L <= mid) {
			update(lc, l, mid, L, R, k);
		}
		if (R > mid) {
			update(rc, mid + 1, r, L, R, k);
		}
		pushup(p);
	}

	ull query(int p, int l, int r, int L, int R) {
		if (tr[p].l >= L && tr[p].r <= R) {
			return tr[p].val;
		}
		pushdown(p);
		int mid = (l + r) >> 1;
		ull res = 0;
		if (L <= mid) {
			res += query(lc, l, mid, L, R);
		}
		if (R > mid) {
			res += query(rc, mid + 1, r, L, R);
		}
		return res;
	}
};

void solve() {
	int n;
	cin >> n;

	Segment_Tree sg;
	sg.init(n);
	sg.build(1, 1, n);

	for (int i = 1; i <= n; i++) {
		int l, r;
		cin >> l >> r;
		sg.update(1, 1, n, l, r, v[i]);
	}

	map<ull, int> cnt;
	for (int i = 1; i <= n; i++) {
		ull v = sg.query(1, 1, n, i, i);
		cnt[v]++;
		//cerr << v << '\n';
		if (cnt[v] >= 2) {
			cout << "0" << '\n';
			return;
		}
	}
	cout << "1" << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	pre();
	int T;
	cin >> T;
	while(T--) {
		solve();
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 11460kb

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: 206ms
memory: 11444kb

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:

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

result:

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