博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P2486 [SDOI2011]染色
阅读量:5026 次
发布时间:2019-06-12

本文共 2573 字,大约阅读时间需要 8 分钟。

题目描述

输入输出格式

输入格式:

 

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
6 52 2 1 2 1 11 21 32 42 52 6Q 3 5C 2 1 1Q 3 5C 5 1 2Q 3 5
输出样例#1:
312

说明

树链剖分。

#include
#include
#include
#include
const int N=100001;using namespace std;vector
vec[N];int n,m,num,tot,colure[N];int deep[N],size[N],dad[N],top[N],id[N];struct nond{ int l,r,flag; int l_colure,r_colure,sum;}tree[N*2];int dfs(int x){ size[x]=1; deep[x]=deep[dad[x]]+1; for(int i=0;i
size[t]) t=vec[x][i]; if(t){ top[t]=top[x]; dfs1(t); } for(int i=0;i
mid) change(r,t,x); up(now);}void down(int now){ if(tree[now].l==tree[now].r) return; int l=now+1,r=now+(tree[now+1].r-tree[now+1].l+1)*2; tree[l].l_colure=tree[r].l_colure=tree[l].r_colure=tree[r].r_colure=tree[l].flag=tree[r].flag=tree[now].flag; tree[l].sum=tree[r].sum=1; tree[now].flag=0;}void change_many(int now,int pol,int por,int a){ if(tree[now].l==pol&&tree[now].r==por){ tree[now].flag=tree[now].l_colure=tree[now].r_colure=a; tree[now].sum=1; return; } if(tree[now].flag) down(now); int mid=(tree[now].l+tree[now].r)/2; int l=now+1,r=now+(tree[now+1].r-tree[now].l+1)*2; if(por<=mid) change_many(l,pol,por,a); else if(pol>mid) change_many(r,pol,por,a); else{ change_many(l,pol,mid,a); change_many(r,mid+1,por,a); } up(now);}int change_ans(int u,int v,int a){ while(top[u]!=top[v]){ if(deep[top[u]]
id[v]) swap(u,v); change_many(1,id[u],id[v],a);}int query(int now,int t){ if(tree[now].l==tree[now].r) return tree[now].flag; if(tree[now].flag) down(now); int mid=(tree[now].l+tree[now].r)/2; int l=now+1,r=now+(tree[now+1].r-tree[now+1].l+1)*2; if(t<=mid) query(l,t); else query(r,t);}int query_many(int now,int pol,int por){ if(tree[now].l==pol&&tree[now].r==por){ return tree[now].sum; } if(tree[now].flag) down(now); int mid=(tree[now].l+tree[now].r)/2; int l=now+1,r=now+(tree[now+1].r-tree[now+1].l+1)*2; if(por<=mid) return query_many(l,pol,por); else if(pol>mid) return query_many(r,pol,por); else{ int t=query_many(l,pol,mid)+query_many(r,mid+1,por); if(tree[l].r_colure==tree[r].l_colure) t--; return t; }} void query_ans(int u,int v){ int ans=0; while(top[u]!=top[v]){ if(deep[top[u]]
id[v]) swap(u,v); ans+=query_many(1,id[u],id[v]); cout<
<
>ch; if(ch=='C'){ scanf("%d%d%d",&a,&b,&c); change_ans(a,b,c); } else{ scanf("%d%d",&a,&b); query_ans(a,b); } } return 0;}

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/7404967.html

你可能感兴趣的文章
基础 - client可视区域
查看>>
JavaScript中正则表达式判断匹配规则以及常用的方法
查看>>
201571030334/201571030323实验三 软件工程结对项目
查看>>
BZOJ 1452: [JSOI2009]Count [二维树状数组]
查看>>
BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin [线段树优化建边]
查看>>
BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
查看>>
IDEA使用笔记(四)——工具栏的显示隐藏切换
查看>>
python中强大的list
查看>>
LeetCode Remove Invalid Parentheses
查看>>
thinkphp常用标签总结
查看>>
.net Core
查看>>
Mac 下安装wxpython踩过的坑
查看>>
05004_Linux的其他命令和权限命令
查看>>
00083_判断集合元素唯一的原理
查看>>
卷挂载/卸载工作流程
查看>>
.NET 配置项扩展
查看>>
Mac网络抓包 - Wireshark
查看>>
iOS开发拓展篇—CoreLocation简单介绍
查看>>
配置maven-ssm
查看>>
【codecombat】 试玩全攻略 第二章 边远地区的森林
查看>>