//GZ-013 宋柠君 #include using namespace std; const long long maxn=1e6+9e5;//最大情况是四倍n,开大两倍级别为2e6 struct segment{ long long tree[maxn*4],lazy[maxn*4]; void init(int id,int l,int r){ tree[id]=0,lazy[id]=0; if(l==r) return ; int mid=(l+r)/2; init(id*2,l,mid); init(id*2+1,mid+1,r); } void pushdown(int id,int l,int r){ if(lazy[id]){ int mid=(l+r)/2; lazy[id*2]+=lazy[id],lazy[id*2+1]+=lazy[id]; tree[id*2]+=lazy[id],tree[id*2+1]+=lazy[id]*(r-mid); lazy[id]=0; } } void change(int id,int l,int r,int x,int y,long long k){ if(x>y) return ; if(x<=l&&r<=y){ // tree[id]+=k*(r-l+1); tree[id]+=k; lazy[id]+=k; return ; } pushdown(id,l,r); int mid=(l+r)/2; if(x<=mid) change(id*2,l,mid,x,y,k); if(mid>n; int cnt=0; for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&s[i].l1,&s[i].r1,&s[i].l2,&s[i].r2); // cin>>s[i].l1>>s[i].r1>>s[i].l2>>s[i].r2; ls[cnt]=s[i].l2,cnt++; ls[cnt]=s[i].r2,cnt++; } ls[cnt]=2e9; sort(ls,ls+cnt); int ncnt=unique(ls,ls+cnt)-ls; //for(long long i=0;ic2||a2c2){ if(b>a1-c2) { if(i%2==1){ ans++; // cout<<"1"<=c1-a2){ if(i%2==1){ ans++; //cout<<"1"<>c>>T; while(T--){ rmain(); } return 0; } /* 考虑离散化 对于一个数p可行,当且仅当跨越这个数的全选p,小于p的为和大于p的具体是多少并不重要,那么可以直接线段树维护左端点小于等于p和右端点大于等于p的最小和最大值 具体的,维护对b离散 那么对于b l,r 我们维护五个线段树 1 、 l 到 r之间加上 r1 2、1- l-1之间加上 r1 3、1-l-1之间加上l1 4、r+1到2*cnt之间加上l1 5、r+1到2*cnt之间加上r1 5棵线段树均只需要满足区间加和单点查询 但我不想写树状数组 第23表示我一定会比你大,那么你选的时候这部分相当于c 第45表示我一定会比你小,那么你选的时候这部分相当于a 一个小想法,可能有单点加,把每个离散化的点乘2可以避免中间算不到 */