闲来无事做了丽洁姐姐的题

t1给一棵树 每个点有点权 每次修改点权 修改后询问每个点到树的带权重心的带权距离是多少 每个点度数不超过20

很显然的一个点分树。。。

我们记一下

每个点的子树中的所有点到该点的带权距离。
每个点的子树中的所有点到该点的父亲的带权距离。
每个点的子树中的所有点的权值和。

大概就可以随便做了(当然说起来简单实际上写的又臭又长。。。)

转移的时候从分治重心开始往分治子树走看哪个更优

#include<bits/stdc++.h>
#define LL long long
const int maxn = ;
using namespace std;
int m,n;
int first[maxn],to[maxn],next[maxn],val[maxn],cnt;
inline void add(int u,int v,int w)
{
to[++cnt]=v;
val[cnt]=w;
next[cnt]=first[u];
first[u]=cnt;
}
int dep[maxn],dis[maxn],fat[maxn][],s[maxn];
int id[maxn],ip[maxn],top;
void dfs(int u,int fa)
{
s[++top]=u;
if(!id[u])id[u]=top;
dep[top]=dep[ip[fa]]+;ip[u]=top;
for(int i=first[u];i;i=next[i])
{
int v=to[i];
if(v==fa)continue;
dis[v]=dis[u]+val[i];
dfs(v,u);s[++top]=u;dep[top]=dep[ip[fa]+];
}
}
void make()
{
for(int i=;i<=top;i++) fat[i][]=i;
for(int j=;j<=;j++)
for(int i=;i<=top;i++)
if(i+(<<j)-<=top)
{
int x=fat[i][j-],y=fat[i+(<<j-)][j-];
if(dep[fat[i][j-]]<dep[fat[i+(<<j-)][j-]]) fat[i][j]=fat[i][j-];
else fat[i][j]=fat[i+(<<j-)][j-];
}
}
inline int query(int l,int r)
{
int len=r-l+,k=;
for(k=;<<k+<=len;k++);
if(dep[fat[l][k]]<dep[fat[r-(<<k)+][k]])return fat[l][k];
else return fat[r-(<<k)+][k];
}
inline int lca(int u,int v)
{
if(id[u]>id[v]) swap(u,v);
return s[query(id[u],id[v])];
}
inline int caldis(int u,int v)
{
int LCA=lca(u,v);
return dis[u]+dis[v]-*dis[LCA];
}
int rt,sum,f[maxn],size[maxn],vis[maxn];
inline void GetRT(int x,int fa)
{
size[x]=;f[x]=;
for(int i=first[x];i;i=next[i])
{
if(to[i]==fa || vis[to[i]])continue;
GetRT(to[i],x);size[x]+=size[to[i]];
f[x]=max(f[x],size[to[i]]);
}
f[x]=max(f[x],sum-size[x]);
if(f[x]<f[rt])rt=x;
}
int ret,dv[maxn],par[maxn];
LL ans[maxn],anss[maxn],summ[maxn];
inline void work(int x)
{
vis[x]=;summ[x]=ret;
for(int i=first[x];i;i=next[i])
{
if(vis[to[i]])continue;
rt=,sum=size[to[i]];
GetRT(to[i],);
par[rt]=x;work(rt);
}
}
LL cal(int u)
{
LL ret=ans[u];
for(int i=u;par[i];i=par[i])
{
LL delt=caldis(par[i],u);
ret+=(ans[par[i]]-anss[i]);
ret+=delt*(summ[par[i]]-summ[i]);
}
return ret;
}
LL update(int u,int va)
{
summ[u]+=va;
for(int i=u;par[i];i=par[i])
{
LL di=caldis(par[i],u);
summ[par[i]]+=va;
anss[i]+=va*di;
ans[par[i]]+=va*di;
}
}
int last=;
LL query(int u)
{
LL ka=cal(u);
for(int i=first[u];i;i=next[i])
{
LL tmp=cal(to[i]);
if(tmp < ka)return query(to[i]);
}
last=u;
return ka;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}top=,dfs(,);
//cout<<top<<endl;
make();sum=f[]=n;GetRT(,);
work(rt);
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
update(a,b);
printf("%lld\n",query(last));
}
}

t2图上每个边是0~1的随机实数 求最小生成树上最大边的期望 n<=10

clj:我们可以积分啊

进一步分析可以注意到,考虑一个x,如果<x的边合起来不能使得图联通,<=x的边合起来能够使得图联通,那么这个图的最小瓶颈生成上的最大边就是x。

那么,用WC讲过的同样的方法,我们可以得到一个多项式P(x),表示<x的边不能使得图联通的概率。

那么注意到,我们只需要对P(x)从0到1求积分就是答案了。为什么呢?因为P(x)也是答案>x的概率,这样相当于一个分部积分。

然后积了两个多小时的分...

后来觉得可以考虑状压dp

可以点这个链接去看一下状压dp做法(白积了半天分QAQ

http://blog.csdn.net/skywalkert/article/details/47792065

#include <cstdio>
const int maxn = , maxm = ;
int n, m, e[maxn], sz[ << maxn], cnt[ << maxn];
long long c[maxm][maxm], f[ << maxn][maxm], g[ << maxn][maxm];
double ans;
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i < m; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
--u;
--v;
e[u] |= << v;
e[v] |= << u;
}
c[][] = ;
for(int i = ; i <= m; ++i)
{
c[i][] = c[i][i] = ;
for(int j = ; j < i; ++j)
c[i][j] = c[i - ][j - ] + c[i - ][j];
}
for(int s = ; s < << n; ++s)
{
sz[s] = sz[s >> ] + (s & );
if(sz[s] == )
{
g[s][] = ;
continue;
}
for(int i = ; i < n; ++i)
if((s >> i) & )
cnt[s] += sz[e[i] & s];
cnt[s] >>= ;
int lowbit = s & -s;
for(int t = (s - ) & s; t; t = (t - ) & s)
if(t & lowbit)
for(int i = ; i <= cnt[t]; ++i)
for(int j = ; j <= cnt[s ^ t]; ++j)
f[s][i + j] += g[t][i] * c[cnt[s ^ t]][j];
for(int i = ; i <= cnt[s]; ++i)
g[s][i] = c[cnt[s]][i] - f[s][i];
}
for(int i = ; i <= m; ++i)
ans += (double)f[( << n) - ][i] / c[cnt[( << n) - ]][i];
ans /= m + ;
printf("%.6f\n", ans);
return ;
}

状压dp

t3题意不可描述...bzoj3926

广义后缀自动机 解法不是很好描述 可以看代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = ;
int n,c;
int first[maxn],next[maxn],to[maxn],val[maxn],cnt;
int rd[maxn];
ll ans;
inline void add(int u,int v)
{
to[++cnt]=v;
next[cnt]=first[u];
first[u]=cnt;
to[++cnt]=u;
next[cnt]=first[v];
first[v]=cnt;
}
struct SAM
{
int cnt;
int fa[maxn],mx[maxn],a[maxn][];
SAM(){cnt=;}
inline int extend(int p,int c)
{
int np=++cnt;mx[np]=mx[p]+;
while(!a[p][c]&&p)a[p][c]=np,p=fa[p];
if(!p)fa[np]=;
else
{
int q=a[p][c];
if(mx[p]+==mx[q])fa[np]=q;
else
{
int nq=++cnt;mx[nq]=mx[p]+;
memcpy(a[nq],a[q],sizeof(a[q]));
fa[nq]=fa[q];
fa[np]=fa[q]=nq;
while(a[p][c]==q)a[p][c]=nq,p=fa[p];
}
}
return np;
}
inline void calc(){for(int i=;i<=cnt;i++)ans+=mx[i]-mx[fa[i]];}
}sam;
inline void dfs(int u,int fa,int curpos)
{
int nexpos = sam.extend(curpos,val[u]);
for(int i=first[u];i;i=next[i])
if(to[i] != fa)dfs(to[i],u,nexpos);
}
int main()
{
scanf("%d%d",&n,&c);
for(int i=;i<=n;i++)scanf("%d",&val[i]);
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);rd[u]++,rd[v]++;
}
for(int i=;i<=n;i++)
if(rd[i] == )dfs(i,,);
sam.calc();
printf("%lld",ans);
}

zjoi2015d1题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 中兴应用之星携手天翼开放平台:让APP开发更简单

    日前,业内率先的APP开发平台运营商中兴应用之星与中国电信天翼开放平台达成战略合作.即广大用户通过天翼开放平台,可直接享受到应用之星提供的"APP开发服务".   应用之星.中兴通 ...

  2. java和C#实例化类初始化顺序

    c# 初始化顺序 子类的静态字段 子类的静态构造方法 子类的实例字段 父类的静态字段 父类的静态构造方法 父类的实例字段 父类的实例构造方法 java 初始化顺序 初始化过程: 1. 初始化父类中的静 ...

  3. 使用java+TestNG进行接口回归测试

    TestNG是一个开源自动化测试框架,“NG”表示下一代(Next Generation的首字母). TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展,相较于Juni ...

  4. linux中likely()和unlikely()

    likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?首先明确: if (likely(value))等价于if (value) if (unlike ...

  5. 认识 service worker

    离线缓存可以提升用户体验,可以节省网络资源,但是,浏览器对资源缓存和自定义网络请求的控制一直不够完善,service worker 的出现就是为了解决这些问题 它可以解决目前离线应用的问题,同时也可以 ...

  6. 32.10 使用模板更改控件的UI

    32.10  使用模板更改控件的UI 样式是改变WPF控件基本外形的非常好(且非常简单)的方式,它通过为窗口部件的特性设置建立一组默认的值,从而改变WPF控件的基本外形.但是,即使样式允许我们改变各种 ...

  7. JBoss AS 7之域名直接訪问配置(The Return Of The King)

    1.6域名直接訪问配置 部署JBoss的时候,默认情况下訪问是须要加项目名字才可以訪问的. 可是怎样才可以"IP+port"訪问呢?以下将解说怎样配置. 配置域名訪问须要在项目以下 ...

  8. 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治

    [BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...

  9. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  10. Java 8 default 函数

    我们知道在java8之前 ,一个类实现一个接口需要实现接口所有的方法, 但是这样会导致一个问题,当一个接口有很多的实现类的时候,修改这个接口就变成了一个非常麻烦的事,需要修改这个接口的所有实现类 不过 ...