QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#65476#5094. 小 H 分糖果zqyyy0 5ms13908kbC++206.5kb2022-12-01 11:34:132022-12-01 11:34:14

Judging History

你现在查看的是测评时间为 2022-12-01 11:34:14 的历史记录

  • [2023-10-04 02:47:51]
  • 管理员手动重测本题所有提交记录
  • 测评结果:0
  • 用时:0ms
  • 内存:12100kb
  • [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:34:14]
  • 评测
  • 测评结果:0
  • 用时:5ms
  • 内存:13908kb
  • [2022-12-01 11:34:13]
  • 提交

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, -1);
	s_in=0;
	for (int i=1; i<=cnt; i++) if (fwk::ask(seq[i])) seq_in[++s_in]=a[seq[i]];
	for (int i=1; i<=s_seg; i++) fwk::add(seg[i].fi, -1), fwk::add(seg[i].se+1, 1);
	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(); int qq=read(); B=qq; //sqrt(n);
	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;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 5ms
memory: 13908kb

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
2455597
13999981
4820571
17446478
2557426
2073697
6296998
2222887
11461155
18566527
7013592
12109416
16425750
8793427
9394786
13795216
20892214
14526998
18578913
7682249
9083307
18909129
16067125
4153603
3033979
6284873
8456379
13750189
17898990
14581028
8793094
10807969
19...

result:

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

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Runtime Error

Test #6:

score: 0
Runtime Error

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%