Short But Scary 解题报告
Short But Scary

正解的离线分治+虚树的做法太神奇...搞不到
搞一个菜一点的ddp写写,结果调了200年,下次一定写树剖不写lct了,太难调了...
大概就是按sub2那样维护
你每个重链开一个线段树,然后链头把贡献扔给别的重链,然后每次在链上二分位置查一个和差不多了
然后可以拿lct写
但你得搞清楚翻转的时候要翻转的东西比较多,细节也比较多,异常的难写...
算了懒得说了,给我毒瘤死了...
Code:
#include <cstdio>
#include <cctype>
#include <algorithm>
#define ls ch[now][0]
#define rs ch[now][1]
#define fa par[now]
const int N=1e5+10;
template <class T>
void read(T &x)
{
	x=0;char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{
    to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,m;
int ch[N][2],par[N],tag[N];//翻转标记
struct koito_yuu
{
	int siz,is,lef,dat,si;
	//实际大小,子树全是,最左边的点是否是,与父亲关系,虚儿子贡献
}yuu[2][N];
int s[N],tot;
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Reverse(int now)
{
	tag[now]^=1;
	std::swap(yuu[0][now],yuu[1][now]);
}
void updata(int now)
{
	for(int k=0;k<=1;k++)
	{
		yuu[k][now].is=(yuu[k][ls].is&&yuu[k][now].dat&&yuu[k][rs].is);
		yuu[k][now].siz=yuu[k][ls].siz;
		if(ls)
        {
            yuu[k][now].lef=yuu[k][ls].lef;
            if(yuu[k][ls].is&&yuu[k][now].dat)
            {
                yuu[k][now].siz+=yuu[k][now].si+1;
                if(yuu[k][rs].lef) yuu[k][now].siz+=yuu[k][rs].siz;
            }
		}
		else
        {
            yuu[k][now].lef=yuu[k][now].dat;
            yuu[k][now].siz+=yuu[k][now].si+1;
            if(yuu[k][rs].lef) yuu[k][now].siz+=yuu[k][rs].siz;
        }
	}
}
void pushdown(int now)
{
	if(tag[now])
	{
		if(ls) Reverse(ls);
		if(rs) Reverse(rs);
		tag[now]=0;
	}
}
void Rotate(int now)
{
	int p=fa,typ=identity(now);
	connect(p,ch[now][typ^1],typ);
	if(isroot(p)) connect(par[p],now,identity(p));
	else fa=par[p];
	connect(now,p,typ^1);
	updata(p);
	updata(now);
}
void splay(int now)
{
	while(isroot(now)) s[++tot]=now,now=fa;
	s[++tot]=now;
	while(tot) pushdown(s[tot--]);
	now=s[1];
	for(;isroot(now);Rotate(now))
		if(isroot(fa))
			Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{
	for(int las=0;now;las=now,now=fa)
	{
		splay(now);
		for(int k=0;k<=1;k++)
		{
			if(yuu[0][rs].lef)
				yuu[k][now].si+=yuu[0][rs].siz;
			if(yuu[0][las].lef)
				yuu[k][now].si-=yuu[0][las].siz;
		}
		rs=las;
		updata(now);
	}
}
void dfs(int now,int f)
{
	yuu[0][now].is=yuu[0][now].lef=yuu[0][now].dat=1;
	//yuu[1][now].is=yuu[1][now].lef=yuu[1][now].dat=1;
	for(int v,i=head[now];i;i=Next[i])
		if((v=to[i])!=f)
			par[v]=now,dfs(v,now),yuu[0][now].si+=yuu[0][v].siz;
	yuu[0][now].siz=yuu[0][now].si+1;
	yuu[1][now].si=yuu[0][now].si;
	yuu[1][now].siz=yuu[0][now].siz;
}
void modi(int u)
{
	access(u);
	splay(u);
	Reverse(u);
}
int query(int now)
{
    pushdown(now);
	if(!rs)
    {
        if(yuu[0][now].dat&&ls) return query(ls)+yuu[0][now].si+1;
        return yuu[0][now].si+1;
    }
	if(yuu[0][rs].is)
	{
		int ret=yuu[0][now].si+1+yuu[0][rs].siz;
		if(yuu[0][now].dat&&now!=1) ret+=query(ls);
		return ret;
	}
	return query(rs);
}
int qry(int u)
{
	access(u);
	splay(u);
	return ((yuu[0][u].dat&&u!=1)?query(ch[u][0]):0)+yuu[0][u].si+1;
}
int main()
{
    freopen("scary.in","r",stdin);
    freopen("scary.out","w",stdout);
	yuu[1][1].dat=yuu[0][0].is=yuu[1][0].is=1;
	read(n),read(m);
	for(int u,v,i=1;i<n;i++) read(u),read(v),add(u,v),add(v,u);
	dfs(1,0);
	for(int op,u,v,i=1;i<=m;i++)
	{
		read(op);
		if(op==1)
		{
			read(u),read(v);
			modi(u),modi(v);
		}
		else
		{
			read(u);
			printf("%d\n",qry(u));
		}
	}
	return 0;
}
2019.3.25
Short But Scary 解题报告的更多相关文章
- 【LeetCode】392. Is Subsequence 解题报告(Python)
		[LeetCode]392. Is Subsequence 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/is-subseq ... 
- CH Round #56 - 国庆节欢乐赛解题报告
		最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ... 
- 二模13day1解题报告
		二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ... 
- BZOJ 1051 最受欢迎的牛 解题报告
		题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ... 
- 习题:codevs  2822 爱在心中 解题报告
		这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ... 
- 习题:codevs 1035 火车停留解题报告
		本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ... 
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
		这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ... 
- 习题:codevs 1519 过路费 解题报告
		今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ... 
- NOIP2016提高组解题报告
		NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合 
随机推荐
- Linux操作系统--定时任务
			最近在学习Linux操作系统.学到了关于定时任务的章节,作为一个总结写下这篇文章.在Linux中,我们可以将耗时大的任务如复制大文件,压缩.解压缩大文件等放进定时任务中(深夜执行,因为工作时间访问量大 ... 
- PSP总结报告
			此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2556] 回顾0 alpha阶段前 团队名称:可以低头,但没必要 团队项 ... 
- 测者的测试技术手册:自动化单元工具EvoSuie的代码覆盖报告
			EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Yourkit的支持. ... 
- [20190416]11g下那些latch是Exclusive的.txt
			[20190416]11g下那些latch是Exclusive的.txt --//昨天测试了11g下那些latch是共享的,链接:--//是否反过来剩下的都是Exclusive的.继续测试: 1.环境 ... 
- PYTHON常用数据类型(列表,元组,字典)
			一.数字 1.整形:就是整数. 2.浮点型:就是小数. 3.布尔型:True或者是False,python里严格区分格式,空格缩进或者是大小写. 4.运算符有+ – * / ()%(求模运算取余数)* ... 
- 如何解决分配到Autoconfiguration IPV4 地址
			配置完服务器静态IP后,在CMD窗口中查看ip地址,发现是Autoconfiguration IPV4. 上网搜索了,是关于虚拟服务器的,但是我没有配置虚拟服务器,有点奇怪. 使用下面的教程,可以解决 ... 
- centos7防火墙导致不能访问的
			CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 1.直接关闭防火墙 systemctl stop firewalld.service #停止firew ... 
- Docker: 企业级镜像仓库Harbor的使用
			上一节,演示了Harbor的安装部署 这次我们来讲解 Harbor的使用. 我们需要了解到: 1. 如何推镜像到镜像仓库 2. 如何从镜像仓库拉取镜像 3. 如何运行从私有仓库拉取的镜像 # 查看 h ... 
- eclipse去除对js文件的检测
- python部署galery集群
			galery.py文件内容 import pexpect import os import configparser HOSTNAME_DB1='db1' HOSTNAME_DB2='db2' HOS ... 
