「6月雅礼集训 2017 Day7」回转寿司
【题目大意】
给一个n个数的序列,q次操作,每次选择区间$[l,r]$,给出数p,对于区间$[l,r]$的每个数$x$,做如下操作:
如果$x > p$,就交换$x$和$p$。求每次操作后$p$的值。
$1\leq n\leq 4\times 10^5, 1\leq q \leq 25000$
【题解】
这个q的范围就提示我们可以用根号算法了(逃)
由于有一个性质,p最后一定是变成[l,r]区间内最大的那个数,可是还要修改,所以我们需要分块。
我们对于区间分块,然后对于每个块维护一个堆存储元素,同时维护一个tag维护这个块被几个p给做过操作(由于做操作的时候,如果是一整块,那么我们知道这块做完后,答案一定是这块的最大值和p中取个最大的,所以我们不需要实际做操作,只要打个tag即可)
当访问到块内(头、尾),我们把块内的tag传到值上,我们一定是用tag这个堆里最小的跟区间的每个值依次比较,比较成功就交换,我们可以用堆。
还有一些优化就是我们用vector存tag,然后用强制类型转换来线性建堆(?)
我们修改直接应用在数组上,修改完,再把数组拿去线性建堆(?)
然后你96分了。。换一个读入优化板子就过了。
# include <queue>
# include <math.h>
# include <ctype.h>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int N = 4e5 + , M = 2e5 + , F = ; # define RG register
# define ST static int n, Q, BLOCK, B;
ST int a[N], bl[N];
ST int bg[F], ed[F]; #define BUFSIZE 300000
namespace fib {char b[BUFSIZE]={},*f=b;}
#define gc ((*fib::f)?(*(fib::f++)):(fgets(fib::b,sizeof(fib::b),stdin)?(fib::f=fib::b,*(fib::f++)):-1))
int g_i()
{
int tmp=; bool fu=; char s;
while(s=gc,s!='-'&&(s<''||s>'')) ;
if(s=='-') fu=; else tmp=s-'';
while(s=gc,s>=''&&s<='') tmp=tmp*+s-'';
if(fu) return -tmp; else return tmp;
}
#define gi g_i()
namespace fob {char b[BUFSIZE]={},*f=b,*g=b+BUFSIZE-;}
#define pob (fwrite(fob::b,sizeof(char),fob::f-fob::b,stdout),fob::f=fob::b,0)
#define pc(x) (*(fob::f++)=(x),(fob::f==fob::g)?pob:0)
struct foce {~foce() {pob; fflush(stdout);}} _foce;
namespace ib {char b[];}
inline void pint(int x)
{
if(x==) {pc(); return;}
if(x<) {pc('-'); x=-x;}
char *s=ib::b;
while(x) *(++s)=x%, x/=;
while(s!=ib::b) pc((*(s--))+);
} priority_queue<int> q[F];
vector<int> tag[F]; inline void rebuild(int id) {
RG int l = bg[id], r = ed[id];
q[id] = priority_queue<int> (a+l, a+r+);
} inline void tagdown(int id) {
if(!tag[id].size()) return ;
priority_queue < int, vector<int>, greater<int> > heap(tag[id].begin(), tag[id].end());
for (RG int i=bg[id], tp; i<=ed[id]; ++i) {
tp = heap.top();
if(a[i] > tp) {
heap.pop();
heap.push(a[i]);
a[i] = tp;
}
}
rebuild(id);
tag[id].clear();
} // tag down and force
inline int work(int id, int l, int r, int p) {
tagdown(id);
for (int i=l; i<=r; ++i) if(a[i] > p) swap(a[i], p);
rebuild(id);
return p;
} // cover whole
inline int work(int id, int p) {
RG int tp = q[id].top();
if(tp > p) {
tag[id].push_back(p);
q[id].pop();
q[id].push(p);
p = tp;
}
return p;
} inline int solve(int l, int r, int p) {
int BL = bl[l], BR = bl[r];
if(BL == BR) return work(BL, l, r, p);
else {
p = work(BL, l, ed[BL], p);
for (int i=BL+; i<BR; ++i) p = work(i, p);
return work(BR, bg[BR], r, p);
}
} int main() {
// freopen("sushi.in", "r", stdin);
// freopen("sushi.out", "w", stdout);
n = gi; Q = gi;
for (RG int i=; i<=n; ++i) a[i] = gi;
BLOCK = sqrt(n);
for (RG int i=; i<=n; ++i) bl[i] = (i-) / BLOCK + ;
B = bl[n];
for (RG int i=; i<=B; ++i) {
bg[i] = (i-) * BLOCK + ;
ed[i] = i * BLOCK;
if(i == B) ed[i] = n;
}
for (RG int i=; i<=n; ++i) q[bl[i]].push(a[i]);
RG int l, r, p;
while(Q --) {
l = gi, r = gi, p = gi;
if(l <= r) pint(solve(l, r, p)), pc();
else {
p = solve(l, n, p);
pint(solve(, r, p)), pc();
}
}
return ;
}
「6月雅礼集训 2017 Day7」回转寿司的更多相关文章
- 「6月雅礼集训 2017 Day7」电报
[题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 ...
- 「6月雅礼集训 2017 Day7」三明治
[题目大意] $1 \leq n,m \leq 400$ N字形表示:上图第1行第1个那种:Z字形表示上图第1行第2个那种. [题解] 很容易得到结论: 考虑如果紫色比绿色先消去,那么黄色一定会比对应 ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 「6月雅礼集训 2017 Day11」delight
[题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...
- 「6月雅礼集训 2017 Day11」jump
[题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...
- 「6月雅礼集训 2017 Day11」tree
[题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 「6月雅礼集训 2017 Day8」route
[题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...
随机推荐
- TCP系列07—连接管理—6、TCP连接管理的状态机
经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化 一.TCP状态机整体状态转换图(截取自第二版TCPIP详解) 二.TCP连接建立 ...
- eclipse 创建并运行maven web项目
这两天想在eclipse上运行maven web项目,折腾了许久,总算success啦. 1,利用eclipse创建dynamic web project(eclipse需要安装m2eclipse). ...
- 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能
本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...
- linux 相关的问题
1,查找当前目录下的文件名,并重定向到文件t中 ls > t mac 下快速补全目录名快捷键tab
- 用c++读取文件夹中的所有文件名
//头文件,注意要加stdafx.h和io.h等 #include "stdafx.h" #include <io.h> #include <vector> ...
- arp_filter/arp_ignore/rp_filter
下面这段代码应该是arp_ignore/arp_filter的最好的注脚;在ARP_ignore通过的情况下,我再去判断ARP_filter,这个ARP_filter其实就是为了判断,当数据包再出去的 ...
- Linux中实现在系统启动时自动加载模块
下面是以前学习Linux时写的,后来仔细研究rc.sysinit后发现,只需要修改下列地方就可以了,不必这么麻烦的: rc.sysinit中有这样的一段代码: # Load other user-de ...
- delphi 取得数据集某字段值的六种方法
//取name字段的示例 edit1.Text:=ADOquery1.Fields[2].AsString; //取得数据表的第二个字段的值 edit2.Text:=ADOquery1.Fie ...
- BZOJ 2337 XOR和路径(概率DP)
求点1到点n经过的路径权值异或和的期望. 考虑按位计算,对于每一位来说,令dp[i]表示从i到n的异或和期望值. 那么dp[i]=sum(dp[j]+1-dp[k]).如果w(i,j)这一位为0,如果 ...
- Elasticsearch query和filter的区别
1.关于Query context和filter context 查询语句的表现行为取决于使用了查询上下文方式还是过滤上下文方式. Query context:查询上下文,回答了“文档是如何被查询语句 ...