说是模拟但是我觉得更像思维题。 设l, r为状态区间[l, r], 这个状态区间只有两个状态:l == r || l + 1 == r。为什么呢? 如果状态区间与新加入的区间的距离为偶数, 那就令状态区间为 l = r = 端点, 如果为奇数, 那么有两种情况 l = r = 端点 或者r = 端点l = r - 1。请读者好好理解下~
还有对l,r的初始化问题, 我自己想的初始化时 l = a1, r = b1, 但是看大佬们的初始化是l = 1, r = 1000000
intsolve(int x, int y){ int ll = std::max(l, x); int rr = std::min(r, y); if (ll <= rr){ l = ll; r = rr; return0; } int res; if (y < l) { // 如果新区间在状态区间的左边 res = l - y + 1 >> 1; r = y; if ((l - y) % 2 == 1 && x != y) l = y - 1; else l = y; } else{ res = x - r + 1 >> 1; l = x; if ((x - r) % 2 == 1 && x != y) r = x + 1; else r = x; } return res; }
intmain(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t, n, a, b; std::cin >> t; ll ans; while(t--){ l = r = -1; ans = 0; std::cin >> n; while(n--){ std::cin >> a >> b; if (l == r && l == -1) // 若是初始化l = 1, r = 1000000, 那就直接放在循环外面即可, l = a, r = b; else ans += solve(a, b); } std::cout << ans << "\n"; }