Wannafly练习赛14
B(倍增)
题意:

分析:
先可以用two point预处理出以每个位置为起点的连续段<=k的下一个终点
然后对于每个询问,倍增跳就行了
时间复杂度O(nlogn)
C(扫描线处理区间询问)
题意:


分析:
先容易考虑到莫队算法,合并用并查集就行,但删除就很不方便了,而且n高达1e6,所以就无法用莫队
考虑将所有询问按照右端点r扫描线,每次维护每个位置i的答案,即区间[i,r]的答案
我们来考虑加入了一个新的数字x,会对哪些地方的答案造成修改
首先可能会有修改的地方一定是上一个x出现的位置(设为pre[x])之后
然后我们发现有一些点是修改的关键点,那就是pre[x-10],pre[x-9],...pre[x-1],pre[x+1],pre[x+2],...pre[x+10]
这些关键点中间的线段上的答案都是更改了相同的值,所以我们每次可以暴力的进行20次区间加值,询问是单点询问,这个用BIT可以轻松解决,下面我们来具体考虑一下如何修改
我们按照关键点的位置从大到小进行段修改,假设我们现在站在一个关键点上,然后这个关键点后面正好有包含0的一段[-l,r],如-3,-2,-1,1,2,那么我们应该给[cur+1,last]上的bit[l+r+1]进行区间修改,当然也别忘了要把bit[l],bit[r]对应区间减去1
时间复杂度O(nklogn+mlogn)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int a[maxn+];
struct wjmzbmr
{
int l,r,id;
bool operator < (const wjmzbmr &x) const
{
return r<x.r;
}
}q[maxn+];
char ans[maxn+][];
int pre[maxn+];
int bit[][maxn+];
int n,m;
int lowbit(int x)
{
return x&(-x);
}
void add(int *c,int k,int x)
{
if(k==) return;
for(int i=k;i<=n;i+=lowbit(i)) c[i]+=x;
}
void add(int *c,int l,int r,int x)
{
//printf("%d %d %d\n",l,r,x);
add(c,l,x);
add(c,r+,-x);
}
int query(int *c,int k)
{
int ans=;
for(int i=k;i;i-=lowbit(i)) ans+=c[i];
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
for(int i=;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
int j=;
sort(q+,q+m+);
for(int i=;i<=n;++i)
{
int x=a[i];
int l=,r=,last=i,cur=;
while(last>pre[x])
{
cur=pre[x];
if(l<=&&x+l+<=maxn&&pre[x+l+]>cur) cur=pre[x+l+];
if(r<=&&x-r->=&&pre[x-r-]>cur) cur=pre[x-r-];
//printf("%d %d %d %d\n",cur,last,l,r);
if(l&&l<=) add(bit[l],cur+,last,-);
if(r&&r<=) add(bit[r],cur+,last,-);
if(l+r+<=) add(bit[l+r+],cur+,last,);
//printf("%d %d %d %d\n",pre[x],last,l,r);
while(l<=&&x+l+<=maxn&&pre[x+l+]>=cur) ++l;
while(r<=&&x-r->=&&pre[x-r-]>=cur) ++r;
last=cur;
if(l>&&r>) break;
//printf("%d %d %d %d\n",pre[x],last,l,r);
}
pre[a[i]]=i;
while(j<=m&&q[j].r==i)
{
for(int k=;k<=;++k)
ans[q[j].id][k]=''+query(bit[k],q[j].l)%;
++j;
}
}
for(int i=;i<=m;++i) puts(ans[i]+);
return ;
}
E(bitset)
题意:


分析:
考虑预处理出d[i][j]表示从i点开始,最短距离<=j的所有点(用bool数组表示),这是1000*1000*1000的,考虑用bitset把变成1000^3/64的
然后对于每组询问只要把所有点的对应bitset或起来就行了
至于如何求d[i][j]可以O(nm)求,也可以O(n^3/64)的压位BFS求
F(树链剖分+treap)
题意:


分析:
对于一个询问,我们要考虑点u、点u的父亲、点u的重儿子、点u的轻儿子
我们把每个点的轻儿子用平衡树存起来,或者用pbds的set
然后对于每次修改,只需要改那些重链头的点的set,这总共有logn个,所以修改的复杂度是O(log^2n)的
询问就是O(log)的了
时间复杂度是O(nlog^2n+mlogn)
我们考虑把修改操作给lazy掉,就是遇见修改先不要修改,留到询问的时候再修改,这样就把复杂度岔开了
可以证明出这样的复杂度均摊是O(nlogn+mlogn)的
Wannafly练习赛14的更多相关文章
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- wannafly挑战赛14
第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...
- 牛客练习赛14 D 比较月亮大小 【水】
链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...
- 牛客练习赛14 B 区间的连续段 (倍增)
链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...
- 牛客练习赛14 D比较月亮大小 (实现)
链接:https://ac.nowcoder.com/acm/contest/82/D来源:牛客网 题目描述 点点是一名出色的狼人.众所周知,狼人只有在满月之夜才会变成狼. 同时,月亮的大小随着时间变 ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
- Wannafly挑战赛14 C.可达性(tarjan缩点)
题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最 ...
- hihocoder [Offer收割]编程练习赛14 剑刃风暴
题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现 ...
- hihocoder [Offer收割]编程练习赛14 可疑的记录
题目3 : 可疑的记录 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一棵N个节点的树,编号1-N,其中1号节点是整棵树的根.他把这棵树的N-1条边记录成N-1 ...
随机推荐
- java常考小程序
private static void nineNineMulitTable(){ /** * 9*9乘法表 */ for (int i = 1,j = 1; j <= 9; i++) { Sy ...
- C# IsNullOrEmpty与IsNullOrWhiteSpace
IsNullOrEmpty:非空非NULL判断 IsNullOrWhiteSpace:非空非NULL非空格判断 后者优于前者 if (!string.IsNullOrWhiteSpace(valueE ...
- [LUOGU] P2679 子串
一开始用一个f数组转移,发现不太对,状态有重叠部分 f[i][j][k]表示考虑了s的前i位,匹配到t的第j位,用了k个子串,且s的第i位必选 g[i][j][k]表示考虑了s的前i位,匹配到t的第j ...
- Linux rm删除文件未释放空间问题分析
问题描述: 在自己的虚拟机上做实验时出现空间不足情况,检查发现之前的kafka集群测试日志在几天写了 25G,于是进入 /data/kafka01/logs 目录执行 “rm -rf *” 删除所有测 ...
- Tcp 三次握手 四次分手
看了 余晟以为的 “tcp没那么难吧”,算是对三次握手,四次分手有了一点点理解,记录下来以方便自己以后的查看. 原文链接:https://mp.weixin.qq.com/s?__biz=MzA3MD ...
- CSS3-弹性盒模型-FlexBox
Flex容器属性 display 定义一个Flex容器,根据其取的值来决定是内联还是块.Flex容器会为其内容建立新的伸缩格式化上下文. .container { display: flex; /* ...
- Python中的序列化以及pickle和json模块介绍
Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等 ...
- Android开发——Android的消息机制详解
)子线程默认是没有Looper的,Handler创建前,必须手动创建,否则会报错.通过Looper.prepare()即可为当前线程创建一个Looper,并通过Looper.loop()来开启消息循环 ...
- [WPF自定义控件库]使用WindowChrome的问题
1. 前言 上一篇文章介绍了使用WindowChrome自定义Window,实际使用下来总有各种各样的问题,这些问题大部分都不影响使用,可能正是因为不影响使用所以一直没得到修复(也有可能别人根本不觉得 ...
- android 之 ListView相关
ListView是一种列表视图,其将ListAdapter所提供的各个控件显示在一个垂直且可滚动的列表中.需要注意的为创建适配器并将其设置给ListView. 1.ArrayAdapter Array ...