【BZOJ - 2243】 SDOI2011 染色

    · 蒟蒻题解, 大神轻虐

    · 各种丑代码

    · 各种绕弯子



    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2243


    Delayyy君吐槽这题本机测比OJ快一倍……

    于是就去写了写.

    树链剖分 or LCT , 各种乱搞.

    本机:树链剖分4s+, LCT 8s+ (太懒了直接代入结构体……各种萎)

    OJ :树链剖分4s+, LCT 10s+

    ……我是没什么意见啦

    但Delayyy君也是10s+ 本机却只有6s

    OJ 的 O2- 抽风了, 诶?

    

    非常非常……裸的代码题.

    树链剖分或者LCT都能水过. 诶不知道 ? 度娘文库里有的是……我就不摆出来了 (还是因为懒...)

    不过今天写的时候发现了一些问题……

        1、子树信息pushdown.    这个原来一直写revroot, 也就是先找到根然后pushdown下来再旋上去. 不过今天突然想到压根就没那必要吧……

              只需要在rotate操作里先 pushdown (f[x]), 然后 pushdown(x) 就可以了.

        2、关于树的遍历. 本机上Delayyy君被某条链爆栈了……改BFS即可过. LCT因为初始化只需要保存父节点, 所以以后还是用BFS算了……

              以防出题人节操丧失. 

        3、updateupdate_size 为啥一定要写啊我> <~ 有的时候不是根本没必要的么......


     代码以下, 版本 1 树链剖分, 版本 2 LCT.


    

#include <cstdio>
#include <cstdlib>
#include <algorithm>
char ch;
#define max(A, B)
#define son (k << 1)
#define mid ((l + r) >> 1)
#define gs (ch < '0' || ch > '9')
int getint() { int wis = 0; ch = getchar(); while (gs) ch = getchar(); while (!gs) wis = wis * 10 + ch - '0', ch = getchar(); return wis; }
const int ys = 300010;
using namespace std;

bool t[ys];
int n, m, nowp, sg, x, y, co;
int size[ys], da[ys], f[ys], up[ys], point[ys], v[ys], d[ys];
int g[ys], next[ys * 2], c[ys * 2], col[ys], push[ys * 4]; 

struct Lek
{
    int left, right, tot;
}   p[ys * 4];
void dfs(int z)
{
    t[z] = true;  size[z] = 1;  int w = 0;  
    for (int x = g[z]; x; x = next[x])
      if (!t[c[x]])  
        if (dfs(c[x]), size[z] += size[c[x]], size[c[x]] > w)
          point[z] = x, w = size[c[x]];    
}
void mak(int z, int dt)
{
    t[z] = false;   v[++sg] = z;  da[z] = sg;  f[z] = nowp;   d[z] = dt; 
    if (point[z])  mak(c[point[z]], dt);
    for (int x = g[z]; x; x = next[x])
      if (t[c[x]])  up[c[x]] = z, nowp = c[x], mak(c[x], dt + 1);
}
void marge(Lek &a, Lek b)
{
    a.tot += b.tot;
    if (a.left == b.right)  a.tot--;
    if (!a.right)  a.right = b.right;
    if (b.left)  a.left = b.left; 
}
Lek build(int l, int r, int k)
{
    if (l == r)  return p[k] = (Lek){col[v[l]], col[v[l]], 1};
    p[k] = build(mid + 1, r, son + 1);
    return marge(p[k], build(l, mid, son)), p[k]; 
}
void pus(int k)
{
    if (push[k])  
    p[son].right = p[son].left = p[son + 1].right = p[son + 1].left = push[k],
    p[son].tot = p[son + 1].tot = 1, push[son + 1] = push[son] = push[k], push[k] = 0;
}
Lek tot(int x, int y, int l, int r, int k)
{
    pus(k);
    if (y < l  ||  x > r)  return (Lek){0, 0, 0};
    if (x <= l  &&  y >= r)  return p[k];
    Lek q = tot(x, y, mid + 1, r, son + 1);
    return marge(q, tot(x, y, l, mid, son)), q; 
}
void cov(int x, int y, int c, int l, int r, int k)
{
    if (y < l  ||  x > r)  return;  pus(k);
    if (x <= l  &&  y >= r)  p[k] = (Lek){c, c, 1}, push[k] = c;
    else  cov(x, y, c, l, mid, son), cov(x, y, c, mid + 1, r, son + 1),
          p[k] = p[son + 1], marge(p[k], p[son]); 
}
int query(int x, int y)
{
    Lek y_tot = {0, 0, 0}, x_tot = {0, 0, 0};
    while (f[x] != f[y])
      if (d[f[x]] < d[f[y]])  marge(y_tot, tot(da[f[y]], da[y], 1, n, 1)), y = up[f[y]];
      else  marge(x_tot, tot(da[f[x]], da[x], 1, n, 1)), x = up[f[x]];  
    if (da[x] > da[y]) return swap(y_tot.left, y_tot.right), marge(x_tot, tot(da[y], da[x], 1, n, 1)), marge(x_tot, y_tot), x_tot.tot;
    else  return swap(x_tot.left, x_tot.right), marge(y_tot, tot(da[x], da[y], 1, n, 1)), marge(y_tot, x_tot), y_tot.tot;
}
void change(int x, int y, int c)
{
    while (f[x] != f[y])
      if (d[f[x]] < d[f[y]])  cov(da[f[y]], da[y], c, 1, n, 1), y = up[f[y]];
      else  cov(da[f[x]], da[x], c, 1, n, 1), x = up[f[x]];
    if (da[x] > da[y])  swap(x, y);
    cov(da[x], da[y], c, 1, n, 1);
}
void add(int x, int y)
{
    c[++sg] = y, next[sg] = g[x], g[x] = sg;
    c[++sg] = x, next[sg] = g[y], g[y] = sg;
}
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    n = getint(); m = getint();
    for (int i = 1; i <= n; ++i)  col[i] = getint() + 1;
    for (int i = 1; i < n; ++i) 
      x = getint(), y = getint(), add(x, y);  
    sg = 0;
    dfs(1);  nowp = 1, mak(1, 1);  build(1, n, 1); 
    for (int i = 1; i <= m; ++i)
      {
          while (ch != 'C'  &&  ch != 'Q')  ch = getchar();
          if (ch == 'Q')  x = getint(), y = getint(), printf("%d\n", query(x, y));
          else  x = getint(), y = getint(), co = getint(), change(x, y, co + 1);
      }      
}


#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define a p[c[x][0]]
#define b p[c[x][1]]
char ch;
#define add(A, B) cp[++sg] = B, next[sg] = g[A], g[A] = sg
#define gs (ch < '0' ||  ch > '9')
int getint() { int wis = 0; ch = getchar(); while (gs) ch = getchar(); while (!gs) wis = wis * 10 + ch - '0', ch = getchar(); return wis; }
const int ys = 100010;
using namespace std;

int n, m, x, y, z, q, lap, sg;
int g[ys], next[ys * 2], cp[ys * 2];
int col[ys], pus[ys];
int c[ys][2], w[ys], f[ys];

struct Lek
{
    int tot, right, left;
}   p[100010], ans, clear;
void update(int x)
{
    p[x].tot = a.tot + b.tot - (a.right == col[x]) - (b.left == col[x]) + 1;
    p[x].left = !a.left ? col[x] : a.left;
    p[x].right = !b.right ? col[x] : b.right;
}
void push(int x)
{
    if (pus[x])  
      pus[c[x][0]] = pus[c[x][1]] = col[c[x][0]] = col[c[x][1]] = pus[x],
      p[c[x][0]] = p[c[x][1]] = (Lek){1, pus[x], pus[x]};
    pus[x] = 0;
    p[0] = clear;  pus[0] = col[0] = 0;
}
void rota(int x)
{
    int y = f[x], p, q;  push(y);  push(x);
    w[x] = w[y];  p = c[y][1] == x;  q = !p;
    if (w[y])  c[f[y]][y == c[f[y]][1]] = x;  w[y] = 1;
    f[x] = f[y];  f[y] = x;
    c[y][p] = c[x][q];  f[c[x][q]] = y; 
    c[x][q] = y;  
    update(y);   
}
void splay(int x)
{
    int y, z;   
    for (; w[x]; rota(x))
      if (y = f[x], z = f[y], w[y])
        if ((c[y][1] == x) ^ (c[z][1] == y))
          rota(y);  else  rota(x);
    push(x);  update(x);
}
int access(int u)
{
    int v = 0;
    for (; u; v = u, u = f[u])
      {   
          splay(u);  lap = c[u][1];
          if (c[u][1])  w[c[u][1]] = 0; c[u][1] = v;
          if (v)  f[v] = u, w[v] = 1;   
          update(u);
      }    
    return v;
}
void dfs(int z)
{
    for (int x = g[z]; x; x = next[x])
      if (cp[x] != f[z])  f[cp[x]] = z, dfs(cp[x]);
}
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    n = getint(), m = getint();
    for (int i = 1; i <= n; ++i)  
      col[i] = getint() + 1, p[i] = (Lek){1, col[i], col[i]};
    for (int i = 1; i < n; ++i) 
      x = getint(), y = getint(), add(x, y), add(y, x);
    dfs(1);
    for (int i = 1; i <= m; ++i)
      {
          while (ch != 'C'  &&  ch != 'Q')  ch = getchar();
          if (ch == 'C')  
            {
               x = getint(); y = getint(); z = getint() + 1;
               access(x);  q = access(y);  splay(q);  
               pus[c[q][1]] = pus[lap] = col[c[q][1]] = col[lap] = col[q] = z;  
               p[c[q][1]] = p[lap] = (Lek){1, z, z};
               update(q);
               p[0] = clear;  pus[0] = col[0] = 0;
            }     
          else
            {
               x = getint(); y = getint();
               access(x);  q = access(y);  splay(q);
               printf("%d\n", p[lap].tot + 1 + p[c[q][1]].tot - (p[lap].left == col[q]) - (p[c[q][1]].left == col[q]));  
            }    
      }    
}




相关推荐
<p> 需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》, </p> <p> 课程链接 https://edu.csdn.net/course/detail/29865 </p> <h3> <span style="color:#3598db;">【为什么要学习这门课】</span> </h3> <p> <span>Linux</span>创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap. Show me the code. </span><strong><span style="color:#ba372a;">冗谈不够,放码过来!</span></strong> </p> <p> <span> </span>代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。 </p> <p> YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。 </p> <p> YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。 </p> <h3> <span style="color:#3598db;">【课程内容与收获】</span> </h3> <p> 本课程将解析YOLOv4的实现原理和源码,具体内容包括: </p> <p> - YOLOv4目标检测原理<br /> - 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算<br /> - 代码阅读工具及方法<br /> - 深度学习计算的利器:BLAS和GEMM<br /> - GPU的CUDA编程方法及在darknet的应用<br /> - YOLOv4的程序流程 </p> <p> - YOLOv4各层及关键技术的源码解析 </p> <p> 本课程将提供注释后的darknet的源码程序文件。 </p> <h3> <strong><span style="color:#3598db;">【相关课程】</span></strong> </h3> <p> 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括: </p> <p> 《YOLOv4目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4-tiny目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4目标检测实战:人脸口罩佩戴检测》<br /> 《YOLOv4目标检测实战:中国交通标志识别》 </p> <p> 建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。 </p> <h3> <span style="color:#3598db;">【YOLOv4网络模型架构图】</span> </h3> <p> 下图由白勇老师绘制 </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006291526195469.jpg" /> </p> <p>   </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202007011518185782.jpg" /> </p>
<p> 欢迎参加英特尔® OpenVINO™工具套件初级课程 !本课程面向零基础学员,将从AI的基本概念开始,介绍人工智能与视觉应用的相关知识,并且帮助您快速理解英特尔® OpenVINO™工具套件的基本概念以及应用场景。整个课程包含了视频的处理,深度学习的相关知识,人工智能应用的推理加速,以及英特尔® OpenVINO™工具套件的Demo演示。通过本课程的学习,将帮助您快速上手计算机视觉的基本知识和英特尔® OpenVINO™ 工具套件的相关概念。 </p> <p> 为保证您顺利收听课程参与测试获取证书,还请您于<strong>电脑端</strong>进行课程收听学习! </p> <p> 为了便于您更好的学习本次课程,推荐您免费<strong>下载英特尔® OpenVINO™工具套件</strong>,下载地址:https://t.csdnimg.cn/yOf5 </p> <p> 收听课程并完成章节测试,可获得本课程<strong>专属定制证书</strong>,还可参与<strong>福利抽奖</strong>,活动详情:https://bss.csdn.net/m/topic/intel_openvino </p> <p> 8月1日-9月30日,学习完成【初级课程】的小伙伴,可以<span style="color:#FF0000;"><strong>免费学习【中级课程】</strong></span>,中级课程免费学习优惠券将在学完初级课程后的7个工作日内发送至您的账户,您可以在:<a href="https://i.csdn.net/#/wallet/coupon">https://i.csdn.net/#/wallet/coupon</a>查询优惠券情况,请大家报名初级课程后尽快学习哦~ </p> <p> <span style="font-size:12px;">请注意:点击报名即表示您确认您已年满18周岁,并且同意CSDN基于商务需求收集并使用您的个人信息,用于注册OpenVINO™工具套件及其课程。CSDN和英特尔会为您定制最新的科学技术和行业信息,将通过邮件或者短信的形式推送给您,您也可以随时取消订阅不再从CSDN或Intel接收此类信息。 查看更多详细信息请点击CSDN“<a href="https://passport.csdn.net/service">用户服务协议</a>”,英特尔“<a href="https://www.intel.cn/content/www/cn/zh/privacy/intel-privacy-notice.html?_ga=2.83783126.1562103805.1560759984-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">隐私声明</a>”和“<a href="https://www.intel.cn/content/www/cn/zh/legal/terms-of-use.html?_ga=2.84823001.1188745750.1560759986-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">使用条款</a>”。</span> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页