【8.15校内测试】【队列】【manacher】

dp??不能确定转移状态。考虑用优先队列储存最优决策点,可是发现当前选择最优不能保证最后最优,在后面可以将之前用过的替换过来。
比如数据:
3 5
4 6
只储存a[i]来决策不能延展到后面的状态,因此每次选择过后把b[i]加入队列,下次选择最优时如果选择到了b[i],则表示用之前选择过的来替换到当前状态。
这里我开了两个优先队列。
#include<iostream>
#include<cstdio>
#include<queue>
#define ll long long
#define RG register
using namespace std; int n, a[], b[]; priority_queue < int, vector < int > , greater < int > > q1, q2; int main ( ) {
freopen ( "buy.in", "r", stdin );
freopen ( "buy.out", "w", stdout );
scanf ( "%d", &n );
for ( RG int i = ; i <= n; i ++ )
scanf ( "%d", &a[i] );
for ( RG int i = ; i <= n; i ++ )
scanf ( "%d", &b[i] );
ll ans = ;
for ( RG int i = ; i <= n; i ++ ) {
q1.push ( a[i] );
int r1 = , r2 = ;
if ( !q1.empty ( ) ) {
int x = q1.top ( );
if ( b[i] > x ) r1 = b[i] - x;
}
if ( !q2.empty ( ) ) {
int x = q2.top ( );
if ( b[i] > x ) r2 = b[i] - x;
}
if ( r1 >= r2 && r1 ) ans += r1, q1.pop ( ), q2.push ( b[i] );
else if ( r2 > r1 && r2 ) ans += r2, q2.pop ( ), q2.push ( b[i] );
}
printf ( "%I64d", ans );
return ;
}

记录前缀和,可以发现,从某一个点为起点时,向后延展出去的长度中一定有i到i+s这一段,所以用前缀和最大值建一棵线段树,每次查找i+s-1到i+e-1段的最大值,减去i-1的前缀和比较答案即可。
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std; int n, s, e, a[];
ll pre[], TR[]; void update ( int nd ) {
TR[nd] = max ( TR[nd << ], TR[nd << | ] );
} void build ( int nd, int l, int r ) {
if ( l == r ) {
TR[nd] = pre[l];
return ;
}
int mid = ( l + r ) >> ;
build ( nd << , l, mid );
build ( nd << | , mid + , r );
update ( nd );
} ll query ( int nd, int l, int r, int L, int R ) {
if ( l >= L && r <= R ) return TR[nd];
int mid = ( l + r ) >> ;
ll ans = -1e9;
if ( L <= mid ) ans = max ( ans, query ( nd << , l, mid, L, R ) );
if ( R > mid ) ans = max ( ans, query ( nd << | , mid + , r, L, R ) );
return ans;
} int main ( ) {
freopen ( "invest.in", "r", stdin );
freopen ( "invest.out", "w", stdout );
scanf ( "%d%d%d", &n, &s, &e );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%d", &a[i] );
pre[i] = pre[i-] + a[i];
}
build ( , , n );
ll ans = ;
for ( int i = ; i <= n; i ++ ) {
if ( i + s - > n ) break;
ll x = query ( , , n, i + s - , i + e - );
ans = max ( x - pre[i-], ans );
}
printf ( "%I64d", ans );
return ;
}

关键时候manacher忘了怎么写!!先manacher一遍处理出以每个点为中心点的最长回文串长度,一定是奇数。开桶记录每个长度出现次数,从大到小枚举长度l,每次把l-2的次数加上l的次数,因为l的长度满足回文串l-2一定满足(同一中心点,注意k要开long long!
#include<iostream>
#include<cstdio>
#define ll long long
#define mod 19930726
using namespace std; ll max_r[];
int n;
ll k;
ll ans = , flag[]; char M[], a[]; inline ll min ( ll a, int b ) {
return a < b ? a : b;
} ll mi ( ll a, ll b ) {
ll an = ;
for ( ; b; b >>= , a = a * a % mod )
if ( b & ) an = an * a % mod;
return an;
} void manacher ( ) {
M[] = '@';
for ( int i = ; i <= n; i ++ ) {
M[ * i - ] = '#';
M[ * i] = a[i];
}
M[ * n + ] = '#'; M[ * n + ] = '$';
int center = ; ll mx = ;
int side = n * + ;
for ( int i = ; i <= n * + ; i ++ ) {
if ( mx > i ) max_r[i] = min ( mx - (ll)i, max_r[center * - i] );
else max_r[i] = ;
while ( M[max_r[i]+i] == M[i-max_r[i]] ) max_r[i] ++;
if ( mx < i + max_r[i] ) {
mx = i + max_r[i]; center = i;
}
}
} int main ( ) {
freopen ( "rehearse.in", "r", stdin );
freopen ( "rehearse.out", "w", stdout );
scanf ( "%d%I64d\n", &n, &k );
scanf ( "%s", a + );
manacher ( );
ll MA = ;
for ( int i = ; i <= n; i ++ ) {
max_r[i*] --;
flag[max_r[i*]] ++;
MA = max ( MA, max_r[i*] );
}
ll pos = MA;
while ( k > ) {
ans = ( ans * mi ( pos, min ( flag[pos], k ) ) ) % mod;
flag[pos-] += flag[pos];
k -= flag[pos];
pos = pos - ;
}
printf ( "%I64d", ans );
return ;
}
【8.15校内测试】【队列】【manacher】的更多相关文章
- 【9.15校内测试】【寻找扩展可行域+特判】【Trie树 异或最小生成树】【模拟:)】
之前都没做出来的同名题简直留下心理阴影啊...其实这道题还是挺好想的QAQ 可以发现,鸟可以走到的点是如下图这样扩展的: 由$(0,0)$向两边扩展,黑色是可以扩展到的点,红色是不能扩展的点,可以推出 ...
- 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】
对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...
- 2018/8/15 qbxt 测试
2018/8/15 qbxt 测试 期望得分:100:实际得分:50 不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...
- 2019.7.9 校内测试 T3 15数码问题
这一次是交流测试?边交流边测试(滑稽 15数码问题 大家应该都玩过这个15数码的游戏吧,就在桌面小具库那里面哦. 一看到这个题就知道要GG,本着能骗点分的原则输出了 t 个无解,本来以为要爆零,没想到 ...
- 【10.7校内测试】【队列滑窗】【2-sat】【贪心+栈二分+线段树(noip模拟好题)】【生日祭!】
比较好想的一道题,直接用队列滑窗,因为扫一遍往队列里加东西时,改变的只有一个值,开桶储存好就行了! #include<bits/stdc++.h> using namespace std; ...
- 【bzoj 1414】对称的正方形 单调队列+manacher
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...
- 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】
上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...
- 2016.07.15——istringstream测试
istringstream测试 1.istringstream strcin(str),字符串(str)可以包括多个单词,单词之间使用空格分开 #include "stdafx.h" ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
随机推荐
- JavaScript三种绑定事件的方式
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
- vc 播放音乐
#include <vfw.h> #pragma comment(lib,"vfw32.lib") ● 简单实现 要实现一个播放器,首先要先建立一个MF ...
- 深入理解Spring系列之六:bean初始化
转载 https://mp.weixin.qq.com/s/SmtqoELzBEdZLo8wsSvUdQ <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对 ...
- Git学习笔记3 git revert
我们难免会因为种种原因执行一些错误的commit / push,git提供了revert命令帮助程序员修复这样的错误. 举个例子,下图是git commit 的历史记录 git revert 命令会通 ...
- Python中的raw_input()和input()
raw_input()和input()都是python中的内建函数,用于读取控制台用户的输入,但有所区别: [nr@localhost conf]$ python Python 2.7.5 (defa ...
- (总结)MySQL自带的性能压力测试工具mysqlslap详解
PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...
- Linux命令参数处理 shell脚本函数getopts
getopts 命令 用途 处理命令行参数,并校验有效选项. 语法 getopts 选项字符串 名称 [ 参数 ...] 描述 getopts 的设计目标是在循环中运行,每次执行循环,getopts ...
- Linux Shell基础篇——变量
一.Shell中的变量 注:这里所说的Shell是Bash Shell,我姑且统称为Shell. Shell中的变量分为用户自定义变量.环境变量.位置参数变量.预定义变量.在Shell中,变量的默认类 ...
- 【PAT】1009. 说反话 (20)
1009. 说反话 (20) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其 ...
- docker部署Asp.net core应用
1 容器概念 使用Docker前我们首先要简单了解一下容器的概念.MSDN上有一张虚拟机和容器的对比图,很好的展示了虚拟机和容器的区别,如下所示,虚拟机包括应用程序.必需的库或二进制文件以及完整的来宾 ...