6:缓存:对大多独语言版举办缓存,用户切换语言时相底凡殊的数量。

HINT

数N<=10^5,操作数M<=10^5,所有的颜色C为整数且以[0, 10^9]之间。、

 

题解:

题目大好通晓,它不是无尽染色,而是点染色,那么些特性是于好的,边染色还需要裂点。

关押的题材就得想到就是树链剖分模板题吧,套个裸的线条树合并,其实没有什么统一的

物,发现相同截线段的不同颜色,那么固然得记录左端点和右端点颜色,假若左区间右端

点与左侧区间左端颜色一样,那么总颜色-1,那个比好明白的吧,然后记录一个该区间总

水彩数,就足以统计了。

次于结构化
点滴单dfs预处理,lca,线段树,询问处理+更新处理,就ok了,代码相比较清楚。

  1 #include<cstring>
  2 #include<cmath>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<cstdio>
  6 #include<cstdlib>
  7 #define N 100007
  8 using namespace std;
  9 
 10 int n,m,sz=0;
 11 int cnt,head[N],next[N*2],rea[N*2];
 12 int a[N];
 13 int fa[N][20],size[N],pos[N],bel[N],deep[N];
 14 char ch[2];
 15 struct Node
 16 {
 17     int lc,rc,tag,num;
 18 }tr[N*5];
 19 
 20 void add(int u,int v){next[++cnt]=head[u],head[u]=cnt,rea[cnt]=v;}
 21 void dfs_init(int u)
 22 {
 23     size[u]=1;
 24     for (int i=1;(1<<i)<=deep[u];i++)
 25         fa[u][i]=fa[fa[u][i-1]][i-1];
 26     for (int i=head[u];i!=-1;i=next[i])
 27     {
 28         int v=rea[i];
 29         if (v==fa[u][0]) continue;
 30         deep[v]=deep[u]+1;
 31         fa[v][0]=u;
 32         dfs_init(v);
 33         size[u]+=size[v];
 34     }
 35 }
 36 void dfs_make(int u,int chain)
 37 {
 38     int k=0;
 39     pos[u]=++sz,bel[u]=chain;
 40     for (int i=head[u];i!=-1;i=next[i])
 41     {
 42         int v=rea[i];
 43         if (deep[v]>deep[u]&&size[v]>size[k]) k=v;
 44     }
 45     if (k==0) return;
 46     dfs_make(k,chain);
 47     for (int i=head[u];i!=-1;i=next[i])
 48     {
 49         int v=rea[i];
 50         if (deep[v]>deep[u]&&v!=k) dfs_make(v,v);
 51     }
 52 }
 53 int lca(int a,int b)
 54 {
 55     if (deep[a]<deep[b]) swap(a,b);
 56     int i;
 57     for (i=0;(1<<i)<=deep[a];i++);
 58     i--;
 59     for (int j=i;j>=0;j--)
 60         if (deep[a]-(1<<j)>=deep[b]) a=fa[a][j];
 61     if (a==b) return a;
 62     for (int j=i;j>=0;j--)
 63         if (fa[a][j]!=fa[b][j]) a=fa[a][j],b=fa[b][j];
 64     return fa[a][0];        
 65 }
 66 void updata_down(int l,int r,int p)
 67 {
 68     int tag=tr[p].tag;tr[p].tag=-1;
 69     if (tag==-1||l==r) return;
 70     tr[p<<1].num=tr[p<<1|1].num=1;
 71     tr[p<<1].tag=tr[p<<1|1].tag=tag;
 72     tr[p<<1].lc=tr[p<<1].rc=tag;
 73     tr[p<<1|1].lc=tr[p<<1|1].rc=tag;
 74 }
 75 void updata_up(int l,int r,int p)
 76 {
 77     tr[p].lc=tr[p<<1].lc,tr[p].rc=tr[p<<1|1].rc;
 78     tr[p].num=tr[p<<1].num+tr[p<<1|1].num;
 79     if (tr[p<<1].rc==tr[p<<1|1].lc) tr[p].num--;
 80 }
 81 void change(int l,int r,int p,int x,int y,int z)
 82 {
 83     updata_down(l,r,p);
 84     if (l==x&&y==r)
 85     {tr[p].num=1,tr[p].lc=tr[p].rc=tr[p].tag=z;return;}
 86     int mid=(l+r)>>1;
 87     if (y<=mid) change(l,mid,p<<1,x,y,z);
 88     else if (x>mid) change(mid+1,r,p<<1|1,x,y,z);
 89     else change(l,mid,p<<1,x,mid,z),change(mid+1,r,p<<1|1,mid+1,y,z);
 90     updata_up(l,r,p);
 91 }
 92 int query(int l,int r,int p,int x,int y)
 93 {
 94     updata_down(l,r,p);
 95     if (l==x&&y==r) return tr[p].num;
 96     int mid=(l+r)>>1,res;
 97     if (y<=mid) res=query(l,mid,p<<1,x,y);
 98     else if (x>mid) res=query(mid+1,r,p<<1|1,x,y);
 99     else
100     {
101         res=query(l,mid,p<<1,x,mid)+query(mid+1,r,p<<1|1,mid+1,y);
102         if (tr[p<<1].rc==tr[p<<1|1].lc) res--;
103     }
104     return res;
105 }
106 int find(int l,int r,int p,int x)
107 {
108     updata_down(l,r,p);
109     if (l==r) return tr[p].lc;
110     int mid=(l+r)>>1;
111     if (x<=mid) return find(l,mid,p<<1,x);
112     else return find(mid+1,r,p<<1|1,x);
113 }
114 int solvequery(int x,int fq)
115 {
116     int res=0;
117     while(bel[x]!=bel[fq])
118     {
119         res+=query(1,n,1,pos[bel[x]],pos[x]);
120         if (find(1,n,1,pos[bel[x]])==find(1,n,1,pos[fa[bel[x]][0]])) res--;
121         x=fa[bel[x]][0];
122     }
123     res+=query(1,n,1,pos[fq],pos[x]);
124     return res;
125 }
126 void solvechange(int x,int fq,int z)
127 {
128     while(bel[x]!=bel[fq])
129     {
130         change(1,n,1,pos[bel[x]],pos[x],z);
131         x=fa[bel[x]][0];
132     }
133     change(1,n,1,pos[fq],pos[x],z);
134 }
135 int main()
136 {
137     memset(head,-1,sizeof(head));tr[1].tag=-1;
138     scanf("%d%d",&n,&m);
139     for(int i=1;i<=n;i++)
140         scanf("%d",&a[i]);
141     int x,y,z;
142     for (int i=1;i<n;i++)
143     {
144         scanf("%d%d",&x,&y);
145         add(x,y),add(y,x);
146     }
147     dfs_init(1);
148     dfs_make(1,1);
149     for (int i=1;i<=n;i++)
150         change(1,n,1,pos[i],pos[i],a[i]);            
151 //==============================================================
152     for (int i=1;i<=m;i++)
153     {
154         scanf("%s",ch);
155         if (ch[0]=='Q')
156         {
157             scanf("%d%d",&x,&y);
158             int par=lca(x,y);
159             printf("%d\n",solvequery(x,par)+solvequery(y,par)-1); 
160         }
161         else
162         {
163             scanf("%d%d%d",&x,&y,&z);
164             int par=lca(x,y);
165             solvechange(x,par,z),solvechange(y,par,z);
166         }
167     }
168 }

 

1:将默认Access数据库移到App_Data目录,并对其安装可写权限

Sample Output

3
1
2

 

Input

首先履行包含2单整数n和m,分别代表节点数和操作数;

其次实践包含n个正整数表示n个节点的发端颜色

下边 行每行包含两独整数x和y,表示xy里头来同等长长的无往度。

脚 行每行描述一个操作:

“C a b
c”表示这是一个染操作,把节点a到节点b路径上所有点(包括a和b)都传成颜色c;

“Q a
b”表示即是一个打探操作,询问节点a到节点b(包括a和b)路径上之颜料段数量。

说明:

Description

让得一株有n个节点的无根树和m个操作,操作爆发2类:

1、将节点a到节点b路径上所有点都招成颜色c;

2、询问节点a到节点b路径上之颜色段数量(连续相同颜色为当是相同段),如“112221”由3段子组成:“11”、“222”和“1”。

央你写一个程序依次完成这m个操作。

 

脚举行首要描述表明:

2017年10月20日

小预览:

Output

对此每个询问操作,输出一行答案。

1:中文版系统首页:

Sample Input

6 5
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5

1:将多国语言文件开放在web上受用户编辑

统计 1

从而无论法制作出好的皮层,为系统通过上入眼之衣。

 

 

对接下是V2.0 揭橥刚刚文
[
系公测地址:[秋色园](http://www.cyqdata.com/)\]

无异于:“路了春天版博客一键安装工具.exe”升级

末:系统公测地址:秋色园

 

说明:

本V2.0版本[暂定为测试版本],将开展公测一到家,欢迎咱们继续测试:网址:http://www.cyqdata.com/

 

1:2010年11月08日—支撑多语言、多用户、多数据库、目录级URL之路了春天版博客发表[断有死伤力的博客]

4:主界面著作列表:遵照作品的语言归类举行排序,因而,在不同之言语切换时,保证首页为新型的该语言随笔于前。

4:2010年11月17日—路过秋日版博客-皮肤制作指南
[附犀利哥入侵攻防站话题]

统计 2

5:扩张多语言版首页,不同的言语下:依照作品所选归选语言类排序该类型语言著作在前边

 

1个人翻多国语言最累了,直接开,集网友力量,每人编辑多只,刷刷刷就好了。
时以任何和备份格局开修,因而多了“预览”效率。

统计 3

1:小说扩张“语言归类”,不同的言语归类会在用户首页和系首页显示不同。

 

2:2010年11月10日—基本功也爱给忽视的那么点事–web入侵格局以及注意事项总计

1:从乐乎首页借了点html+css,多语言功用增强[截图在终极对]

3:系统积分排行:只体现两栽语言:即系统设定默认语言为主语言[来得用户的昵称],另外的言语都显得其它一样种名称[亮用户之用户称]

 

3:首页多语言 说明:

 

 

一个易为遗漏之链接[在线多国语言编辑]: http://www.cyqdata.com/lang/edit

说明:

首页的多语言重要展现在:

4:多语言应用加强[首页/用户/文章]

3:增添系统总结:用户、作品、相片、著作评论、相片评论。

说明:

这里补上几乎布置截图:

统计 4统计 5

1:作品大都语言

3:修改系统主页,借了有些天涯论坛的首页html和css

5:开放多国语言在线编,允许网页编辑多国语言

2:扩展积分排行,于是原V1.0从未有过积分总括效率,这里补及了。

随着首页的改版,系统效能也深化了变通了,犹其是于差不多语言版效果上,重要效率来:

说明:

 

故,此次V2.0底公告,新加了零星效仿皮肤,一效仿由新浪的科班皮肤借来,另一样仿照从小泥鳅博客的首页借来,希望可以立异下大伙的视觉效果。

2:用户基本上语言

 

其三:修改原来的体系首页,加强首页显示效果

1:从和讯和小泥鳅博客里借来了少数效仿皮肤

说明:

 

1:”路了秋日版博客一键安装工具.exe”升级,增添默认对Access数据库的写照权限。

为此,此次V2.0版的发表,将制止这种情状,直接装好相关的权柄,真正形成一键搞定。

 

季:多语言使用加强[文章/用户/首页**]**

V1.0底Access数据库默认放在根目录,默认对该没安装写权限,由此致网友于下载后运行时,

本子升级要内容:

2:E文版系统首页:

 

3:2010年11月15日—支撑多语言、多用户、多数据库、目录级URL之路了冬日版博客
V1.0正式版
发布[含蓄详细布置安装表达]

5:48小时[点击/评论]排行/最新评论:同主界面列表,依据随笔的语言归类排序。

2:网站分类多语言:分类就生个别种语言,即系统设定默认语言为主语言[显分类的Name],此外的言语都呈现任何一样种植名称[来得分类的PKey]

一样到内使暴发Bug发现用修正再发表标准版,若任由,将不再宣布版。

1:系统多语言功效:对界面举办多语言翻译

只可以浏览,却无力回天展开“注册/提交作品”等富含写数据库数据的操作,加上操作提醒的免清晰,

 

章的多语言紧要展现在:

导致从外在直接影响对整治网的观,觉的免正经或顶简陋,出现那么些原因是由于个人不用规范美工,说白点就是无知晓美工,

 

1:后台扩充语言设置,设置后,被网友浏览时[切换语言时],系统分类和随笔列表将本章语言翻译和排序,未设置语言时虽无照章语言排序和翻译。

V1.0版的揭破,即使效能强大,但彼简洁的本来皮肤,并无合乎部分网友的法眼,加上网友针对网皮肤功用的无打听,

网友也非掌握是这种由所给予,因故导致大部分网友对V1.0本兴趣缩短。

 

4:扩大首页列表显示:首页小说、48钟头点击排行、48钟头评论排名、最新评论等力量。

统计,途经秋日版博客公布历史回顾:

 

统计 6统计 7

下载地址:CYQ.Data 轻量数据层之路
bug反馈、优化提出、最新框架下载

2:增加2套皮肤

二:增加了2套皮肤

用户的多语言紧要显示在:

五:开放多国语言在线编,允许网页编辑多国语言

 

1:增添系统分类,允许用户发表篇到首页。