一、题目
二、解法
本题最关键的地方在于离散化,因为原来的数据范围达到了 1 e 18 1e18 1e18,但如果离散到 n n n的 1 e 5 1e5 1e5级别的话就比较好做了。但是只离散 l , r l,r l,r是不够的,把 l + 1 , l − 1 , r + 1 , r − 1 l+1,l-1,r+1,r-1 l+1,l−1,r+1,r−1都离散一下是肯定不会错的(代码中只离散了 r + 1 r+1 r+1,这一部分不要参考),注意还要离散 1 1 1。
离散化之后搞一个权值线段树维护 3 3 3种操作,搞一个覆盖标记和翻转标记,翻转的时候看有没有覆盖标记,没有的话才搞翻转标记。
#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
const int M = 100005;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c