QOJ.ac
QOJ
ID | 提交记录ID | 题目 | Hacker | Owner | 结果 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|
#1528 | #425836 | #8035. Call Me Call Me | Moyou | QBF | Failed. | 2025-02-06 18:08:24 | 2025-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 Me | QBF | AC ✓ | 14708ms | 25300kb | C++14 | 2.3kb | 2024-05-30 17:27:23 | 2025-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;
}