社区讨论
kdt板子20分TLE求助
P4148简单题参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjsr5kt
- 此快照首次捕获于
- 2025/11/04 07:54 4 个月前
- 此快照最后确认于
- 2025/11/04 07:54 4 个月前
写的替罪羊
CPP#include<bits/stdc++.h>
#define ls t[p].lson
#define rs t[p].rson
using namespace std;
constexpr int MN=5e5+15;
constexpr double Alp=0.72;
struct Point{
int x[2],w;
}pt[MN];
struct Node{
int lson,rson;
Point P;
int L[2],R[2],sum,siz;
}t[MN];
int n,tot,rt,s[MN],top;
int add(){
if(!top) return ++tot;
return s[top--];
}
void pushup(int p){
t[p].sum=t[ls].sum+t[rs].sum+t[p].P.w;
t[p].siz=t[ls].siz+t[rs].siz+1;
for(int i=0;i<=1;i++){
t[p].L[i]=min({t[p].P.x[i],t[ls].L[i],t[rs].L[i]});
t[p].R[i]=max({t[p].P.x[i],t[ls].R[i],t[rs].R[i]});
}
}
void getseq(int p,int cnt){
if(ls) getseq(ls,cnt);
s[++top]=p;
pt[t[ls].siz+1+cnt]=t[p].P;
if(rs) getseq(rs, t[ls].siz+1+cnt);
}
int rebuild(int l,int r,bool tp){
if(l>r) return 0;
int mid=(l+r)>>1;
int p=add();
nth_element(pt+l,pt+mid,pt+r+1,[&](Point a,Point b){
return a.x[tp]<b.x[tp];
});
t[p].P=pt[mid];
ls=rebuild(l,mid-1,tp^1);
rs=rebuild(mid+1,r,tp^1);
pushup(p);
return p;
}
void maintain(int &p,int k){
if(t[p].siz*Alp<t[ls].siz||t[p].siz*Alp<t[rs].siz){
getseq(p,0);
p=rebuild(1,tot,k);
}
}
void insert(int &p,Point pt,int k){
if(!p){
p=add();
ls=rs=0;
t[p].P=pt;
pushup(p);
return;
}
if(pt.x[k]<=t[p].P.x[k]) insert(ls,pt,k^1);
else insert(rs,pt,k^1);
pushup(p);
maintain(p, k);
}
bool isin(Node nd,int x1,int y1,int x2,int y2){
return nd.L[0]>=x1&&nd.R[0]<=x2&&nd.L[1]>=y1&&nd.R[1]<=y2;
}
bool isinp(Point pt,int x1,int y1,int x2,int y2){
return pt.x[0]>=x1&&pt.x[0]<=x2&&pt.x[1]>=y1&&pt.x[1]<=y2;
}
bool isout(Node nd,int x1,int y1,int x2,int y2){
return nd.R[0]<x1||nd.L[0]>x2||nd.R[1]<y1||nd.L[1]>y2;
}
int query(int p,int x1,int y1,int x2,int y2){
if(isin(t[p],x1,y1,x2,y2)) return t[p].sum;
if(isout(t[p],x1,y1,x2,y2)) return 0;
int ret=0;
if(isinp(t[p].P,x1,y1,x2,y2)) ret+=t[p].P.w;
ret+=query(ls,x1,y1,x2,y2)+query(rs,x1,y1,x2,y2);
return ret;
}
int main(){
cin>>n;
t[0].L[0]=t[0].R[0]=MN+5;
t[0].L[1]=t[0].R[1]=-1;
int ans=0,op;
while(cin>>op&&op!=3){
if(op==1){
int x,y,k;
cin>>x>>y>>k;
x^=ans;
y^=ans;
k^=ans;
insert(rt,{x,y,k},0);
}else{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
x1^=ans;
x2^=ans;
y1^=ans;
y2^=ans;
ans=query(rt,x1,y1,x2,y2);
cout<<ans<<'\n';
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...