QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#65475 | #5094. 小 H 分糖果 | zqyyy | 0 | 8ms | 10260kb | C++20 | 6.5kb | 2022-12-01 11:30:16 | 2023-10-04 02:47:45 |
Judging History
This is the latest submission verdict.
- [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: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;
}
詳細信息
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%