解题: SDOI 2011 染色

题面

强行把序列问题通过树剖套在树上。。。算了算是回顾了一下树剖的思想=。=

每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点都要考虑

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 const int N=100005;
  6 struct a
  7 {
  8     int cnt;
  9     int lc,rc;
 10 };
 11 int num[N],nmb[N],val[4*N],lcol[4*N],rcol[4*N],laz[4*N];
 12 int siz[N],dep[N],anc[N],imp[N],top[N],dfn[N];
 13 int p[N],noww[2*N],goal[2*N];
 14 int n,m,t1,t2,t3,cnt,tot;
 15 char rd[2];
 16 void link(int f,int t)
 17 {
 18     noww[++cnt]=p[f];
 19     goal[cnt]=t,p[f]=cnt;
 20 }
 21 void DFS(int nde,int fth,int dth)
 22 {
 23     int tmp=0;
 24     siz[nde]=1,anc[nde]=fth,dep[nde]=dth;
 25     for(int i=p[nde];i;i=noww[i])
 26         if(goal[i]!=fth)
 27         {
 28             DFS(goal[i],nde,dth+1);
 29             siz[nde]+=siz[goal[i]];
 30             if(siz[goal[i]]>tmp)
 31                 tmp=siz[goal[i]],imp[nde]=goal[i];
 32         }
 33 }
 34 void MARK(int nde,int tpp)
 35 {
 36     dfn[nde]=++tot,nmb[tot]=num[nde],top[nde]=tpp;
 37     if(imp[nde])
 38     {
 39         MARK(imp[nde],tpp);
 40         for(int i=p[nde];i;i=noww[i])
 41             if(goal[i]!=anc[nde]&&goal[i]!=imp[nde])
 42                 MARK(goal[i],goal[i]);
 43     }
 44 }
 45 void pushup(int nde)
 46 {
 47     int ls=2*nde,rs=2*nde+1;
 48     lcol[nde]=lcol[ls],rcol[nde]=rcol[rs];
 49     val[nde]=val[ls]+val[rs]-(rcol[ls]==lcol[rs]);
 50 }
 51 void create(int nde,int l,int r)
 52 {
 53     if(l==r)
 54         val[nde]=1,lcol[nde]=rcol[nde]=nmb[l];
 55     else
 56     {
 57         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1;
 58         create(ls,l,mid),create(rs,mid+1,r);
 59         pushup(nde);
 60     }
 61 }
 62 void release(int nde,int l,int r)
 63 {
 64     if(laz[nde])
 65     {
 66         int ls=2*nde,rs=2*nde+1;
 67         laz[ls]=lcol[ls]=rcol[ls]=laz[nde];
 68         laz[rs]=lcol[rs]=rcol[rs]=laz[nde];
 69         val[ls]=val[rs]=1; laz[nde]=0;
 70     }
 71 }
 72 void change(int nde,int l,int r,int nl,int nr,int task)
 73 {
 74     if(l>nr||r<nl)
 75         return ;
 76     else if(l>=nl&&r<=nr)
 77         val[nde]=1,lcol[nde]=rcol[nde]=laz[nde]=task;
 78     else
 79     {
 80         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r);
 81         change(ls,l,mid,nl,nr,task),change(rs,mid+1,r,nl,nr,task);
 82         pushup(nde);
 83     }    
 84 }
 85 a query(int nde,int l,int r,int nl,int nr)
 86 {
 87     if(l>=nl&&r<=nr)
 88         return (a){val[nde],lcol[nde],rcol[nde]};
 89     else
 90     {
 91         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r); 
 92         if(nr<=mid) return query(ls,l,mid,nl,nr);
 93         if(nl>mid) return query(rs,mid+1,r,nl,nr);
 94         a r1=query(ls,l,mid,nl,nr),r2=query(rs,mid+1,r,nl,nr),ret;
 95         ret.lc=r1.lc,ret.rc=r2.rc,ret.cnt=r1.cnt+r2.cnt-(r1.rc==r2.lc);
 96         return ret;
 97     }    
 98 }
 99 void path_change(int x,int y,int v)
100 {
101     while(top[x]!=top[y])
102     {
103         if(dep[top[x]]<dep[top[y]]) swap(x,y);
104         change(1,1,n,dfn[top[x]],dfn[x],v); x=anc[top[x]];
105     }
106     if(dep[x]>dep[y]) swap(x,y);
107     change(1,1,n,dfn[x],dfn[y],v); return ;
108 }
109 int path_query(int x,int y)
110 {
111     int rt=0,ll=-1,rr=-1;
112     while(top[x]!=top[y])
113     {
114         if(dep[top[x]]<dep[top[y]]) swap(x,y),swap(ll,rr);
115         a ret=query(1,1,n,dfn[top[x]],dfn[x]); x=anc[top[x]];
116         rt+=ret.cnt-(ll==ret.rc); ll=ret.lc;
117     }
118     if(dep[x]>dep[y]) swap(x,y),swap(ll,rr);
119     a ret=query(1,1,n,dfn[x],dfn[y]); rt+=ret.cnt-(ll==ret.lc)-(rr==ret.rc); 
120     return rt;
121 }
122 int main ()
123 {
124     scanf("%d%d",&n,&m);
125     for(int i=1;i<=n;i++)
126         scanf("%d",&num[i]);
127     for(int i=1;i<n;i++)    
128         scanf("%d%d",&t1,&t2),link(t1,t2),link(t2,t1);
129     DFS(1,0,1); MARK(1,1); create(1,1,n);
130     while(m--)
131     {
132         scanf("%s",rd);
133         if(rd[0]=='C')
134             scanf("%d%d%d",&t1,&t2,&t3),path_change(t1,t2,t3);
135         else 
136             scanf("%d%d",&t1,&t2),printf("%d\n",path_query(t1,t2));
137     }
138     return 0;
139 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/9743416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

decode()、nvl()等用法详解

1、decode( 条件, if1, then1, if2, then2&#xff0c; 缺省值 )&#xff1a; 当条件 1时&#xff0c;则为1&#xff1b;else条件 2时&#xff1b;则为2&#xff1b;都不等时&#xff0c;为缺省值。 2、nvl&#xff08;a , b&#xff09;函数&#xff1a;如果a为NULL&#xf…

java.lang.OutOfMemoryError: PermGen space

使用Tomcat报java.lang.OutOfMemoryError: PermGen space错误时&#xff0c;这是tomcat的内存不够的原因&#xff0c;也就是tomcat的内存溢出。 这是我们只要在tomcat的配置下添加服务内存就可以了&#xff0c;添加内存方法&#xff0c;只要加入 -Xms256M -Xmx512M -XX:PermS…

js继承问题

JavaScript 继承问题 继承的发展史 传统形式 ----> 原型链 继承了父級的所有的属性&#xff08;原型链上的也会继承&#xff09;过多的继承了没有用的属性&#xff0c;代码冗余&#xff0c;执行效率低下子級无法向父級进行传参如果要给之級通过原型来添加属性和方法&#xf…

怎么把jad反编译放到Eclipse中

可以在CSDN下载页上进行下载哦&#xff0c;免费的哦&#xff0c;不要积分。 http://download.csdn.net/detail/farxix/9838195 我们把下载下来的jad资源包解压出来&#xff0c;如下图&#xff1a; 首先&#xff1a; 然后&#xff1a; 打开eclipse进行设置&#xff0…

一些很有意思的JS现象

关于JS对象的 . 和 [] []除了属性名可以比 .天马行空以外(比如我们要添加一个为33-abc的属性&#xff0c;一定得用[]))&#xff0c;还有一个实际操作中的区别 Object.is的作用和两个奇特的现象 还记得isNaN的作用&#xff0c;但有时候我们就想直接比较两个数据&#xff0c;总不…

怎么查看eclipse的版本号

在电脑上找到你安装eclipse的路径&#xff0c;找到readme点击打开&#xff0c;如下图所示&#xff1a; 查看版本号&#xff1a;

asp.net Page.Controls对象(找到所有服务器控件)

前台 复制代码 代码如下:<% Page Language"C#" AutoEventWireup"true" CodeFile"Default.aspx.cs" Inherits"_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3…

Vue2.0 脚手架代码详解

参考作者&#xff1a;https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习。 来看一下脚手架创建后的项目目录 说明&#xff1a;在*.vue文件&#xff0c;template标签里写html代码&#xff0c;且template直接子级只能有一个标签。style标签里写样式&#xff0c;scrip…

如何使用多个端口访问tomcat

查端口号是否被占用 在cmd中使用 netstat -ano 命令&#xff1b; 处理端口号使用命令 taskkill /pid 1234 ( 8080指的是端口号对应的PID 号 ) 在使用tomcat服务器做为开发使用时&#xff0c;如果我们有多个项目要发布、启动时怎么办呢&#xff0c;在一个tomcat下添加多个项目…

设计模式总纲

根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 - 可复用的面向对象软件元素&#xff09; 中所提到的&#xff0c;总共有 23 种设计模式。这些模式可以分为三大类&#xff1a;创建型模式&…

indexOf、lastIndexOf、substring等详解

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。注意&#xff1a;这个方法返回的是出现的位置&#xff0c;是从0开始检索&#xff01; 例如&#xff1a; hello是父字符串&#xff0c;ello是需要在父字符串中进行检索的子字符串&#xff0c;1是开始检索的位…

编码是件有逻辑的事情

勤劳是最基本的&#xff0c;所能做的就是花更多的时间在上面。 就算最后不能成功&#xff0c;尽力就好。 First . 充分清楚需求改造内容&#xff0c;具体到 哪个字段、逻辑处理等。 这是编码的核心&#xff0c;清楚了需求才能进行编码&#xff0c;也决定了你编码后续的测试情况…

win10 安装mysql 8.0.12

按照CSDN以及博客园的其他教程, 之前安装过几次都有或多或少的bug 主要安装步骤: 1.配置my.ini文件 2.管理员进入终端, 切换到.../bin目录下进行操作 3.指令操作: 1) mysqld --initialize --console              此指令正常情况下, 可以自动生成一项随机密码, 一…

6 月

事情很多&#xff0c;需一件一件去做&#xff0c;不急不躁。 天气飘忽不定&#xff0c;不带伞时就下雨&#xff0c;带伞时偏不下雨&#xff0c;猜不透少女心。 没有去看书&#xff0c;很快又过去一月&#xff0c;一年也很快。 打了场篮球&#xff0c;锻炼还需勤快。 遇到问…

pmd 设置默认规则,只要使用了该规则集就自动使用

pmd规则集是在rulesets的对应xml里. 之前研究pmd的时候,发现如果配置规则时使用<rule ref"rulesets/java/...xml">形式的话,该规则就怎么样都会被使用. 即便命令行参数传入的要求只调用该规则集xml里的某一个规则. 现在反过来,如果想使用某个规则集的时候,某一…

查看端口占用情况

当tomcat被占用时&#xff0c;可以使用命令行来解决占用问题&#xff1b; 打开cmd 输入netstat -ano|findstr 7001 即可找到相应的pid号 7016 再使用taskkill /f /pid 7016 就可以去除占用端口号情况。

Delphi---TServerSocket和TClientSocket发送和接收大数据包

https://www.cnblogs.com/zhangzhifeng/p/6065244.html TServerSocket和TClientSocket用非阻塞模式发送和接收比较大的数据时&#xff0c;可能一次会接收不完&#xff0c;此时需要通过循环接收。 //接收 procedure TMAINFORM.TCPServer1ClientRead(Sender: TObject;Socket: TCu…

表连接的详解

表A &#xff1a; ID NAME 1 , kobe 2 , pual 3 , tim 表B &#xff1a; ID NAME 1 , kobe 2 , pual 5 , michal 内连接&#xff1a;两表相交叉的部分 select a.ID,a.NAME,b.ID,b.NAME from A a inner join B b on a.IDb.ID; 结果为&#xff1a;1 , kobe2 , pual1 , kobe2 ,…

译:1. RabbitMQ Java Client 之 Hello World

这些教程介绍了使用RabbitMQ创建消息传递应用程序的基础知识。您需要安装RabbitMQ服务器才能完成教程 1. 打造第一个Hello World 程序 RabbitMQ是一个消息代理&#xff1a;它接受和转发消息。你可以把它想象成一个邮局&#xff1a;当你把你想要发布的邮件放在邮箱里时&#xff…

weblogic问题: Unable to resolve 'jdbc.mydb'. Resolved 'jdbc'; remaining name '

现这个是由于没有找到JNDI 解决方法&#xff1a; 在Weblogic数据源管理中的JDBC Data Source-0的设置中设置目标选项 将服务勾选上&#xff0c;如默认的&#xff1a;AdminServer 保存后即可&#xff1b;