分析:
良心出题人给超多部分分(错乱
又是喜闻乐见的把线段\((x,y)\)放到平面坐标系的点\((x,y)\)上,我们尝试得到这个点上的值
我们改变一个单位线段\(x\)的状态,考虑它的影响范围,在线树状数组之类的数据结构维护连续\(1\)的线段,可以得出一个下标\(x\)的影响范围\((l,r)\)
改变这个点会影响左上角\((l,x)\),右下角\((x,r)\)的矩形
一对点假设在\(t_1\)时刻连通,\(t_2\)时刻断开,那么会产生\(t_2-t_1\)的贡献
每次在\(t\)时刻连通时,我们将矩形减\(t\)
每次在\(t\)时刻断开时,我们将矩形加\(t\)
查询某个点值为\(v\)时,如果当前\(t\)时刻状态为连通,答案为\(t+v\),否则为\(v\)
使用差分变成单点修改矩形查询
二维数据结构卡空间?CDQ分治一下吧
也当复习CDQ分治了
#include
#include
#include
#include
#include
#define maxn 2000005
#define MOD 998244353
using namespace std;
inline long long getint()
{
long long num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
int n,q,qcnt,cnt;
char s[maxn];
struct node{
int op,x,y,t,val,id,ans;
}Q[maxn],tmp[maxn];
int A[maxn];
struct BT{
int N;
int t[maxn];
inline void update(int x,int num)
{for(int i=x;i<=N;i+=i&(-i))t[i]+=num;}
inline int getans(int x)
{int num=0;for(int i=x;i;i-=i&(-i))num+=t[i];return num;}
}B,T;
int ans[maxn];
inline bool cmp2(node x,node y)
{return x.y!=y.y?x.yy-x;}
inline int getl(int x)
{
int l=1,r=x;
while(l>1;if(check(mid,x))r=mid;else l=mid+1;}
return l;
}
inline int getr(int x)
{
int l=x,r=n;
while(l>1;if(check(x,mid))l=mid;else r=mid-1;}
return r;
}
inline void solve(int l,int r)
{
if(l==r)return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
int pre=l-1;
for(int i=mid+1;i<=r;i++)
{
while(pre