原题链接:http://codeforces.com/contest/1039/problem/E

Summer Oenothera Exhibition

While some people enjoy spending their time solving programming contests, Dina prefers taking beautiful pictures. As soon as Byteland Botanical Garden announced Summer Oenothera Exhibition she decided to test her new camera there.

The exhibition consists of l=10100l=10^{100}l=10100 Oenothera species arranged in a row and consecutively numbered with integers from 000 to l−1l−1l−1. Camera lens allows to take a photo of www species on it, i.e. Dina can take a photo containing flowers with indices from xxx to x+w−1x+w−1x+w−1 for some integer xxx between 000 and l−wl−wl−w. We will denote such photo with [x,x+w−1][x,x+w−1][x,x+w−1].

She has taken nnn photos, the iii-th of which (in chronological order) is [xi,xi+w−1][x_i,x_i+w−1][xi​,xi​+w−1] in our notation. She decided to build a time-lapse video from these photos once she discovered that Oenothera blossoms open in the evening.

Dina takes each photo and truncates it, leaving its segment containing exactly kkk flowers, then she composes a video of these photos keeping their original order and voilà, a beautiful artwork has been created!

A scene is a contiguous sequence of photos such that the set of flowers on them is the same. The change between two scenes is called a cut. For example, consider the first photo contains flowers [1,5][1,5][1,5], the second photo contains flowers [3,7][3,7][3,7] and the third photo contains flowers [8,12][8,12][8,12]. If k=3k=3k=3, then Dina can truncate the first and the second photo into [3,5][3,5][3,5], and the third photo into [9,11][9,11][9,11]. First two photos form a scene, third photo also forms a scene and the transition between these two scenes which happens between the second and the third photos is a cut. If k=4k=4k=4, then each of the transitions between photos has to be a cut.

Dina wants the number of cuts to be as small as possible. Please help her! Calculate the minimum possible number of cuts for different values of kkk.

Input

The first line contains three positive integer n,w,q(1≤n,q≤100000,1≤w≤109)n, w, q (1≤n,q≤100000, 1≤w≤10^9)n,w,q(1≤n,q≤100000,1≤w≤109) — the number of taken photos, the number of flowers on a single photo and the number of queries.

Next line contains nnn non-negative integers xi(0≤xi≤109)x_i (0≤x_i≤10^9)xi​(0≤xi​≤109) — the indices of the leftmost flowers on each of the photos.

Next line contains qqq positive integers ki(1≤ki≤w)k_i (1≤k_i≤w)ki​(1≤ki​≤w) — the values of kkk for which you have to solve the problem.

It’s guaranteed that all kik_iki​ are distinct.

Output

Print qqq integers — for each width of the truncated photo kik_iki​, the minimum number of cuts that is possible.

Examples
input

3 6 5
2 4 0
1 2 3 4 5

output

0
0
1
1
2

input

6 4 3
1 2 3 4 3 2
1 2 3

output

0
1
2

题目大意

直接看英文是真的不知道在说个什么**玩意儿,但是修修告诉我题意是这样的:

给定长度为nnn的序列,常数www,询问次数qqq。

接下来qqq组询问,每次给出一个常数kik_iki​,求最少把序列分为多少段使得每段序列中数的极差不超过w−kiw-k_iw−ki​,输出最小的段数−1-1−1。

题解

让我们先考虑一下单次询问怎么做:直接贪心,每次尽量往后跳,直到极差不满足条件为止,这样我们就O(n)O(n)O(n)解决了一次询问。

暴力跳太low\mathcal{low}low了,不如我们倍增吧,先处理出最大/最小值的ST\mathcal{ST}ST表,我们就可以愉快的倍增往后跳了。

在线一看就很不可做的样子,那就把所有询问单增离线吧,离线之后,跳的距离也会单增,考虑维护每个点向后能跳到的最远点nxt[v]nxt[v]nxt[v]。

暴力一点的做法:对于一个新的极差rrr,我们把所有点都尝试往后挪来更新nxt[v]nxt[v]nxt[v],然后从头开始往后沿着nxt[v]nxt[v]nxt[v]跳。

感觉这个操作修改和查询都很爆炸,自然想到分块一下,块内路径压缩,更新路径也仅限于块内,块之间跳用倍增来找。

复杂度?大概是O(n32log⁡2n)O(n^{\frac{3}{2}}\log_2n)O(n23​log2​n)的吧。

据说修修有个O(n53+n43log⁡n)O(n^{\frac{5}{3}} + n^{\frac{4}{3}}\log n)O(n35​+n34​logn)的优秀做法,然而我DZYO的O(n32log⁡2n)O(n^{\frac{3}{2}}\log_2n)O(n23​log2​n)全CFCFCF最快,一手LCT\mathcal{LCT}LCT弹飞绵羊代替路径压缩跑的飞快,吊锤所有算法。

代码

ST\mathcal{ST}ST表表示2i2^i2i的维度一定要开在前面,这样就能访问连续内存,这大概就是AC\mathcal{AC}AC与TLE\mathcal{TLE}TLE的距离吧。

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
struct sd{int id,r;}ask[M<<6];
bool operator <(sd a,sd b){return a.r==b.r?a.id>b.id:a.r<b.r;}
int st[20][M][2],que[M],nxt[M],blo[M][2],jmp[M][2],ans[M],n,w,q,siz,tot;
void in()
{scanf("%d%d%d",&n,&w,&q);for(int i=1;i<=n;++i)scanf("%d",&que[i]),st[0][i][0]=st[0][i][1]=que[i];for(int i=1,k;i<=q;++i)scanf("%d",&k),ask[++tot]=(sd){i-q,w-k};
}
void up(int v){(nxt[v]==n+1||(nxt[v]-1)%siz==0)?(jmp[v][0]=1,jmp[v][1]=v):(jmp[v][0]=jmp[nxt[v]][0]+1,jmp[v][1]=jmp[nxt[v]][1]);}
void ac()
{for(;siz*siz*siz<6*n;++siz);for(int j=1;(1<<j)<=n;++j)for(int i=1;i+(1<<j)<=n+1;++i)st[j][i][0]=min(st[j-1][i][0],st[j-1][i+(1<<j-1)][0]),st[j][i][1]=max(st[j-1][i][1],st[j-1][i+(1<<j-1)][1]);for(int i=n;i>=1;--i){nxt[i]=i+1,blo[i][0]=blo[i][1]=que[i],up(i);for(int j=i+1,mn=que[i],mx=que[i];j<=n&&(j-1)%siz>0;++j)mn=min(mn,que[j]),mx=max(mx,que[j]),ask[++tot]=(sd){i,mx-mn};}sort(ask+1,ask+1+tot);for(int i=1,pos,cst,mn,mx,k,to,maxn,minn;i<=tot;++i)if(ask[i].id<=0)for(pos=1,cst=-1;pos<=n;ans[ask[i].id+q]=cst){cst+=jmp[pos][0],pos=jmp[pos][1],mn=blo[pos][0],mx=blo[pos][1],to=pos,k=0;for(;pos+(1<<k)<=n+1&&(maxn=max(mx,st[k][pos][1]))-(minn=min(mn,st[k][pos][0]))<=ask[i].r;++k)mx=maxn,mn=minn;for(;k--;)if(to+(1<<k)<=n+1&&(maxn=max(mx,st[k][to][1]))-(minn=min(mn,st[k][to][0]))<=ask[i].r)mx=maxn,mn=minn,to+=1<<k;blo[pos][0]=mn,blo[pos][1]=mx,pos=nxt[pos]=to;}else for(nxt[pos=ask[i].id]++,mn=(pos-1)/siz*siz+1;pos>=mn;--pos)up(pos);for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
}
int main(){in();ac();}

寻找一个能读懂这份玄学代码的人(来源)。

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4")# include <iostream>
# include <immintrin.h>
# include <array>
using namespace std;constexpr int INF = 1e9 + 9;
int x[101010];
int n, w, q;
using V4 = int __attribute__ ((vector_size (16)));
#define MAX(a, b) __builtin_ia32_pmaxsd128(a, b)
#define MIN(a, b) __builtin_ia32_pminsd128(a, b)
V4 foo(V4 k) {V4 from = {-INF, -INF, -INF, -INF};V4 to = from;V4 ans = {-1, -1, -1, -1};for (int i = 0; i < n; ++i) {V4 val = {x[i], x[i], x[i], x[i]};from = MAX(from, val);to = MIN(to, val);V4 c = from > to + k;ans -= c;from += c & (val - from);to += c & (val - to);}return ans;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cin >> n >> w >> q;for (int i = 0; i < n; ++i) {cin >> x[i];}while (q > 0) {int kk[4];V4 k;for (int i = 0; i < 4; ++i) {cin >> kk[i];}for (int i = 0; i < 4; ++i) {k[i] = w - kk[i];}auto ans = foo(k);for (int i = 0; i < min(q, 4); ++i) {cout << ans[i] << '\n';}q -= 4;}return 0;
}

CF1039E Summer Oenothera Exhibition相关推荐

  1. [CF1039E]Summer Oenothera Exhibition[根号分治+lct]

    题意 给一个长度为 \(n\) 的序列, \(q\) 次询问,次给一个 \(k_i\) ,问最少将序列划分成多少次,满足每一段的极差不超过\(w−k_i\). \(1 \leq n, q \leq 1 ...

  2. CF1039E-Summer Oenothera Exhibition【LCT,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1039E 题目大意 给出nnn个数的序列,mmm次询问至少将这个序列分成多少段才能满足每一段的和不超过w−qiw ...

  3. CodeForces - 1486B Eastern Exhibition(二维中位数)

    题目链接:点击查看 题目大意:给出二维平面上的 nnn 个点,现在需要选择任意一个点满足到所有点的距离最小,问这样的点有几个 题目分析:如果压成一维的话,那就是一个裸的中位数问题了,只是升到了二维而已 ...

  4. CF1486B Eastern Exhibition

    CF1486B Eastern Exhibition 题意: 二维平面上有 n 个点,要找一个点,使得所有点到它的曼哈顿距离( x 和 y 的坐标差距之和)之和最小.请问有几个满足该要求的点? 题解: ...

  5. 【英语学习】【Daily English】U14 Transportation L01There will be a car exhibition next month

    文章目录 Word Preparation upcoming event:近期活动:即将发生的事件 display:v. 展示,陈列 exhibition:展览会,展出 There will be . ...

  6. Sonya and Exhibition 【模拟】

    题目链接:https://cn.vjudge.net/contest/280309#problem/J 题目描述 Sonya decided to organize an exhibition of ...

  7. CodeForces - 1004B - Sonya and Exhibition(纯思维题)

    题目链接: http://codeforces.com/problemset/problem/1004/B 题目: Sonya decided to organize an exhibition of ...

  8. Atcoder Codefestival Exhibition/Team Relay/Tournament Round 简要题解

    Exhibition Awkward 考虑容斥,至少某些限制不满足. 把不满足的边画出来,发现是若干条不相交路径,DP即可. #include <bits/stdc++.h> #defin ...

  9. A - Mio visits ACGN Exhibition(dp)

    A - Mio visits ACGN Exhibition 借鉴了:https://blog.csdn.net/qq_63010655/article/details/123699263 并做了些许 ...

  10. 展览会Exhibition

    目录 前言 原文 展览会常用会话 展览会常用会话 展览会常用会话 前言 继续努力 原文 展览会常用会话 ❶ Here you are. This is my name card. 给您,这是我的名片. ...

最新文章

  1. QT 调用QWebEngineView显示网页
  2. ubuntu12.10安装openssh-server与本身的软件冲突
  3. 开源 | 如何实现一个iOS AOP框架?
  4. 2.struts1.x中的异常处理
  5. PowerDesigner 手记
  6. 安装memcached:error while loading shared libraries: libevent-1.4.so.2
  7. 《菜菜的机器学习sklearn课堂》sklearn入门与决策树
  8. U-mail邮件系统对故障的紧急措施有哪些?
  9. Spring.Net配置多数据源
  10. 130242014039-(2)-体验敏捷开发
  11. 十二款世界顶级杀毒软件下载,有序列号
  12. 鸿蒙手机开发者活动,华为 12 月16 日举行鸿蒙 2.0 手机开发者 Beta 活动
  13. 硬件知识:固态硬盘和机械硬盘区别
  14. 新成员入群监控自动发送邮件效果如何实现?
  15. android的平台签名工具,《安卓开发》APK签名工具使用方法
  16. 点击唤起电话功能和企业微信聊天窗口事件(H5)
  17. “竞速”智能网联汽车,领头雁为何是长沙?
  18. html滚动条自动翻页,10款无限滚动自动翻页jquery插件
  19. 推荐系统入门(六):新闻推荐实践1(附代码)
  20. enc28j60 linux 驱动_enc28j60网卡驱动模块添加进Linux内核,Kconfig,Makefile配置过程...

热门文章

  1. jupyter kernel error
  2. 算法笔记-差分和前缀和
  3. 725.分隔链表(力扣leetcode) 博主可答疑该问题
  4. 278.第一个错误版本(力扣leetcode) 博主可答疑该问题
  5. 简单的maven引入外部jar项目打包
  6. A Story of One Country (Hard) CodeForces - 1181E2 (分治)
  7. 获取OlapConnection连接
  8. 深圳安全研讨会圆满结束,PPT共享下载
  9. SQL 必知必会·笔记6使用数据处理函数
  10. WCF集成COM+应用程序遇到的问题