QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#661684 | #7752. The Only Way to the Destination | zrj66 | WA | 0ms | 3844kb | C++23 | 3.4kb | 2024-10-20 17:32:46 | 2024-10-20 17:32:47 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
using i128 = __int128;
using PII = pair<int, int>;
const int N = 300010;
int n, m, K, idx, rt;
struct Node{
int l, r;
int sum, add;
}tr[N * 100];
void push_up(int u){
tr[u].sum = tr[tr[u].l].sum + tr[tr[u].r].sum;
}
void push_down(int u, int l, int r){
if(tr[u].add){
if(!tr[u].l) tr[u].l = ++ idx;
if(!tr[u].r) tr[u].r = ++ idx;
Node &root = tr[u], &left = tr[tr[u].l], &right = tr[tr[u].r];
int mid = l + r >> 1;
left.add += root.add, left.sum = root.add * (mid - l + 1);
right.add += root.add, right.sum = root.add * (r - mid);
root.add = 0;
}
}
void modify(int &u, int l, int r, int pl, int pr, int x){
if(!u) u = ++ idx;
if(l >= pl && r <= pr){
tr[u].sum += x * (r - l + 1);
tr[u].add += x;
return;
}
int mid = l + r >> 1;
push_down(u, l, r);
if(pl <= mid) modify(tr[u].l, l, mid, pl, pr, x);
if(pr > mid) modify(tr[u].r, mid + 1, r, pl, pr, x);
push_up(u);
}
int query(int u, int l, int r, int pl, int pr){
if(!u) return 0;
if(l >= pl && r <= pr){
return tr[u].sum;
}
int mid = l + r >> 1;
push_down(u, l, r);
int ans = 0;
if(pl <= mid) ans = query(tr[u].l, l, mid, pl, pr);
if(pr > mid) ans += query(tr[u].r, mid + 1, r, pl, pr);
return ans;
}
void solve(){
cin >> n >> m >> K;
m = min(m, N);
vector<vector<PII> > stk(min(m + 1, N));
for(int i = 1; i <= K; i ++){
int x1, x2, y;
cin >> x1 >> x2 >> y;
if(y <= m) stk[y].push_back({x1, x2});
}
for(int i = 1; i <= m; i ++){
if(i == 1){
for(auto [x1, x2] : stk[i]){
modify(rt, 1, 1e9, x1, x2, 1);
}
}
else{
int last = 1;
sort(stk[i].begin(), stk[i].end());
// cout << stk[i].size() << "\n";
for(auto [x1, x2] : stk[i]){
if(abs(x1 - last) > 1){
int t = query(rt, 1, 1e9, last, x1 - 1);
int len = x1 - last;
if(abs(t - len) > 1){
cout << "NO\n";
return;
}
}
modify(rt, 1, 1e9, x1, x2, 1);
last = x2 + 1;
}
if(last != n){
int t = query(rt, 1, 1e9, last, n);
// if(i == 3){
// cout << t << " " << last << " " << n << "\n";
// }
int len = n - last + 1;
if(abs(t - len) > 1){
cout << "NO\n";
return;
}
}
for(auto [x1, x2] : stk[i - 2]){
modify(rt, 1, 1e9, x1, x2, -1);
}
}
}
cout << "YES\n";
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
// cin >> _;
while(_--){
solve();
}
}
/*
3 3 3
1 1 1
3 3 1
2 2 3
6 5 5
1 2 5
1 6 2
5 6 2
4 5 3
4 6 5
7 4 6
3 6 1
2 2 2
7 7 2
1 1 3
2 2 3
7 7 3
4 6 6
4 4 1
1 2 2
4 4 3
1 2 4
4 4 5
1 2 6
*/
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3644kb
input:
5 3 2 2 5 1 1 4 3
output:
YES
result:
ok answer is YES
Test #2:
score: 0
Accepted
time: 0ms
memory: 3652kb
input:
5 3 1 2 4 2
output:
NO
result:
ok answer is NO
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3844kb
input:
2 4 2 2 2 1 1 1 4
output:
YES
result:
wrong answer expected NO, found YES