WISCO信息组NOIP模拟赛-部落冲突
传送门
首先肯定考虑树剖,这里没有要求区间加,所以可以用树状数组维护,不会卡常的
这里是边权,可以转化为点权:让每条边连接的较深的节点的点权等于边权即可,然后计算的时候减去lca
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 300005
#define LOG 20
using namespace std;
int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
return x;
}
int n,T;
int a[MAXN],dat[MAXN];
int dep[MAXN],size[MAXN],gs[MAXN],fa[][MAXN];
int top[MAXN],tree[MAXN],pre[MAXN],tot;
int first[MAXN],nxt[MAXN<<],to[MAXN<<],cnt;
int id[MAXN],tmp; void add(int x,int y){
nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
}
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(int k=dep[x]-dep[y],p=;k;k>>=,p++){
if(k&){
x=fa[p][x];
}
}
if(x==y){
return x;
}
for(int k=LOG-;k>=;k--){
if(fa[k][x]!=fa[k][y]){
x=fa[k][x],y=fa[k][y];
}
}
return fa[][x];
}
void change(int k,int x){
while(k<=n){
dat[k]+=x;
k+=(k&-k);
}
}
int query(int k){
int ret=;
while(k>=){
ret+=dat[k];
k-=(k&-k);
}
return ret;
}
void dfs1(int x){
size[x]=;
for(int e=first[x];e;e=nxt[e]){
int y=to[e];
if(y==fa[][x]){
continue;
}
fa[][y]=x;
dep[y]=dep[x]+;
dfs1(y);
size[x]+=size[y];
if(size[y]>size[gs[x]]){
gs[x]=y;
}
}
}
void dfs2(int x,int t){
top[x]=t;
tree[x]=(++tot);
pre[tot]=x;
if(!gs[x]){
return;
}
dfs2(gs[x],t);
for(int e=first[x];e;e=nxt[e]){
int y=to[e];
if(y==fa[][x]||y==gs[x]){
continue;
}
dfs2(y,y);
}
}
int ask(int x,int y){
int f1=top[x],f2=top[y];
if(dep[f1]<dep[f2]){
swap(x,y),swap(f1,f2);
}
int ret=-a[lca(x,y)];
while(f1!=f2){
ret+=query(tree[x])-query(tree[f1]-);
x=fa[][f1]; f1=top[x];
if(dep[f1]<dep[f2]){
swap(x,y),swap(f1,f2);
}
}
if(dep[x]<dep[y]){
swap(x,y);
}
ret+=query(tree[x])-query(tree[y]-);
return (ret<=);
}
void init(){
n=read();T=read();
for(int i=;i<n;i++){
int x=read(),y=read();
add(x,y);
}
dfs1();
dfs2(,);
for(int k=;k<LOG;k++){
for(int i=;i<=n;i++){
fa[k][i]=fa[k-][fa[k-][i]];
}
}
}
void solve(){
char ch[];
while(T--){
scanf("%s",ch);
int x=read();
if('Q'==ch[]){
int y=read();
if(ask(x,y)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
else if('C'==ch[]){
int y=read();
if(dep[x]<dep[y]){
swap(x,y);
}
change(tree[x],);
a[x]++;
id[++tmp]=x;
}
else{
x=id[x];
change(tree[x],-);
a[x]--;
}
}
}
int main()
{
init();
solve();
return ;
}
树剖AC
也可以是树上差分,用树状数组+dfs序,本质上是差不多的
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 300005
#define LOG 20
using namespace std;
int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
return x;
}
int n,T;
int first[MAXN],nxt[MAXN<<],to[MAXN<<],cnt;
int pin[MAXN],pout[MAXN],tot;
int dat[MAXN<<];
int fa[LOG][MAXN],dep[MAXN];
int id[MAXN],tmp;
void change(int k,int x){
while(k<=(n<<)){
dat[k]+=x;
k+=(k&-k);
}
}
int query(int k){
int ret=;
while(k>=){
ret+=dat[k];
k-=(k&-k);
}
return ret;
}
void add(int x,int y){
nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
}
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(int k=dep[x]-dep[y],p=;k;k>>=,p++){
if(k&){
x=fa[p][x];
}
}
if(x==y){
return x;
}
for(int k=LOG-;k>=;k--){
if(fa[k][x]!=fa[k][y]){
x=fa[k][x],y=fa[k][y];
}
}
return fa[][x];
}
void dfs(int x){
pin[x]=(++tot);
for(int e=first[x];e;e=nxt[e]){
int y=to[e];
if(y==fa[][x]){
continue;
}
dep[y]=dep[x]+;
fa[][y]=x;
dfs(y);
}
pout[x]=(++tot);
}
int ask(int x,int y){
int t=query(pin[x])+query(pin[y])-*query(pin[lca(x,y)]);
return (t<=);
}
void init(){
n=read(); T=read();
for(int i=;i<n;i++){
int x=read(),y=read();
add(x,y);
}
dfs();
for(int k=;k<LOG;k++){
for(int i=;i<=n;i++){
fa[k][i]=fa[k-][fa[k-][i]];
}
}
}
void solve(){
char ch[]={};
while(T--){
scanf("%s",ch);
int x=read();
if('Q'==ch[]){
int y=read();
if(ask(x,y)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
else if('C'==ch[]){
int y=read();
if(dep[x]<dep[y]){
swap(x,y);
}
change(pin[x],);
change(pout[x]+,-);
id[++tmp]=x;
}
else{
x=id[x];
change(pin[x],-);
change(pout[x]+,);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
init();
solve();
return ;
}
树上差分AC
WISCO信息组NOIP模拟赛-部落冲突的更多相关文章
- WISCO信息组NOIP模拟赛-数据结构
传送门 差分+暴力 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstri ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
随机推荐
- C语言第三次作业--嵌套循环
一.PTA实验作业 题目1:硬币数 1. 本题PTA提交列表 2. 设计思路 步骤一:定义整型变量fen5,fen2,fen1,表示1分2分和5分,零钱数额x,总硬币数total,换法count 步骤 ...
- alpha-咸鱼冲刺day2-紫仪
总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 今天并没有什么进展,弄了好久好像也只研究出怎么把JS的功能块插入进去.html的信息提交这些还不知道要怎么弄. 四,问题 ...
- 20162318 实验二《Java面向对象程序设计》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年4月14日 实验密级:非密级 实验器材:带Lin ...
- 201621123025《Java程序设计》第二周学习总结
1.本周学习总结 以几个关键词描述本周的学习内容.并将关键词之间的联系描述或绘制出来. 答:java的两种数据类型:基本数据类型和引用数据类型:==与equals的区别:动态数组. 2.书面作业 1. ...
- maven创建web工程
使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...
- JFinal项目发送邮件——jfinal-mail-plugin
JFianl框架: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有 ...
- SpaceVim - 让你的vim变得更加高效和强大
SpaceVim 中文手册 项 目 主 页: https://spacevim.org Github 地址 : https://github.com/SpaceVim/SpaceVim SpaceVi ...
- Java可重入锁如何避免死锁
本文由https://bbs.csdn.net/topics/390939500和https://zhidao.baidu.com/question/1946051090515119908.html启 ...
- Hadoop安装-部署-测试
一:准备Linux环境[安装略] a.修改主机名 vim /etc/sysconfig/network NETWORKING= ...
- SpringCloud是否值得引入?
中小型互联网公司微服务实践-经验和教训 http://xujin.org/sc/sc-zq/#more Spring Cloud在国内中小型公司能用起来吗?https://mp.weixin.qq.c ...