QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#65475#5094. 小 H 分糖果zqyyy0 8ms10260kbC++206.5kb2022-12-01 11:30:162023-10-04 02:47:45

Judging History

This is the latest submission verdict.

  • [2023-10-04 02:47:45]
  • 管理员手动重测本题所有提交记录
  • Verdict: 0
  • Time: 8ms
  • Memory: 10260kb
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-12-01 11:30:19]
  • Judged
  • Verdict: 0
  • Time: 7ms
  • Memory: 13924kb
  • [2022-12-01 11:30:16]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
inline char getC() { //Don't to use it in interactive problems!!!
	static char *p1, *p2, buf[1<<23];
	return p1==p2?(p2=(p1=buf)+fread(buf, 1, 1<<23, stdin), p1==p2?'\n':*p1++):*p1++;
}
inline int read() {
	int f=1, r=0; char c=getC();
	while (!isdigit(c)) f^=c=='-', c=getC();
	while (isdigit(c)) r=r*10+c-48, c=getC();
	return f?r:-r;
}
template<class T> inline void write(T x) {
	if (x<0) putchar(45), x=-x;
	if (x>9) write(x/10); putchar(x%10+48);
}
#define mk make_pair
#define pii pair<int, int>
#define fi first
#define se second
template<class T> inline void ckmin(T &x, T y) {if (y<x) x=y;}
template<class T> inline void ckmax(T &x, T y) {if (x<y) x=y;}
const int N=1e5+7, M=2007, mod=998244353;
inline void inc(int &x, int y) {x+=y; if (x>=mod) x-=mod;}
inline void dec(int &x, int y) {x-=y; if (x<0) x+=mod;}
inline void mul(int &x, int y) {x=(ll)x*y%mod;}
inline int add(int x, int y) {return inc(x, y), x;}
inline int sub(int x, int y) {return dec(x, y), x;}
inline int qpow(int a, ll b) {
	int res=1;
	for (; b; b>>=1, mul(a, a)) if (b&1) mul(res, a);
	return res;
}
int n, Q, B, a[N];
int s_dfn, dfn[N], rev[N], low[N], sz[N], son[N], fa[N], top[N], dep[N];
vector<int> G[N];
struct node {int opt, u, v; ll w;} q[M];
void dfs1(int x) {
	sz[x]=1, dep[x]=dep[fa[x]]+1;
	for (int y:G[x]) {
		if (y==fa[x]) continue;
		fa[y]=x, dfs1(y), sz[x]+=sz[y];
		if (sz[y]>sz[son[x]]) son[x]=y;
	}
}
void dfs2(int x, int tf) {
	top[x]=tf, dfn[x]=++s_dfn, rev[s_dfn]=x;
	if (!son[x]) {low[x]=s_dfn; return;} dfs2(son[x], tf);
	for (int y:G[x]) if (y!=fa[x] && y!=son[x]) dfs2(y, y);
	low[x]=s_dfn;
}
int sum_c; ll sum_t;
namespace sgt {
	const int M=N*18;
	int tot, ls[M], rs[M], cnt[M]; ll t[M];
	void modify(int &p, int q, int l, int r, int x, int v) {
		p=++tot, t[p]=t[q]+v, cnt[p]=cnt[q]+1; if (l==r) return;
		int mid=(l+r)>>1;
		if (x<=mid) modify(ls[p], ls[q], l, mid, x, v), rs[p]=rs[q];
		else modify(rs[p], rs[q], mid+1, r, x, v), ls[p]=ls[q];
	}
	ll queryt(int p, int l, int r, int x, int y) {
		if (x<=l && r<=y) return t[p]; int mid=(l+r)>>1; if (y<=mid) return queryt(ls[p], l, mid, x, y);
		if (x>mid) return queryt(rs[p], mid+1, r, x, y); return queryt(ls[p], l, mid, x, y)+queryt(rs[p], mid+1, r, x, y);
	}
	void query(int p, int l, int r, int x, int y) {
		if (!p) return;
		if (x<=l && r<=y) {sum_c+=cnt[p], sum_t+=t[p]; return;}
		int mid=(l+r)>>1;
		if (x<=mid) query(ls[p], l, mid, x, y);
		if (y>mid) query(rs[p], mid+1, r, x, y);
	}
	void query(int p, int l, int r) {
		sum_c=0, sum_t=0, query(p, 1, n, l, r);
	}
}
namespace sgt1 {
	const int M=N*18;
	int tot, ls[M], rs[M]; lll t[M];
	void modify(int &p, int q, int l, int r, int x, ll v) {
		p=++tot, t[p]=t[q]+v; if (l==r) return;
		int mid=(l+r)>>1;
		if (x<=mid) modify(ls[p], ls[q], l, mid, x, v), rs[p]=rs[q];
		else modify(rs[p], rs[q], mid+1, r, x, v), ls[p]=ls[q];
	}
	lll query(int p, int l, int r, int x, int y) {
		if (x<=l && r<=y) return t[p]; int mid=(l+r)>>1; if (y<=mid) return query(ls[p], l, mid, x, y);
		if (x>mid) return query(rs[p], mid+1, r, x, y); return query(ls[p], l, mid, x, y)+query(rs[p], mid+1, r, x, y);
	}
}
/*
namespace block {
	int s1[N], s2[M], R[M], bel[N];
	inline void init() {
		for (int i=1; i<=n; i++) bel[i]=(i-1)/B+1;
		for (int i=1; i<=bel[n]; i++) R[i]=min(n, i*B);
		bel[n+1]=bel[n]+1;
	}
	inline void add(int p, int v) {
		for (int i=p; i<=R[bel[p]]; i++) s1[i]+=v;
		for (int i=bel[p]+1; i<=bel[n]; i++) s2[i]+=v;
	}
	inline int query(int p) {return s1[p]+s2[bel[p]];}
	}*/
namespace fwk {
	int c[N];
	inline void add(int p, int x) {for (; p<=n; p+=p&-p) c[p]+=x;}
	inline int ask(int p) {int res=0; for (; p; p&=p-1) res+=c[p]; return res;}
}
int rt[N], rt1[N], tot, cnt, s_seg, seq[M], s_in, seq_in[M];
bool vis[N], ins[N];
pair<int, int> val[N], seg[114];
inline ll calc1(int mid) {
	ll res=0; int c=0;
	for (int i=1; i<=s_in; i++) if (seq_in[i]>=mid) res+=seq_in[i]-mid;
	int p=lower_bound(val+1, val+tot+1, mk(mid, 0))-val;
	if (p<=tot) {
		//if (mid==3) cout<<sgt::cnt[rt[p]]<<" "<<sgt::t[rt[p]]<<endl;
		for (int i=1; i<=s_seg; i++) {
			sgt::query(rt[p], seg[i].fi, seg[i].se);
			c+=sum_c, res+=sum_t;
		}
	}
	return res-(ll)c*mid;
}
inline lll calc2(int mid, ll w) {
	lll ans=0; int c=0;
	for (int i=1; i<=s_in; i++)
		if (seq_in[i]>=mid) w-=seq_in[i], c++;
		else ans+=(ll)seq_in[i]*seq_in[i];
	int p=lower_bound(val+1, val+tot+1, mk(mid, 0))-val;
	if (p<=tot) {
		for (int i=1; i<=s_seg; i++) {
			sgt::query(rt[p], seg[i].fi, seg[i].se);
			c+=sum_c, w-=sum_t;
		}
	}
	if (--p) for (int i=1; i<=s_seg; i++) ans+=sgt1::query(rt1[p], 1, n, seg[i].fi, seg[i].se);
	w+=(ll)c*mid, ans+=(c-w)*(lll)mid*mid+(lll)w*(mid-1)*(mid-1);
	return ans;
}
inline lll query(int u, int v, ll w) {
	s_seg=0;
	while (top[u]^top[v]) {
		if (dep[top[u]]>dep[top[v]]) swap(u, v);
		seg[++s_seg]={dfn[top[v]], dfn[v]}, v=fa[top[v]];
	}
	if (dfn[u]>dfn[v]) swap(u, v);
	seg[++s_seg]={dfn[u], dfn[v]};
	for (int i=1; i<=s_seg; i++) fwk::add(seg[i].fi, 1), fwk::add(seg[i].se, -1);
	s_in=0;
	for (int i=1; i<=cnt; i++) if (fwk::ask(seq[i])) seq_in[++s_in]=a[seq[i]];
	int l=0, r=1e9;
	while (l<r) {
		int mid=(l+r)>>1;
		if (calc1(mid)<=w) r=mid;
		else l=mid+1;
	}
	return l?calc2(l, w):0;
}
inline void work() {
	for (int i=1; i<=Q; i++)
		if (q[i].opt==1 && !vis[q[i].u]) seq[++cnt]=q[i].u, vis[q[i].u]=true;
	for (int i=1; i<=n; i++) if (!vis[i]) val[++tot]={a[i], i};
	sort(val+1, val+tot+1), rt[tot+1]=0;
	for (int i=tot; i; i--) sgt::modify(rt[i], rt[i+1], 1, n, val[i].se, val[i].fi);
	for (int i=1; i<=tot; i++) sgt1::modify(rt1[i], rt1[i-1], 1, n, val[i].se, (ll)val[i].fi*val[i].fi);
	for (int i=1; i<=Q; i++)
		if (q[i].opt==1) a[q[i].u]=q[i].v;
		else write(query(q[i].u, q[i].v, q[i].w)), putchar(10);
	for (int i=1; i<=cnt; i++) vis[seq[i]]=false;
	sgt::tot=sgt1::tot=cnt=tot=0;
}
int main() {
#ifndef ONLINE_JUDGE
	freopen("1.in", "r", stdin);
	freopen("1.out", "w", stdout);
#endif
	n=read(), B=sqrt(n); int qq=read();
	for (int i=1; i<n; i++) {
		int x=read(), y=read();
		G[x].push_back(y), G[y].push_back(x);
	}
	dfs1(1), dfs2(1, 1); //, block::init();
	for (int i=1; i<=n; i++) a[dfn[i]]=read();
	for (int i=1; i<=qq; i++) {
		Q++, q[Q].opt=read(), q[Q].u=read(), q[Q].v=read();
		if (q[Q].opt==2) q[Q].w=read();
		else q[Q].u=dfn[q[Q].u];
		if (Q==B) work(), Q=0;
	}
	if (Q) work();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 8ms
memory: 10260kb

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:

9583803
13180285
17509104
2495449
14041597
4862187
17446478
2599042
2115313
6338614
2264503
11461155
18914714
7404875
12322074
16642599
9012485
9616148
14014274
21111272
15682497
19718454
8811966
10265927
20100317
17759050
5813228
4665082
6844765
8546980
13861526
17919726
15090526
9820612
11856223
2...

result:

wrong answer 1st lines differ - expected: '285125508', found: '9583803'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Time Limit Exceeded

Test #6:

score: 0
Time 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:

18989389223234755588670
15562161608996178353351
2157081723691218182651
18983768287943481790670
872526310710311405478
15002086459827911285495
19535973546776791393609
2470269834776001552968
17806595429189873134026
9556769120598565387008
447141510593551050561
20237515957724743463278
1398620347793898144...

result:


Subtask #4:

score: 0
Skipped

Dependency #1:

0%