QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#116387 | #5094. 小 H 分糖果 | lgvc# | 0 | 9ms | 14312kb | C++23 | 4.5kb | 2023-06-28 17:10:48 | 2023-06-28 17:10:49 |
Judging History
answer
//这回只花了114514min就打完了。
//真好。记得多手造几组。
#include <bits/stdc++.h>
#define int long long
#define pai 3.141592653589793238462643383279502884197169399375105820
#define MOD 1000000007
#define eps 0.00000001
inline int min(int a,int b) {return a<b?a:b;}
inline int max(int a,int b) {return a>b?a:b;}
#define ULL unsigned long long
#define LL long long
#define INF 0x3f3f3f3f
#define INF_LL 0x3f3f3f3f3f3f3f3f
static char buf[1000000],*paa=buf,*pd=buf;
static char buf2[1000000],*pp=buf2;
#define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++
inline void pc(char ch){
if(pp-buf2==1000000) fwrite(buf2,1,1000000,stdout),pp=buf2;
*pp++=ch;
}
inline void pcc(){
fwrite(buf2,1,pp-buf2,stdout);
pp=buf2;
}
inline int read(void) {
int w=1;
register int x(0);register char c(getchar());
while(c<'0'||c>'9') {if(c=='-') w=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w*x;
}
void write(__int128 x) {
if(x<0) pc('-'),x=-x;
static int sta[40];
int top=0;
do {
sta[top++]=x%10,x/=10;
} while(x);
while(top) pc(sta[--top]+48);
}
void we(__int128 x) {
write(x);
pc('\n');
}
inline bool cmp_xi(int a,int b) {return a<b;}
inline bool cmp_da(int a,int b) {return a>b;}
int N,Q,hd[100009],pa[100009],dep[100009],a[100009],nxt[200009],to[200009],k,b[100009],ls[30000009],rs[30000009],siz[100009],rt[400009],dfn[100009],
kd,kq,anc[100009][17];
__int128 su;
struct n_t{
int s1,s2;
__int128 s3;
} seg[30000009];
inline void l(int u,int v) {nxt[++k]=hd[u],to[k]=v,hd[u]=k;}
//step1: 建出 dfn
//step2: 线段树-个数,和,平方和
//step3:修改+查询
//step4: main 函数改掉
//step5: 卡常数。
void dfs(int n,int f) {
anc[n][0]=f;
pa[n]=f;dep[n]=dep[f]+1;
siz[n]=1;dfn[n]=++kq;
for(int i=hd[n];i;i=nxt[i]) {
if(to[i]==f) continue;
dfs(to[i],n);
siz[n]+=siz[to[i]];
}
}
inline n_t mm(n_t a,n_t b) {
return (n_t){a.s1+b.s1,a.s2+b.s2,a.s3+b.s3};
}
#define md ((l+r)>>1)
inline void up(int n,int p,int v,int x) {
int l=0,r=INF;
while(1) {
seg[n].s1+=x;
seg[n].s2+=v*x;
seg[n].s3+=v*v*x;
if(l==r) return;
if(p<=md) {
if(!ls[n]) ls[n]=++kd;
n=ls[n];
r=md;
} else {
if(!rs[n]) rs[n]=++kd;
n=rs[n];
l=md+1;
}
}
}
inline n_t q(int n,int x) {
n_t ans=(n_t){0,0,0};
int l=0,r=INF;
while(n) {
if(l==r) {
ans=mm(ans,seg[n]);
break;
} else if(x>md) {
n=rs[n];
l=md+1;
} else {
ans=mm(ans,seg[rs[n]]);
n=ls[n];
r=md;
}
}
return ans;
}
#define ls (n<<1)
#define rs ((n<<1)|1)
void up2(int n,int l,int r,int L,int R,int x,int y) {
if(r<L||R<l) return;
if(L<=l&&r<=R) {
if(!rt[n]) rt[n]=++kd;
if(x!=-1) up(rt[n],x,x,-1);
up(rt[n],y,y,1);
return;
}
up2(ls,l,md,L,R,x,y);up2(rs,md+1,r,L,R,x,y);
}
n_t q2(int n,int l,int r,int p,int v) {
n_t ans=q(rt[n],v);
if(l==r) return ans;
if(p<=md) ans=mm(ans,q2(ls,l,md,p,v));else ans=mm(ans,q2(rs,md+1,r,p,v));
return ans;
}
#undef ls
#undef rs
#undef md
inline n_t sv(int x,int y,int m,int v) {
n_t A=q2(1,1,N,dfn[x],v),B=q2(1,1,N,dfn[y],v),C=q2(1,1,N,dfn[m],v);
A.s1=A.s1+B.s1-2*C.s1;
A.s2=A.s2+B.s2-2*C.s2;
A.s3=A.s3+B.s3-2*C.s3;
if(a[m]>=v) A.s1++,A.s2+=a[m],A.s3+=a[m]*a[m];
return A;
}
signed main(void) {
// freopen("m.in","r",stdin);
// freopen("m.out","w",stdout);
N=read();Q=read();
for(int i=1;i<N;i++) {
int u=read(),v=read();
l(u,v),l(v,u);
}
dfs(1,0);
for(int i=1;i<=N;i++) a[i]=read(),su+=a[i]*a[i];
for(int i=1;i<=N;i++) up2(1,1,N,dfn[i],dfn[i]+siz[i]-1,-1,a[i]);
for(int i=1;i<=16;i++) for(int j=1;j<=N;j++) anc[j][i]=anc[anc[j][i-1]][i-1];
while(Q--) {
int op=read();
if(op==1) {
int x=read(),v=read();
up2(1,1,N,dfn[x],dfn[x]+siz[x]-1,a[x],v);
su-=a[x]*a[x];
su+=v*v;
a[x]=v;
} else {
int m=read(),n=read(),v=read(),x=m,y=n;
if(dep[m]<dep[n]) std::swap(m,n);
for(int i=16;i>=0;i--) {
if(dep[anc[m][i]]>=dep[n]) {
m=anc[m][i];
}
}
for(int i=16;i>=0;i--) {
if(anc[m][i]!=anc[n][i]) {
m=anc[m][i];
n=anc[n][i];
}
}
if(m!=n) m=anc[m][0];
int l=0,r=INF,md;
while(l<r) {
md=(l+r)>>1;
n_t tp=sv(x,y,m,md);
int as=tp.s2-tp.s1*md;
if(as<=v) r=md;else l=md+1;
}
n_t tp=sv(x,y,m,l);
int as=tp.s2-tp.s1*l;
if(l==0) {
we(su-tp.s3);
continue;
}
__int128 aq=(__int128)l*l*tp.s1-tp.s3;
we(aq-(v-as)*(2*l-1)+su);
}
}
pcc();
printf("%lld",kd);
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 9ms
memory: 14312kb
input:
866 841 1 864 4 153 9 559 10 410 11 336 12 417 14 666 18 241 21 184 22 849 23 40 25 783 26 189 28 329 29 216 31 864 34 581 40 131 42 625 45 744 47 723 50 633 51 447 52 454 53 88 55 619 60 259 62 680 67 126 72 371 73 742 80 196 81 536 82 647 85 254 87 172 88 489 93 708 94 227 95 340 96 7 7 91 97 594 ...
output:
285125508 285374449 285871392 285072359 284419704 284843737 284692039 284936099 285944374 285174668 285019779 284651455 287282253 287175619 284878507 285369672 284880507 285404741 284913527 286053317 288622563 286960150 287194443 288326074 286937403 287883097 288535226 288195055 288643208 288632989 ...
result:
wrong output format Extra information in the output file
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Memory Limit Exceeded
Test #6:
score: 0
Memory Limit Exceeded
input:
87080 98363 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52...
output:
result:
Subtask #4:
score: 0
Skipped
Dependency #1:
0%