[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 ...
随机推荐
- pytest skip的使用
skip跳过用例(无条件跳过,不运行用例) 使用方法: 1.使用跳过装饰器 class TestClass(): @pytest.mark.skip(reason='no way of current ...
- 盘点用jQuery框架实现“for循环”的四种方式!
摘要:分享在jQuery高级开发中对元素标签体的遍历常用的几种方法. 本文分享自华为云社区<盘点用jQuery框架实现"for循环"的四种方式!>,原文作者:灰小猿 . ...
- 【VBA】读取另一个excel工作簿中的内容
后台打开工作簿读取内容源码: Sub subOpenWorkbook() Dim datebase As String datebase = "... ....xlsx" Appl ...
- 设置NX欢迎界面
环境变量 变量名:UGII_WELCOME_PAGE 变量值:http://www.baidu.com/
- PTA题目集总结
PTA题目集1-3总结 一:前言 我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题:题集二有五道题,题量适度,难度也适中:题集三虽然只有三道题,但是难度却骤然提升,前两题 ...
- DG duplicate报错:RMAN-05001:auxiliary file name /u01/app/oracle/oradata/fratbs01.dbf conflicts with a file used by the target database
问题:rman duplicate时报错: RMAN-05001:auxiliary file name /u01/app/oracle/oradata/fratbs01.dbf conflicts ...
- 可扩展的 Web 架构与分布式系统
作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...
- 在vue项目中使用echarts
1.安装echarts依赖npm install echarts --save 2.在要使用的页面引入import echarts from 'echarts'v5之后使用 import * echa ...
- 微信获取信息发生错误(两个access_token的区别),错误代码:40001,说明:invalid credential, access_token is invalid or not latest hints
微信有两个access_token,一个是基础access_token,一个是网页授权access_token. 想要获取不带unionid的用户信息(以下链接)使用基础access_token ht ...
- React 并发功能体验-前端的并发模式已经到来。
React 是一个开源 JavaScript 库,开发人员使用它来创建基于 Web 和移动的应用程序,并且支持构建交互式用户界面和 UI 组件.React 是由 Facebook 软件工程师 Jord ...