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/颜色问题 题解:算一下每个仆人到它的目的地 ...
随机推荐
- Hibernate之ORM与Hibernate
ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...
- react中的DOM操作
前面的话 某些情况下需要在典型数据流外强制修改子代.要修改的子代可以是 React 组件实例,也可以是 DOM 元素.这时就要用到refs来操作DOM 使用场景 下面是几个适合使用 refs 的情况 ...
- 使用Python3爬虫抓取网页来下载小说
很多时候想看小说但是在网页上找不到资源,即使找到了资源也没有提供下载,小说当然是下载下来用手机看才爽快啦! 于是程序员的思维出来了,不能下载我就直接用爬虫把各个章节爬下来,存入一个txt文件中,这样, ...
- 新概念英语(1-51)A pleasant climate
新概念英语(1-51)A pleasant climate Does it ever snow in Greece? A:Where do you come from? B:I come from G ...
- 基于哈夫曼编码的文件压缩(c++版)
本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...
- jacascript 函数声明、函数表达式与声明提升(hoisting机制)
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 声明.定义.初始化 声明的意思是宣称一个变量名的存在,定义则为这个变量分配存储空间,初始化则是给该变量名的 ...
- Python 破解带密码保护的Zip文件
今天发生了个有趣的事情,有个朋友发了一个带密码保护的Zip文件给我,却不给我密码,我就琢磨这怎么可以'猜'到密码呢? 经过一系列的尝试,最终使用python把这个密码给'猜'出来了.要想写出破解密码的 ...
- Spring Cloud学习笔记-001
Spring Boot快速入门 1. Eclipse新建maven工程,骨架选择quickstart: 2. 加入springboot的父工程,和web依赖: 3. 编写一个简单的RESTful接口, ...
- Selenium_java coding
1)public class HelloWorld { // class 是类的意思 // 类名指的是class后面这个词,这个词是我们起的名 public static void main(Stri ...
- Linux 文件读写操作与磁盘挂载
文件读写 [文件描述符] Linux下,通常通过open打开一个文件,它然后返回给我们一个整数,通过这个整数便可以操作文件,这个整数我们称文件描述符(fd).对应被打开的文件,它也是一种系统资源,那么 ...