- 问答
求助(卡过了,已经解决)
- 2021-11-7 19:55:55 @
给定一个序列 ,对 奇数下标 和 偶数下标 的元素分别进行排序,如何判断排序之后的序列是不是非严格递增的?
比如序列 ,排序后为 不合法。
比如序列 ,排序后为 合法。
的长度 满足 ,多组询问,每次询问改 中的一个数,询问数 满足 ,
3 条评论
-
yemaster LV 5 @ 2021-11-9 11:28:09
现在已经会用分块卡了。大概就是在所有偶数位上数的位置+1,在所有奇数位数的位置-1,然后判定所有的前缀和是否为0或1.
然而只有80pts
inline void add(int k, int tp) { int value = tp ? 1 : -1; //printf("%d\n", value); int startBlock = (k - 1) / blksize + 1; mn[startBlock] = 0x3f3f3f3f; mx[startBlock] = -0x3f3f3f3f; for (RI i = (startBlock - 1) * blksize + 1; i <= startBlock * blksize; ++i) { if (i >= k) val[i] += value; mn[startBlock] = min(val[i] + tag[startBlock], mn[startBlock]); mx[startBlock] = max(val[i] + tag[startBlock], mx[startBlock]); } for (RI i(startBlock + 1), e(blknum); i <= e; ++i) { tag[i] += value; mn[i] += value; mx[i] += value; } } inline bool judge() { for (RI i = 1; i <= blknum; ++i) { if (mn[i] < 0) return false; if (mx[i] > 1) return false; } return true; } int main() { freopen("sort.in", "r", stdin); freopen("sort.out", "w", stdout); F_IO.read(n); F_IO.read(m); blksize = 1005; blknum = (MAXN - 1) / blksize + 1; for (RI i(1), e(blknum); i <= e; ++i) { tag[i] = 0; } for (RI i(1), e(n); i <= e; ++i) { F_IO.read(a[i]); add(a[i], i & 1); } RI x, y; while (m--) { F_IO.read(x); F_IO.read(y); add(a[x], (x & 1) ^ 1); a[x] = y; add(a[x], (x & 1)); puts(judge() ? "Yes" : "No"); } F_IO.buf_flush(); return 0; }
求调
-
2021-11-7 20:40:32@
数据规模不给怎么选算法(
-
2021-11-7 20:05:23@
看起来直接排序然后模拟会 T……
不知道诶……我想想
- 1