某次模拟考试day2t3 菊菊的数据结构
【题目描述】
菊菊是一个码农,他很喜欢码一些高(e)级(xin)数据结构。
有一天,菊菊在打网赛时遇到了 wfj。wfj 觉得他很有前途,可以做下一代码农大神。
于是乎,wfj 给菊菊出了一道题,来检验一下菊菊的代码能力:
这是一个简单的数据结构题,你只需在树上维护如下几个简单操作:
type=1:树上单点修改,给定 x,v,把 x 的值改为 v。
type=2:树上子树修改,给定 x,v,把 x 子树上的所有数加上 v。
type=3:树上路径修改,给定 x,y,v,把 x 到 y 路径上的所有数加上 v。
type=4:树上单点查询,给定 x,查询 x 的值。
type=5:树上子树查询,给定 x,查询子树 x 的和。
type=6:树上路径查询,给定 x,y,查询 x 到 y 路径上数的和。
wfj 想了很久,觉得这题太容易了,没有任何意义。所以,在上面这些操作完成以后,
他还要求菊菊完成另外一些操作:
type=7:树上子树查询区间第 k 小,给定 x,k,求 x 子树上第 k 小值。
type=8:树上子树查询比给定数小的数的个数,给定 x,k,求 x 子树上比 k 小的
数的个数。
type=9:树上路径查询区间第 k 小,给定 x,y,k(huaji.jpg),求 x 到 y 路径
上的区间第 k 小。
type=10:树上路径查询比给定数小的数的个数,给定 x,y,k,求 x 到 y 路径上
比 k 小的数的个数。
wfj 又想了很久,觉得这题可以了。然而这时,菊菊对他说:“这也太容易了吧!我半
小时就能 AC!”于是 wfj 怒了。他想:这个 sb,我再加一问,不信他写 得出。于是,wfj
加了最后一问:
对于这棵树,请求出这棵树中<=k 的路径条数,其中,k 为给定值。
菊菊是一个智商特别高的编程天才,他身上带了电脑,但他这回做不出来了,所以他委
托你——一位植树工人来完成这个游戏。你能帮帮他吗?
【输入数据】
第一行包括两个整数 N,表示这颗树的结点数。
接下来一行包括 N 个整数 Ai,表示 N 个结点初始权值。
接下来有 N-1 行,每行两个数 x,y,表示 x 和 y 之间有边相连。
接下来一行包括一个整数 M1,表示第一问的询问数。
接下来 M1 行每行包括一个数 type,后接几个数:
type=1:输入 x,v。
type=2:输入 x,v。
type=3:输入 x,y,v。
type=4:输入 x。
type=5:输入 x。
type=6:输入 x,y。
接下来一行一个数 M2,表示第二问的询问数。
接下来 M2 行:
type=7:输入 x,k。
type=8:输入 x,k。
type=9:输入 x,y,k。
type=10:输入 x,y,k。
最后一行一个整数 k。
以上输入意义见题中所述。
【输出数据】
对于每个查询操作,每行输出一个答案。
最后一行为最后一问的答案。
【输入样例 1】
5
00000
12
23
24
35
6
134
43
213
3342
54
634
4
722
835
9342
10 4 5 2
3
【输出样例 1】
4
5
19
5
1
5
0
10
【输入样例 2、3】
见下发样例文件。
【输出样例 2、3】
见下发样例文件。
【数据约定】
对于 30%的数据,满足 N<=3000。M1,M2<=3000。
对于 100%的数据,满足 N<=100000。M1,M2<=100000。
(ps:简单送肉板子题,应该有人 AC 吧。。)
正解:树链剖分+线段树+主席树+点分治。
全部是板子,出了这道题为了训练代码能力。考场上无人写出正解,1人写对30分暴力。。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define N (100010)
#define inf (1<<30)
#define lson (x<<1)
#define rson (x<<1|1)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct edge
{
ll nt,to;
} g[*N]; ll head[N],top[N],fa[N],son[N],size[N],dep[N],dfn[N],pos[N],cur[N],vis[N],dis[N],a[N],W[N],num[N],hsh[N],root1[N],root2[N],lazy[*N],sum[*N],sum1[*N],sum2[*N],ls1[*N],rs1[*N],ls2[*N],rs2[*N],n,ssz,sz,sz1,sz2,cnt,tot,root,limit,ans; il ll gi()
{
RG ll x=,q=;
RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void insert(RG ll from,RG ll to)
{
g[++sz]=(edge) {head[from],to},head[from]=sz;
return;
} il void dfs1(RG ll x,RG ll p)
{
dep[x]=dep[p]+,fa[x]=p,size[x]=;
RG ll v,mx=;
for (RG ll i=head[x]; i; i=g[i].nt)
{
v=g[i].to;
if (v==p) continue;
dfs1(v,x);
size[x]+=size[v];
if (size[mx]<=size[v]) mx=v;
}
son[x]=mx;
return;
} il void dfs2(RG ll x,RG ll p,RG ll a)
{
top[x]=a,dfn[x]=++cnt,pos[cnt]=x;
if (son[x]) dfs2(son[x],x,a);
RG ll v;
for (RG ll i=head[x]; i; i=g[i].nt)
{
v=g[i].to;
if (v==p || v==son[x]) continue;
dfs2(v,x,v);
}
return;
} il void down(RG ll x,RG ll l,RG ll r)
{
RG ll mid=(l+r)>>;
sum[lson]+=lazy[x]*(mid-l+),sum[rson]+=lazy[x]*(r-mid);
lazy[lson]+=lazy[x],lazy[rson]+=lazy[x],lazy[x]=;
return;
} il void build(RG ll x,RG ll l,RG ll r)
{
if (l==r)
{
sum[x]=a[pos[l]];
return;
}
RG ll mid=(l+r)>>;
build(lson,l,mid);
build(rson,mid+,r);
sum[x]=sum[lson]+sum[rson];
return;
} il void update(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll v,RG ll flag)
{
if (xl<=l && r<=xr)
{
if (flag) sum[x]+=(r-l+)*v,lazy[x]+=v;
else sum[x]=v;
return;
}
if (lazy[x]) down(x,l,r);
RG ll mid=(l+r)>>;
if (xr<=mid) update(lson,l,mid,xl,xr,v,flag);
else if (xl>mid) update(rson,mid+,r,xl,xr,v,flag);
else
{
update(lson,l,mid,xl,mid,v,flag);
update(rson,mid+,r,mid+,xr,v,flag);
}
sum[x]=sum[lson]+sum[rson];
return;
} il ll query(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr)
{
if (xl<=l && r<=xr) return sum[x];
if (lazy[x]) down(x,l,r);
RG ll mid=(l+r)>>;
if (xr<=mid) return query(lson,l,mid,xl,xr);
else if (xl>mid) return query(rson,mid+,r,xl,xr);
else return query(lson,l,mid,xl,mid)+query(rson,mid+,r,mid+,xr);
} il void change(RG ll u,RG ll v,RG ll w)
{
while (top[u]!=top[v])
{
if (dep[top[u]]<dep[top[v]]) swap(u,v);
update(,,n,dfn[top[u]],dfn[u],w,);
u=fa[top[u]];
}
if (dep[u]>dep[v]) swap(u,v);
update(,,n,dfn[u],dfn[v],w,);
return;
} il ll Query(RG ll u,RG ll v)
{
RG ll res=;
while (top[u]!=top[v])
{
if (dep[top[u]]<dep[top[v]]) swap(u,v);
res+=query(,,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if (dep[u]>dep[v]) swap(u,v);
res+=query(,,n,dfn[u],dfn[v]);
return res;
} il ll lca(RG ll u,RG ll v)
{
while (top[u]!=top[v])
{
if (dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]>dep[v] ? v : u;
} il void kth1build(RG ll x,RG ll &y,RG ll l,RG ll r,RG ll v)
{
sum1[y=++sz1]=sum1[x]+,ls1[y]=ls1[x],rs1[y]=rs1[x];
if (l==r) return;
RG ll mid=(l+r)>>;
if (v<=mid) kth1build(ls1[x],ls1[y],l,mid,v);
else kth1build(rs1[x],rs1[y],mid+,r,v);
return;
} il ll kth1query1(RG ll x,RG ll y,RG ll k)
{
RG ll l=,r=tot,mid,tmp;
while (l<r)
{
mid=(l+r)>>,tmp=sum1[ls1[y]]-sum1[ls1[x]];
if (k<=tmp) r=mid,x=ls1[x],y=ls1[y];
else l=mid+,k-=tmp,x=rs1[x],y=rs1[y];
}
return hsh[l];
} il ll kth1query2(RG ll x,RG ll y,RG ll k)
{
if (!k) return ;
RG ll l=,r=tot,mid,ans=;
while (l<r)
{
mid=(l+r)>>;
if (k<=mid) r=mid,x=ls1[x],y=ls1[y];
else
{
ans+=sum1[ls1[y]]-sum1[ls1[x]];
l=mid+,x=rs1[x],y=rs1[y];
}
}
return ans+sum1[y]-sum1[x];
} il void kth2build(RG ll x,RG ll &y,RG ll l,RG ll r,RG ll v)
{
sum2[y=++sz2]=sum2[x]+,ls2[y]=ls2[x],rs2[y]=rs2[x];
if (l==r) return;
RG ll mid=(l+r)>>;
if (v<=mid) kth2build(ls2[x],ls2[y],l,mid,v);
else kth2build(rs2[x],rs2[y],mid+,r,v);
return;
} il ll kth2query1(RG ll u,RG ll v,RG ll k)
{
RG ll Lca=lca(u,v),l=,r=tot,mid,tmp;
RG ll a=root2[dfn[u]],b=root2[dfn[v]];
RG ll c=root2[dfn[Lca]],d=root2[dfn[fa[Lca]]];
while (l<r)
{
mid=(l+r)>>,tmp=sum2[ls2[a]]+sum2[ls2[b]]-sum2[ls2[c]]-sum2[ls2[d]];
if (k<=tmp) r=mid,a=ls2[a],b=ls2[b],c=ls2[c],d=ls2[d];
else k-=tmp,l=mid+,a=rs2[a],b=rs2[b],c=rs2[c],d=rs2[d];
}
return hsh[l];
} il ll kth2query2(RG ll u,RG ll v,RG ll k)
{
if (!k) return ;
RG ll Lca=lca(u,v),l=,r=tot,mid,ans=;
RG ll a=root2[dfn[u]],b=root2[dfn[v]],c=root2[dfn[Lca]],d=root2[dfn[fa[Lca]]];
while (l<r)
{
mid=(l+r)>>;
if (k<=mid) r=mid,a=ls2[a],b=ls2[b],c=ls2[c],d=ls2[d];
else
{
ans+=sum2[ls2[a]]+sum2[ls2[b]]-sum2[ls2[c]]-sum2[ls2[d]],l=mid+;
a=rs2[a],b=rs2[b],c=rs2[c],d=rs2[d];
}
}
return ans+sum2[a]+sum2[b]-sum2[c]-sum2[d];
} il void dfs3(RG ll x)
{
kth2build(root2[dfn[fa[x]]],root2[dfn[x]],,tot,num[dfn[x]]);
for (RG ll i=head[x]; i; i=g[i].nt)
{
RG ll v=g[i].to;
if (v==fa[x]) continue;
dfs3(v);
}
return;
} il void getroot(RG ll x,RG ll p)
{
size[x]=,son[x]=;
for (RG ll i=head[x]; i; i=g[i].nt)
{
RG ll v=g[i].to;
if (vis[v] || v==p) continue;
getroot(v,x);
size[x]+=size[v];
son[x]=max(son[x],size[v]);
}
son[x]=max(son[x],son[]-size[x]);
if (son[x]<son[root]) root=x;
return;
} il void getdis(RG ll x,RG ll p)
{
cur[++ssz]=dis[x];
for (RG ll i=head[x]; i; i=g[i].nt)
{
RG ll v=g[i].to;
if (vis[v] || v==p) continue;
dis[v]=dis[x]+;
getdis(v,x);
}
return;
} il ll cont(RG ll x,RG ll mit)
{
RG ll res=;
dis[x]=mit,ssz=;
getdis(x,);
sort(cur+,cur+ssz+);
for (RG ll l=,r=ssz; l<r;)
if (cur[l]+cur[r]<=limit) res+=(r-l++);
else r--;
return res;
} il void solve(RG ll x)
{
vis[x]=;
ans+=cont(x,);
for (RG ll i=head[x]; i; i=g[i].nt)
{
RG ll v=g[i].to;
if (vis[v]) continue;
ans-=cont(v,),root=,son[]=size[v];
getroot(v,),solve(root);
}
return;
} il void work()
{
n=gi();
RG ll m1,m2,u,v,w,x,k,type;
for (RG ll i=; i<=n; ++i) a[i]=gi();
for (RG ll i=; i<n; ++i)
{
u=gi(),v=gi();
insert(u,v),insert(v,u);
}
dfs1(,),dfs2(,,);
build(,,n);
m1=gi();
for (RG ll i=; i<=m1; ++i)
{
type=gi();
if (type==)
{
x=gi(),w=gi();
update(,,n,dfn[x],dfn[x],w,);
}
if (type==)
{
x=gi(),w=gi();
update(,,n,dfn[x],dfn[x]+size[x]-,w,);
}
if (type==)
{
u=gi(),v=gi(),w=gi();
change(u,v,w);
}
if (type==)
{
x=gi();
printf("%lld\n",query(,,n,dfn[x],dfn[x]));
}
if (type==)
{
x=gi();
printf("%lld\n",query(,,n,dfn[x],dfn[x]+size[x]-));
}
if (type==)
{
u=gi(),v=gi();
printf("%lld\n",Query(u,v));
}
}
for (RG ll i=; i<=n; ++i) num[i]=W[i]=query(,,n,i,i);
sort(num+,num+n+);
hsh[tot=]=num[];
for (RG ll i=; i<=n; ++i) if (num[i]>num[i-]) hsh[++tot]=num[i];
for (RG ll i=; i<=n; ++i) num[i]=lower_bound(hsh+,hsh+tot+,W[i])-hsh;
for (RG ll i=; i<=n; ++i) kth1build(root1[i-],root1[i],,tot,num[i]);
dfs3();
m2=gi();
for (RG ll i=; i<=m2; ++i)
{
type=gi();
if (type==)
{
x=gi(),k=gi();
printf("%lld\n",kth1query1(root1[dfn[x]-],root1[dfn[x]+size[x]-],k));
}
if (type==)
{
x=gi(),k=gi();
if (k>hsh[tot]) k=tot;
else if (k<hsh[]) k=;
else k=upper_bound(hsh+,hsh+tot+,k)-hsh-;
printf("%lld\n",kth1query2(root1[dfn[x]-],root1[dfn[x]+size[x]-],k));
}
if (type==)
{
u=gi(),v=gi(),k=gi();
printf("%lld\n",kth2query1(u,v,k));
}
if (type==)
{
u=gi(),v=gi(),k=gi();
if (k>hsh[tot]) k=tot;
else if (k<hsh[]) k=;
else k=upper_bound(hsh+,hsh+tot+,k)-hsh-;
printf("%lld\n",kth2query2(u,v,k));
}
}
limit=gi();
ans=,root=,son[]=n;
getroot(,);
solve(root);
printf("%lld\n",ans);
return;
} int main()
{
File("structure");
work();
return ;
}
某次模拟考试day2t3 菊菊的数据结构的更多相关文章
- 驾照理论模拟考试系统Android源码下载
驾照理论模拟考试系统Android源码下载 <ignore_js_op> 9.png (55.77 KB, 下载次数: 0) <ignore_js_op> 10.png ...
- RHCE模拟考试
真实考试环境说明: 你考试所用的真实物理机器会使用普通账号自动登陆,登陆后,桌面会有两个虚拟主机图标,分别是system1和system2.所有的考试操作都是在system1和system2上完成.S ...
- PHPEMS在线模拟考试系统 v4.2
官网地址 :http://www.phpems.net/ 下载地址 : http://www.phpems.net/index.php?content-app-content&contenti ...
- 2017 五一 清北学堂 Day1模拟考试结题报告
预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...
- PMP模拟考试-2
1. Increasing resources on the critical path activities may not always shorten the length of the pro ...
- PMP模拟考试-1
1. A manufacturing project has a schedule performance index (SPI) of 0.89 and a cost performance ind ...
- RHSCA模拟考试
开始考试:桌面是个黑框子 点击reboot按钮,破解密码 开机成功,输入startx进入图形界面 不能复制,要在物理机用ssh root@172.25.0.11 远程连接,就可以复制粘贴了 * Hos ...
- 1109 NOIP 模拟考试
NOIP2016 模拟赛 ——那些年,我们学过的文化课 背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, ...
- 6.28日模拟考试总结(T1:翻转游戏;T2:抢掠计划,T3:测绘,T4:奖学金)
今天的考试有结束了,又一次被右边的同桌虐了(额,排名第三的大佬)但是考试还是进步了一名,算是有进步吧 成绩: 那个12名就是我,一个AC都没有,太难受了. T1: 题目链接:http://hzoi.c ...
随机推荐
- a中的类型转换
自动类型转换 当然自动类型转换是需要满足特定的条件的: 1. 目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型. 2. 目标类型大于源类型,如 ...
- 用 Visual Studio Code 调试 Node.js
环境: Visual Studio Code Node.js 1. 关闭运行中的程序 2.打开入口文件,我这里的入口文件为 app.js 3.点击左侧菜单栏的 debug 按钮 4.点击运行按钮 5 ...
- (8)集合之List,ArrayList,LinkedList
集合的体系结构 Collection 单列集合的接口 |----List 如果实现了List接口的集合类,具备的特点是有序,可重复 |----Set 如果实现了Set接口的集合类,集合特点无序不可重复 ...
- WP8.1小梦词典开发2:百度翻译API使用
原文出自:http://www.bcmeng.com/api2/ 小梦昨天和大家分享了WP8.1金山词霸API使用方法,今天继续分享windows phone 8.1中百度翻译API的使用方法.和昨天 ...
- 关于npm安装全局模块,require时报Error: Cannot find module 'XXX'的解决办法
系统环境:centos 下午使用npm安装"cheerio",想搞爬虫玩玩. npm安装有两种模式: 本地 # npm install cheerio 全局 # npm insta ...
- 《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
第十一章 缓存内容 (译者 @ucag 注:这是倒数第二章,最后一个项目即将完成. @夜夜月 将会接过翻译的最后一棒.这本书的翻译即将完成.这也是我翻译的最后一章,作为英语专业的学生,我对于翻译有了更 ...
- MyBatis快速入门(1):搭建环境和单表映射
一.MyBatis简介 一说起对象关系映射框架,大家第一时间想到的肯定是Hibernate.Hibernate作为一个著名的框架,功能十分强大.我们只需要配置好实体类和数据表之间的关系,Hibe ...
- 老李分享:接电话扩展之uiautomator 2
主要的类就是上面的PhoneReceiver广播接收者.来电的时候,我们记录下电话号码,等该来电挂断以后,立即回拨给对方.配置文件如下: <?xml version="1.0" ...
- [C#] 使用 StackExchange.Redis 封装属于自己的 Helper
使用 StackExchange.Redis 封装属于自己的 Helper 目录 核心类 ConnectionMultiplexer 字符串(String) 哈希(Hash) 列表(List) 有序集 ...
- Angular--学习
18:28:34 Angular简介 AngularJS通过指令 扩展了HTML,并通过 表达式 绑定数据到HTML Angular扩展了HTML AngularJS 通过 ng-directives ...