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. python实现数字0开始的索引,对应Execl的字母方法

    字母转数字方法: import re col = row = [] # 输入正确格式的定位,A2,AA2有效,AAB2无效 while len(col) == 0 or len(row) == 0 o ...

  2. eclipse怎样修改同名包(package)的显示样式、格式

    打开我们的项目,可以看到左侧的package看上去特别多,没有层级. 点击Package Explorer右上角的箭头图标. 可以看到“Flat(扁平)”,“Hierarchical(分层)”两个选项 ...

  3. c#基于TCP/IP、CIP协议的欧姆龙PLC通信

    一.关于CIP协议 CIP通信是Common Industrial Protocl(CIP)的简称,它是一个点到点的面向对象协议,能够实现工业器件(传感器,执行器)之间的连接,和高等级的控制器之间的连 ...

  4. python - pyxel 制作游戏

    之前看了一个项目,觉得还挺有意思的,是关于做一个像素风的游戏,现在,虚幻4,u3d,已经让游戏愈发的好看,好玩,曾经我们童年的像素风游戏,愈来愈少.所以,这里我们就回味下. Pyxel是一个pytho ...

  5. mac安装composer

    推荐阅读:https://www.jianshu.com/p/edde14a67b1a 自己实际操作: 下载 composer https://getcomposer.org/download/ 下载 ...

  6. div上中下布局中间自适应

    需求1: 头尾固定高度,中间自适应 1.上部(header)Div高度固定100px,宽度100%: 2.下部(footer)Div高度固定100px,宽度100%: 3.中部(middle)DIV高 ...

  7. 【大数据】Clickhouse基础知识

    第1章 ClickHouse概述 1.1 什么是ClickHouse ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能 ...

  8. vuejs开发流程

    https://www.cnblogs.com/yexiaowang/p/8489250.html

  9. 如何解决Win10不能新建项目的问题?

    在Win10系统中,我们有时候会遇到右键菜单中没有新建项的情况,这时我们就无法进行文件的新建,非常耽误我们使用电脑.下面雨后清风就来分享一下Win10系统右键菜单没有新建项的解决方法. Win10系统 ...

  10. Flutter——AppBar组件(顶部导航组件)

    AppBar组件的常用属性如下: 属性 描述 leading 在标题前面显示的一个控件,在首页通常显示应用的 logo:在其他界面通常显示为返回按钮 title 标题,通常显示为当前界面的标题文字,可 ...