[noip6]模板
平衡树好题啊
现在暂时还不知道用普通线段树该咋做。。。。
刚刚做完 二逼平衡树,感觉自己的 \(splay\) 水平有了很大很大的长进,然鹅。。。。
这题又给我当头一棒。。。。
然后就一下午出去了但总算也是调出来了。。。
整挺好
做这个题目的时候又想到当时那一场考试的时候,考试结束之后本以为自己在考试的时候一共四个题目,看错了三个,结果。。。。
\(\huge{\text{这个也没看对。。。}}\)
我太 \(naive\) 了,做 \(fAKe\) 了
所以我立下毒誓,以后如果题目还没有看10遍就开始码,我就随刘子康的姓。。。
不扯淡了
这个题目其实和二逼平衡树还是很像很像的,都是开很多的 \(splay\) 而不是仅仅一棵,然后再进行统计或者是合并操作。。。
这个题目所要维护的东西还是比较新颖的,将时间作为排序的标准值。。。
然后就可以对于每一个点的信息进行插入,color
time
,还有一些之前 \(splay\) 套路的一些信息。
然后就是用 time
进行排序。。。
就这???
你维护试试,包准没入门
最后进行一遍 \(dfs\),然后进行启发式合并就行了。。。。
简 简 单 单
然后就是 \(code\)
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define debug cout<<"debug"<<endl
#define freopen eat2 = freopen
#define scanf eat1 = scanf
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
char buf[1<<20],*p1 = buf,*p2 = buf;FILE *eat2;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile(){freopen("o.txt","w",stdout);}
inline int get()
{
int s = 0,f = 1;register char ch = gc();
while(!isdigit(ch))
{if(ch == '-') f = -1;ch = gc();}
while(isdigit(ch))
{s = s * 10 + ch - '0';ch = gc();}return s * f;
}
}
using namespace xin_io; int eat1;
static const int maxn = 2e6+10,mod = 1e6;
namespace xin
{
class xin_splay{public:int cnt,col,tim,ch[2],val,fa,size;}t[maxn];
class xin_edge{public:int next,ver;}edge[maxn]; int head[maxn],zhi = 0;
int tot,ret;
class xin_splay_tree
{
private:
#define up(x) t[x].size = t[t[x].ch[1]].size + t[t[x].ch[0]].size + 1,t[x].cnt = t[t[x].ch[1]].cnt + t[t[x].ch[0]].cnt + t[x].val
public:
int root; //to distinguish different splay trees
map<int,int>vis; //to record the tim of color
inline int size() {return t[root].size;}
inline void rotate(int x)
{
register int y = t[x].fa,z = t[y].fa;
register int ki = t[y].ch[1] == x;
t[z].ch[t[z].ch[1] == y] = x; t[x].fa = z;
t[y].ch[ki] = t[x].ch[ki xor 1]; t[t[x].ch[ki xor 1]].fa = y;
t[x].ch[ki xor 1] = y; t[y].fa = x;
up(y); up(x);
}//checked
inline void splay(int x,int goal)
{
while(t[x].fa != goal)
{
register int y = t[x].fa, z = t[y].fa;
if(z != goal)
(t[z].ch[0] == y) xor (t[y].ch[0] == x) ? rotate(x) : rotate(y);
rotate(x);
}
up(x);
root = x;
}//checked
inline void insert(int tim,int col,int val)
{
register int now = root,fa = 0;
while(now and tim != t[now].tim) fa = now,now = t[now].ch[tim > t[now].tim];
now = ++tot;
if(fa) t[fa].ch[tim > t[fa].tim] = now;
t[now].cnt = t[now].val = val;
t[now].fa = fa; t[now].tim = tim; t[now].size = 1; t[now].col = col;
splay(now,0);
}//checked
void change(int tim)
{
register int now = root;
while(now and t[now].tim != tim)
now = t[now].ch[tim > t[now].tim];
if(now) t[now].val = 0;
splay(now,0);
}//checked
inline bool judge(int tim,int col)
{
if(!vis[col]) {vis[col] = tim; return true;}
else if(vis[col] > tim) {change(vis[col]);vis[col] = tim; return true;}
else return false;
} //checked
int findx(int x,int lim)
{
if(!x) return 0;
if(t[t[x].ch[0]].size >= lim) findx(t[x].ch[0],lim);
else if(t[t[x].ch[0]].size + 1 >= lim) return ret + t[t[x].ch[0]].cnt + t[x].val;
else ret += t[t[x].ch[0]].cnt + t[x].val,findx(t[x].ch[1],lim -t[t[x].ch[0]].size - 1);
}//checked
int findval(int lim)
{
ret = 0;
if(!lim) return 0;
if(lim >= t[root].size) return t[root].cnt;
int ret = findx(root,lim); return ret;
}//checked
}a[maxn];
int n,m,ans[maxn],k[maxn],rec[maxn]; //rec is to make a node for each splay tree
inline void add(int x,int y) {edge[++zhi].ver = y;edge[zhi].next = head[x]; head[x] = zhi;}
int now;
inline void make(int x)
{
if(!x) return ;
make(t[x].ch[0]);
a[now].insert(t[x].tim,t[x].col,a[now].judge(t[x].tim,t[x].col));
make(t[x].ch[1]);
}
void dfs(int x,int fa)
{
for(register int i=head[x];i;i=edge[i].next)
{
register int y = edge[i].ver;
if(fa == y) continue;
dfs(y,x);
if(a[rec[x]].size() < a[rec[y]].size())
{
// cout<<x<<endl;
now = rec[y];
make(a[rec[x]].root);
rec[x] = now;
}
else
{
now = rec[x];
make(a[rec[y]].root);
// rec[y] = now;
}
}
ans[x] = a[rec[x]].findval(k[x]);
}
inline double time() {return (double)clock()/(double)(CLOCKS_PER_SEC);}
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get();
for(register int i=1;i<=n-1;++i)
{
register int x = get(),y = get();
add(x,y); add(y,x);
}
for(register int i=1;i<=n;++i) k[i] = get(),rec[i] = i;
m = get();// time();
for(register int i=1;i<=m;++i)
{
register int x = get(),col = get();
a[rec[x]].insert(i,col,a[rec[x]].judge(i,col));
}
dfs(1,0);
int q = get();
while(q--)
printf("%d\n",ans[get()]);
return 0;
}
}
signed main() {return xin::main();}
[noip6]模板的更多相关文章
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- OpenCV模板匹配算法详解
1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...
- 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
随机推荐
- Java持久层框架Mybatis入门
MyBatis是什么 MyBatis是Java的持久层框架,GitHub的star数高达15.8k,是Java技术栈中最热门的ORM框架之一.它支持自定义SQL.存储过程以及高级映射,可以通过XML或 ...
- Python进程和线程实例详解
前言 进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需 ...
- SpringBoot实战:10分钟快速搞定环境
什么是 springboot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从而使开发人 ...
- 源代码管理相关命令(Git常用命令、Nuget常用命令、CMD常用命令)
Git常用命令 源代码工具 工具名称 相关地址 Git Git for Windows VSC Visual Studio Code VSC插件(Gitlen) GitLens - Git super ...
- 台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯
前言 前面使用485和网口与台达成功建立通讯,但是485是使用用的ASICC模式,多数情况下是使用RTU模式提升通讯效率. 下载安装台达ISPSoft软件 官网下载地址:https://d ...
- IDEA打开文件时,关闭SonarLint自动扫描
操作步骤 1 打开 Preferences mac快捷键:command+, 2 搜索 SonarLint,取消勾选Automatically trigger analysis,保存设置
- 11、linux的目录结构
11.1.查看磁盘的id: blkid 11.2.linux目录类似一个倒挂的树: / 是所有目录的顶点,目录磁盘和分区是没有关联的,因此/下不同的目录会对应不同的磁盘的不同的分区: linux中硬盘 ...
- 11、mysql索引详解
1.索引介绍: 2.建立索引的方法: 注意:索引名称不要相同: (1)在建表的时候,可以增加主键索引的语句如下: 1)例一: create table student1 ( id int(4) not ...
- 界面设计ie8 笔记
1.ie8 jsp中设置 margin:0 auto 无效 解决方法 在html 标签改为<!DOCTYPE html> 2.ie8 input file 无法通过js触发点击事件,网上 ...
- 正则表达式_爬取豆瓣电影排行Top250
前言: 利用简单的正则表达式,获取响应内容爬取数据. Part1 正则表达式(Regular Expression) 1.1 简介 正则表达式,又称规则表达式,它是一种文本模式,就是通过事先定义好的一 ...