11
24
2015
2

ZJOI20151123解题报告[JSOI 2015 day1]

作为一只2=狗能继续在这里做题还是很开心的。

T1:给定一颗有点权的树,每个树上的节点最多能走到lim[u]次,求一条路径,使路径上的点权和最大,每个节点上的点权如果走了多次只能算一次。还要求方案是否唯一。

第一眼:SPFA 的松弛次数限制?(因为树的条件只在input里面)

第二眼:我擦第一问这不是原题么。快乐排序。绝逼有很多人要写成n2 logn。

第三眼:我擦第二问日了狗了。

题解:每个点只能取lim[u]-1个子树。因为每个子树只取1次或不取,考虑树形DP,dp[u]=dp[v1]+dp[v2]+...(加lim[u]-1)个,是排序后最大的。因为不一定要去满lim[u]-1个,如果负数就不走。

判多解:

1.儿子不唯一老子不唯一。

2.取得最后一个和不取的第一个dp值相等就不唯一。

3.取得里面有0就不唯一。(考试时死在这里。)

T2.真的不想说什么。唯一的贡献就是让我学会了矩阵哈希的正确姿势。

for i:=1 to n do

  begin
   p:=mi1[n-i];
   for j:=1 to n do
   begin
    a[v,i,j]:=a[v,i,j]*p mod mo*mi2[n-j] mod mo;
    a[v,i,j]:=(a[v,i,j]+a[v,i-1,j]+a[v,i,j-1]-a[v,i-1,j-1]) mod mo;
    a[v,i,j]:=(a[v,i,j]+mo) mod mo;
   end;
 
function get(v,len,x,y:longint):int64;
var tmp:int64;
begin
 tmp:=(a[v,x,y]-a[v,x-len,y]-a[v,x,y-len]+a[v,x-len,y-len]) mod mo;
 tmp:=(tmp+mo) mod mo;
 tmp:=tmp*mi1[x] mod mo*mi2[y] mod mo;
 exit(tmp);
end;
 
值得一说的是本地极限0.7s,OJtle60
 

T3.定义题。做法请看题目。

删除假节点并连边:先按输入构图并统计每个点的度数 找一个度不为2的点做一遍dfs

if d[v]=2 f[find(u)]=f[find(v)]

做完之后重连所有f[x[i]]<>f[y[i]]的边

同构:

哈希,将点上的哈希初值都=1,对于点u,取与u相连的点权V并排序,随意哈希作为新的哈希值。迭代10000000000000000000000000000000次。最后只需判断哈希值是否相等。

 

Category: 解题报告 | Tags: 题解 | Read Count: 459

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com