QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#116385#5094. 小 H 分糖果lgvc#0 0ms0kbC++234.5kb2023-06-28 17:08:462024-05-31 18:28:46

Judging History

This is the latest submission verdict.

  • [2024-05-31 18:28:46]
  • 管理员手动重测本题所有提交记录
  • Verdict: 0
  • Time: 0ms
  • Memory: 0kb
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-28 17:08:47]
  • Judged
  • Verdict: 0
  • Time: 0ms
  • Memory: 0kb
  • [2023-06-28 17:08:46]
  • Submitted

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[40000009],rs[40000009],siz[100009],rt[400009],dfn[100009],
kd,kq,anc[100009][17];
__int128 su;
struct n_t{
	int s1,s2;
	__int128 s3;
} seg[40000009];
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();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Dangerous Syscalls

Test #1:

score: 0
Dangerous Syscalls

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:


result:


Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Dangerous Syscalls

Test #6:

score: 0
Dangerous Syscalls

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%