[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 ...
随机推荐
- 重新整理 .net core 实践篇—————路由和终结点[二十三]
前言 简单整理一下路由和终节点. 正文 路由方式主要有两种: 1.路由模板方式 2.RouteAttribute 方式 路由约束: 1.类型约束 2.范围约束 3.正则表达式 4.是否必选 5.自定义 ...
- 【NX二次开发】查找部件中的对象 UF_OBJ_cycle_objs_in_part
返回所有层上指定类型部件中的所有对象,不管它们的当前显示状态如何.这个例程不返回表达式.指定对象.临时(系统创建的)对象或休眠对象.休眠对象指的是从模型中删除的对象例如,如果你混合了一条边,那么这条边 ...
- ElGamal算法
简介 ElGamal算法可以用于加密和签名,其安全性依赖于计算有限域上离散对数的难度. ElGamal密钥 生成密钥对时,首先选择素数p,两个随机数g和x,g和x都小于p,然后计算: y = g ^ ...
- Unicode编码转换, MD5加密,URL16进制加密解密
一.站长网址:http://www.msxindl.com/ 1.Unicode与中文互转 16进制Unicode编码转换.还原 :http://www.msxindl.com/tools/uni ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(4) : 使用语言生成功能[LG: Language Generation] (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- StackOverflow经典问题:代码中如何去掉烦人的“!=null"判空语句
问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc();} 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避 ...
- Linux网络基础TCP/IP
1.osi:七层 上三层,主要是用户层面;下四层是实际进行数据传输物理层: 设备之间比特流的传输,物理接口,电气特性等 端口号的作用 通过IP找到服务器,通过端口号找到具体哪个服务.网页服务的端口号是 ...
- 学Java,找对圈子,跟对人
我大学学的是机械专业,到大四才决定要学Java,以后当一名程序员. 到现在,十几年过去了,我现在已经是一家上市公司的技术总监了,管理的技术团队有100多人.很庆幸当初了选择了学Java. 还记得当初学 ...
- 深入学习Netty(2)——传统NIO编程
前言 学习Netty编程,避免不了从了解Java 的NIO编程开始,这样才能通过比较让我们对Netty有更深的了解,才能知道Netty大大的好处.传统的NIO编程code起来比较麻烦,甚至有遗留Bug ...
- 7.2、compute节点配置
用于创建虚拟机的节点: 0.配置openstack版本yum源: yum install centos-release-openstack-rocky 1.nova-compute的安装: (1)安装 ...