QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1528#425836#8035. Call Me Call MeMoyouQBFFailed.2025-02-06 18:08:242025-02-06 18:08:24

详细

Extra Test:

Accepted
time: 50ms
memory: 27948kb

input:

400000
1 400000 0
1 400000 1
1 400000 2
1 400000 3
1 400000 4
1 400000 5
1 400000 6
1 400000 7
1 400000 8
1 400000 9
1 400000 10
1 400000 11
1 400000 12
1 400000 13
1 400000 14
1 400000 15
1 400000 16
1 400000 17
1 400000 18
1 400000 19
1 400000 20
1 400000 21
1 400000 22
1 400000 23
1 400000 24
1 4...

output:

400000

result:

ok 1 number(s): "400000"

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#425836#8035. Call Me Call MeQBFAC ✓14708ms25300kbC++142.3kb2024-05-30 17:27:232025-02-06 18:45:13

answer

#include<bits/stdc++.h>
#define ci const int
#define ll long long
#define ls k<<1
#define rs k<<1|1
using namespace std;
char buf[1<<20],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
int read(){int res(0);char ch(getchar());while(ch<48||ch>57)ch=getchar();while(ch>=48&&ch<=57)res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;}
double sqr(double x){
	return x*x;
}
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
ci N=4e5+5,inf=1e6;
int n,l[N],r[N],ad[N],mn[N],val[N];
struct node{
	int x,y,k,id;
}nd[N];
inline bool cmpx(const node &A,const node &B){
	return A.x<B.x;
}
inline bool cmpy(const node &A,const node &B){
	return A.y<B.y;
}
int xl[N],xr[N],yl[N],yr[N];
void upd(ci k){
	mn[k]=min(val[k],min(mn[l[k]],mn[r[k]]));
}
void add(ci k,ci v){
	ad[k]+=v,mn[k]-=v,val[k]-=v;
}
void pushdown(ci k){
	if(ad[k]){
		if(l[k])add(l[k],ad[k]);
		if(r[k])add(r[k],ad[k]);
		ad[k]=0;
	}
}
int build(ci L,ci R,int d=0){
	if(L>R)return 0;
	ci mid=L+R>>1;
	double ax=0,ay=0;
	for(int i=L;i<=R;++i)ax+=nd[i].x,ay+=nd[i].y;
	ax/=R-L+1,ay/=R-L+1;
	double sx=0,sy=0;
	for(int i=L;i<=R;++i)sx+=sqr(nd[i].x-ax),sy+=sqr(nd[i].y-ay);
	nth_element(nd+L,nd+mid,nd+R+1,sx>sy?cmpx:cmpy);
	l[mid]=build(L,mid-1,d^1),r[mid]=build(mid+1,R,d^1),
	val[mid]=nd[mid].k,upd(mid),
	xl[mid]=min(nd[mid].x,min(xl[l[mid]],xl[r[mid]])),
	xr[mid]=max(nd[mid].x,max(xr[l[mid]],xr[r[mid]])),
	yl[mid]=min(nd[mid].y,min(yl[l[mid]],yl[r[mid]])),
	yr[mid]=max(nd[mid].y,max(yr[l[mid]],yr[r[mid]]));
	return mid;
}
void modify(ci k,ci x,ci v){
	if(!k||x<xl[k]||x>yr[k])return;
	if(xr[k]<=x&&x<=yl[k]){
		add(k,v);
		return;
	}
	if(nd[k].x<=x&&x<=nd[k].y)val[k]-=v;
	pushdown(k),modify(l[k],x,v),modify(r[k],x,v),upd(k);
}
vector<int>dl;
void dfs(ci k){
	pushdown(k);
	if(val[k]<=0)val[k]=inf,dl.push_back(nd[k].id);
	if(mn[l[k]]<=0)dfs(l[k]);
	if(mn[r[k]]<=0)dfs(r[k]);
	upd(k);
}
int main(){
	n=read();
	for(int i=1;i<=n;++i)nd[i].x=read(),nd[i].y=read(),nd[i].k=read(),nd[i].id=i;
	mn[0]=inf,xl[0]=yl[0]=inf;
	ci rt=build(1,n);
	int ans=0;
	while(mn[rt]<=0){
		dl.clear(),dfs(rt);
		for(int x:dl){
			modify(rt,x,1),++ans;
			if(ans>360000)return 0*puts("400000");
		}
	}
	printf("%d",ans);
	return 0;
}