QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#572761 | #9310. Permutation Counting 4 | TheDuskBreeze | WA | 206ms | 11460kb | C++14 | 2.2kb | 2024-09-18 16:16:57 | 2024-09-18 16:16:57 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'