https://www.luogu.org/problemnew/show/P1600

nlogn竟然T了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#include <vector> using namespace std;
const int N = ;
const int oo = ; #define lson jd << 1
#define rson jd << 1 | 1 #define yxy getchar()
#define one_ n <= 993
#define two_ n == 99994
#define three_ n == 99995 int head[N], pre[N], dis[N], tim[N], Answer[N], Askl[N], Askr[N];
bool vis[N];
int n, m, now = ;
struct Node {int u, v, w, nxt;}G[N];
queue <int> Q;
vector <int> Vt[N];
int bef[N], top[N], deep[N], size[N], fa[N], son[N], tree[N], spjs;
int L[N << ], R[N << ], W[N << ], F[N << ];
int ans; inline int read() {
int x = ; char c = yxy;
while(c < '' || c > '') c = yxy;
while(c >= '' && c <= '') x = x * + c - '', c = yxy;
return x;
} inline void add(int u, int v) {G[now].v = v;G[now].nxt = head[u]; head[u] = now ++;} inline void spfa(int start,int endd) {
for(int i = ; i <= n; i ++) dis[i] = oo, vis[i] = ;
dis[start] = ;
Q.push(start);
while(!Q.empty()) {
int topp = Q.front(); Q.pop();
vis[topp] = ;
for(int i = head[topp]; ~ i; i = G[i].nxt) {
if(dis[G[i].v] > dis[topp] + ) {
dis[G[i].v] = dis[topp] + ;
pre[G[i].v] = topp;
if(!vis[G[i].v]) {vis[G[i].v] = ; Q.push(G[i].v);}
}
}
}
} void calc(int start, int endd, int diss) {
int js = -; pre[start] = ;
while(endd) {
js ++;
if(tim[endd] == diss - js) Answer[endd] ++;
endd = pre[endd];
}
} void work_1() {
for(int i = ; i <= m; i ++) {
spfa(Askl[i], Askr[i]);
calc(Askl[i], Askr[i], dis[Askr[i]]);
}
} void work_2() {
for(int i = ; i <= m; i ++) Vt[Askl[i]].push_back(Askr[i]);
for(int i = ; i <= n; i ++) {
int L_ = i - tim[i], R_ = i + tim[i];
int siz_ = Vt[L_].size();
if(L_ > )
for(int j = ; j < siz_; j ++)
if(Vt[L_][j] >= i) Answer[i] ++;
siz_ = Vt[R_].size();
if(R_ <= n)
for(int j = ; j < siz_; j ++)
if(Vt[R_][j] <= i) Answer[i] ++;
}
} void Dfs_son(int u, int f_, int dep) {
printf("%d %d\n", u, f_);
fa[u] = f_;
deep[u] = dep;
size[u] = ;
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(v != f_) {
Dfs_son(v, u, dep + );
if(size[v] > size[son[u]]) son[u] = v;
}
}
} void Dfs_un(int u, int tp){
top[u] = tp;
tree[u] = ++ spjs;
bef[spjs] = u;
if(!son[u]) return ;
Dfs_un(son[u], tp);
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(v != fa[u] && v != son[u]) Dfs_un(v, v);
}
} void Sec_G(int l, int r, int jd, int x, int y) {
if(x <= l && r <= y) {
F[jd] ++; W[jd] += (r - l + ); return ;
}
int mid = (l + r) >> ;
if(x <= mid) Sec_G(l, mid, lson, x, y);
if(y > mid) Sec_G(mid + , r, rson, x, y);
W[jd] = W[lson] + W[rson];
} void down(int jd) {
F[lson] += F[jd]; F[rson] += F[jd];
W[lson] += (R[lson] - L[lson] + ) * F[jd];
W[rson] += (R[rson] - L[rson] + ) * F[jd];
F[jd] = ;
} inline void Sec_G_imp(int x, int y) {
int tp1 = deep[x], tp2 = deep[y];
while(tp1 != tp2) {
if(deep[tp1] < deep[tp2]) swap(x, y), swap(tp1, tp2);
Sec_G(, n, , tree[tp1], tree[x]);
x = fa[tp1];
tp1 = top[x];
}
if(deep[x] < deep[y]) swap(x, y);
Sec_G(, n, , tree[y], tree[x]);
return ;
} void Dfs_calc(int l, int r, int jd) {
if(l == r) {
if(deep[bef[l]] == tim[bef[l]]) Answer[bef[l]] = W[jd];
return ;
}
if(F[jd]) down(jd);
int mid = (l + r) >> ;
Dfs_calc(l, mid, lson);
Dfs_calc(mid + , r, rson);
} void work_3(){
Dfs_son(, , );
Dfs_un(, );
for(int i = ; i <= m; i ++) Sec_G_imp(Askl[i], Askr[i]);
Dfs_calc(, n, );
} int main()
{
n = read(); m = read();
for(int i = ; i <= n; i ++) head[i] = -;
for(int i = ; i <= n - ; i ++) {int u = read(); int v = read(); add(u, v); add(v, u);}
for(int i = ; i <= n; i ++) tim[i] = read();
for(int i = ; i <= m; i ++) Askl[i] = read(), Askr[i] = read();
if(one_) work_1();
else if(two_) work_2();
else if(three_) work_3();
for(int i = ; i <= n; i ++) printf("%d ", Answer[i]);
return ;
}

[Luogu] 1600的更多相关文章

  1. NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树

    题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...

  2. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...

  3. SQL 2008 R2下载 升级R2 SP1或者SQL 2008从10.50.1600升级10.5.2500

    SQL Server 2008 R2 中英文 开发版/企业版/标准版 链接地址 一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) - D ...

  4. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  5. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  6. Droidicon – 1600+ 漂亮的 Android 图标

    Droidicon 提供超过1600款定制图标,让你可以超级容易的把图标和徽章添加到您的应用程序中.你可以自定义你想要的各种形式的图标,给图标添加描边,透明度和颜色过滤器.包括这些 Google Ma ...

  7. 【BZOJ】1600: [Usaco2008 Oct]建造栅栏(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1600 说好的今天开始刷水.. 本题一开始我以为是排列组合,但是自己弱想不出来,只想到了如果四边有一条 ...

  8. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  9. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

随机推荐

  1. 【C#】课堂知识点#1

    标准数字格式字符串 https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-string ...

  2. Destination高级特性

    一.组合队列 Composite Destinations 组合队列允许用一个虚拟的destination代表多个destinations.这样就可以通过composite destinations在 ...

  3. 基于语法树和概率的AI模型

    语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次.简单说,语法树就是按照某一规则进行推导时所形成的树. 有了语法树,我们就可以根据其规则自动生成语句,但是语法树本身是死 ...

  4. C#四种深拷贝方法(转载)

    原文地址:https://www.cnblogs.com/profession/p/6222489.html //四种深拷贝方法 public static T DeepCopyByReflect&l ...

  5. ligerui.grid.extend.rowSpan

    扩展LigerUI的Grid中的相同列合并行功能,代码如下:$.extend($.ligerui.controls.Grid.prototype, { _getHtmlFromData:functio ...

  6. 如何在 vue 2.0+ 中引入全局的stylus文件,且能正常

    由于stylus在引用时,不能像一般的css文件直接在main.js中引用,就算引用了也会只能使用转换后的css,不能使用里面的函数,方法等,原因可能是:在这里引入会被直接编译成css,不能在别的模板 ...

  7. 关于微信小程序获取多个formId的实现方法

    在此之前,很多人使用过form和button的多层嵌套来实现点击一次获取多个formId的目的,如下图所示,点击一次“提交”,可以获取到多个formId 但是在今年3月份,这个投机取巧的方法(算是微信 ...

  8. ES6 class 于 继承 extends

    之前构造函数,没有类的概念,ES6中有了class类这个东西. 简单的一个例子: 输出: 需要注意的是,语法换了,但是构造函数.构造函数的原型.实例的关系还是那样. 输出: 需要注意写法: 底层还是p ...

  9. JS 断点调试心得

    1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断 ...

  10. ASE19团队项目 beta阶段 model组 scrum report list

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