博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ USACO 2010 FEB ] Slowing Down
阅读量:5239 次
发布时间:2019-06-14

本文共 1370 字,大约阅读时间需要 4 分钟。

\(\\\)


给出一棵 \(N\) 个点的树和 \(N\) 头牛,每头牛都要去往一个节点,且每头牛去往的点一定互不相同。

现在按顺序让每一头牛去往自己要去的节点,定义一头牛的代价为,路径上经过的已经有牛的节点数,求每一头牛的代价。

  • \(N\le 10^5\)

\(\\\)

\(Solution\)


注意到一个节点的影响只是在其子树内,考虑 \(DFS\) 的时候直接统计答案。

在每个节点上记录到这个点的牛的编号。那么对当前点有影响的点满足:

  • 在根到这个点的路径上\((\) 是当前点的祖先\()\)
  • 编号比这个点小

关于第二点,我们可以用值域树状数组通常的打标记求前缀和的方式知道个数。

但是我们要保证树状数组里只有根到当前点这一条链上的所有点。

这个部分可以通过撤销标记实现,即 \(DFS\) 完整棵子树之后在树状数组里撤销标记。

\(\\\)

\(Code\)


#include
#include
#include
#include
#include
#include
#include
#define N 100010#define R register#define gc getcharusing namespace std;inline int rd(){ int x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x;}int n,m,tot,hd[N],p[N],ans[N];struct edge{int to,nxt;}e[N<<1];inline void add(int u,int v){ e[++tot].to=v; e[tot].nxt=hd[u]; hd[u]=tot;}struct BIT{ int c[N]; inline int lowbit(int x){return x&-x;} inline void add(int p,int x){for(;p<=n;p+=lowbit(p))c[p]+=x;} inline int sum(int p){ int res=0; for(;p;p-=lowbit(p)) res+=c[p]; return res; }}bit;inline void dfs(int u,int fa){ ans[p[u]]=bit.sum(p[u]); bit.add(p[u],1); for(R int i=hd[u],v;i;i=e[i].nxt) if((v=e[i].to)!=fa) dfs(v,u); bit.add(p[u],-1);}int main(){ n=rd(); for(R int i=1,u,v;i

转载于:https://www.cnblogs.com/SGCollin/p/9795240.html

你可能感兴趣的文章
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
Android实现静默安装与卸载
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
Java反射之修改常量值
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
MySQL中的隔离级别和悲观锁及乐观锁示例
查看>>
手机端h5 ajax 上传图片支持微信内置浏览器
查看>>
Redmine
查看>>
HtmlEditor常用模式
查看>>
Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
查看>>
帧的最小长度 CSMA/CD
查看>>