QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#219960#7578. Salty FishPhantomThreshold#WA 812ms101552kbC++203.4kb2023-10-19 20:14:182023-10-19 20:14:20

Judging History

你现在查看的是最新测评结果

  • [2023-10-19 20:14:20]
  • 评测
  • 测评结果:WA
  • 用时:812ms
  • 内存:101552kb
  • [2023-10-19 20:14:18]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;

const int maxn = 310000;
const int maxp = maxn*4;
const int inf  = 1e15;

vector<int>E[maxn];
int n,m;

struct segment
{
	int tot;
	int seg[maxp],flag[maxp];
	int lc[maxp],rc[maxp];
	int newnode()
	{
		++tot;
		lc[tot]=rc[tot]=flag[tot]=0;
		seg[tot]=-inf;
		return tot;
	}
	void init()
	{
		tot=0;
	}
	void pushdown(const int x)
	{
		if(flag[x])
		{
			int fl=flag[x]; flag[x]=0;
			
			seg[lc[x]]+=fl; seg[rc[x]]+=fl;
			flag[lc[x]]+=fl; flag[rc[x]]+=fl;
		}
	}
	void build(int &x,const int l,const int r)
	{
		if(!x) x=newnode();
		if(l==r) return;
		int mid=(l+r)>>1;
		build(lc[x],l,mid); build(rc[x],mid+1,r);
	}
	int lx,rx,c;
	void add(const int x,const int l,const int r)
	{
		if(rx<l||r<lx) return;
		if(lx<=l&&r<=rx)
		{
			seg[x]+=c;
			flag[x]+=c;
			return;
		}
		pushdown(x);
		int mid=(l+r)>>1;
		add(lc[x],l,mid); add(rc[x],mid+1,r);
		seg[x]=max( seg[lc[x]],seg[rc[x]] );
	}
	int query(const int x,const int l,const int r)
	{
		if(rx<l||r<lx) return -inf;
		if(lx<=l&&r<=rx) return seg[x];
		pushdown(x);
		int mid=(l+r)>>1;
		return max( query(lc[x],l,mid), query(rc[x],mid+1,r) );
	}
	int loc;
	void upd(const int x,const int l,const int r)
	{
		if(l==r)
		{
			seg[x]=max(seg[x],c);
			return;
		}
		int mid=(l+r)>>1;
		pushdown(x);
		if(loc<=mid) upd(lc[x],l,mid);
		else upd(rc[x],mid+1,r);
		seg[x]=max( seg[lc[x]], seg[rc[x]] );
	}
}seg;

int ai[maxn];
int son[maxn],d[maxn],top[maxn],rt[maxn];
void dfs(const int x)
{
	d[x]=0;
	son[x]=0;
	for(auto y:E[x])
	{
		dfs(y);
		if(d[x]<d[y]+1) 
		{
			d[x]=d[y]+1;
			son[x]=y;
		}
	}
}
void dfs2(const int x,const int tp)
{
	top[x]=tp;
	rt[x]=0;
	if(x==tp)
	{
		seg.build(rt[x],1,1+d[x]);
	}
	
	if(son[x]) dfs2(son[x],tp);
	for(auto y:E[x]) if(y!=son[x])
	{
		dfs2(y,y);
	}
}
vector< pair<int,int> >V[maxn];
void dp(const int x)
{
	for(auto y:E[x])
	{
		dp(y);
	}
	
	int ff=top[x];
	
	if(son[x])
	{
		seg.lx= 1+d[ff]-d[x]+1, seg.rx=1+d[ff];
		seg.c=seg.query(rt[ff],1,1+d[ff])+ai[x];
		
		seg.loc= 1+d[ff]-d[x];
		seg.upd(rt[ff],1,1+d[ff]);
	}
	else
	{
		seg.loc= 1+d[ff]-d[x];
		seg.c=ai[x];
		seg.upd(rt[ff],1,1+d[ff]);
	}
	
	for(auto y:E[x]) if(y!=son[x])
	{
		for(int l=0;l<=d[y];l++)
		{
			seg.lx=1+l, seg.rx=1+d[y];
			int cc= max( 0ll, seg.query(rt[y],1,1+d[y]) );
			
			seg.lx=seg.rx= 1+d[ff]-d[x]+l+1;
			seg.c=cc;
			seg.add(rt[ff],1,1+d[ff]);
			
			if(l==0)
			{
				seg.lx=seg.rx= 1+d[ff]-d[x];
				seg.c=cc;
				seg.add(rt[ff],1,1+d[ff]);
			}
		}
	}
	for(auto [ki,ci]:V[x])
	{
		seg.lx=1+d[ff]-d[x],seg.rx= min(1+d[ff],seg.lx+ki);
		seg.c=-ci;
		seg.add(rt[ff],1,1+d[ff]);
	}
}

signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	int Tcase; cin>>Tcase;
	while(Tcase--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			vector<int>_;
			E[i].swap(_);
			vector< pair<int,int> >__;
			V[i].swap(__);
		}
		for(int i=2;i<=n;i++)
		{
			int fi; cin>>fi;
			E[fi].emplace_back(i);
		}
		for(int i=1;i<=n;i++) cin>>ai[i];
		for(int i=1;i<=m;i++)
		{
			int xi,ki,ci; cin>>xi>>ki>>ci;
			V[xi].emplace_back(ki,ci);
		}
		
		dfs(1);
		dfs2(1,1);
		seg.init();
		
		dp(1);
		int ans;
		seg.lx=1,seg.rx=1+d[1];
		ans=seg.query(rt[1],1,1+d[1]);
		cout<<ans<<'\n';
	}
	
	return 0;	
}

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 34268kb

input:

1
6 3
1 1 2 2 3
2 5 4 3 3 2
2 1 3
3 1 7
1 2 4

output:

6

result:

ok 1 number(s): "6"

Test #2:

score: -100
Wrong Answer
time: 812ms
memory: 101552kb

input:

1003
100 100
1 2 3 4 5 6 7 8 9 10 6 1 2 4 1 11 17 14 17 2 13 8 8 5 11 7 18 6 2 10 23 11 13 3 9 1 33 20 3 9 32 35 11 41 42 29 33 45 21 35 9 36 12 54 19 24 57 31 32 5 3 10 46 15 46 48 20 44 5 41 67 7 18 30 27 6 29 69 57 75 62 74 18 64 17 21 38 60 79 69 54 90 83 83 31 96 31 93 53
152 498 653 559 287 38...

output:

17075
13195
12521
18126
12991
18687
19125
13585
13467
10928
15446
18430
12872
10759
13660
16615
12603
14715
20265
13536
22136
14899
13977
17132
11890
20794
11841
16535
16109
19816
11378
17801
19046
11011
17502
13642
17974
17806
11244
6174
15736
8242
14569
20007
14538
13266
12757
19241
20447
14550
17...

result:

wrong answer 1st numbers differ - expected: '20180', found: '17075'