【2017 Multi-University Training Contest - Team 2】Maximum Sequence
【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6047
【Description】
给你一个数列a和一个数列b;
只告诉你a的前n项各是什么;
然后让你求第出a的第n+1..2*n项;
这里a的第i项等于max(a[j]-j)这里j∈[b[k]..i-1];
(i>n)
且,每个b只能用来推一次a.
让你求出∑2∗nn+1ai的最大值
【Solution】
一开始的a数组,对于ai也直接减去i就好;
这样在推的时候,直接取区间的最值就可以了,省去了减去i的麻烦;
把b数组按从小到大的顺序排;
然后按顺序从左往右用每个b,推出a[n+1],a[n+2]…a[2*n]即可;
这里,b越小,推出来的a的值就越大;
为什么优先用b小的?
因为在较前面,就推出较大的a值;
这样减去的下标i,就会比较小;
这样,我们在推下一个a的时候,之前,肯定都是最大的情况了;
因为我们每个b都会用来推一次;
而b..n这一段的a是一定的;
那么,我们就应该尽量让n+1..i-1这一段的a值更大;
线段树维护区间最值+单点更新即可;
【NumberOf WA】
0
【Reviw】
【Code】
#include <bits/stdc++.h>
#define int long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = (int) 50e4;
const int INF = 0x3f3f3f3f;
int n,ma[(N<<2) +100],a[N+10],b[N+10];
void build(int l,int r,int rt){
if (l==r){
ma[rt] = a[l];
return;
}
int m = (l+r)>>1;
build(lson),build(rson);
ma[rt] = max(ma[rt<<1],ma[rt<<1|1]);
}
int get_max(int L,int R,int l,int r,int rt){
if (L <= l && r <= R)
return ma[rt];
int m = (l+r)>>1;
int temp1 = -INF,temp2 = -INF;
if (L <= m)
temp1 = get_max(L,R,lson);
if (m < R)
temp2 = get_max(L,R,rson);
return max(temp1,temp2);
}
void up_data(int pos,int num,int l,int r,int rt){
if (l==r){
ma[rt] = num;
return;
}
int m = (l+r)>>1;
if (pos <= m){
up_data(pos,num,lson);
}else
up_data(pos,num,rson);
ma[rt] = max(ma[rt<<1],ma[rt<<1|1]);
}
main(){
//freopen("F:\\rush.txt","r",stdin);
while (~scanf("%lld",&n)){
for (int i = 1;i <= n;i++){
scanf("%lld",&a[i]);
a[i] -= i;
}
for (int i = i+1;i <= 2*n;i++) a[i] = -INF;
for (int i = 1;i <= n;i++)
scanf("%lld",&b[i]);
sort(b+1,b+1+n);
build(1,2*n,1);
int sum = 0,MOD = (int) 1e9+7;
for (int i = n+1,j = 1;i <= 2*n;i++,j++){
int bk = b[j];
int ai = get_max(bk,i-1,1,2*n,1);
sum = (sum + ai)%MOD;
up_data(i,ai-i,1,2*n,1);
a[i] = ai-i;
}
printf("%lld\n",sum);
}
return 0;
}
【2017 Multi-University Training Contest - Team 2】Maximum Sequence的更多相关文章
- 【2017 Multi-University Training Contest - Team 2】TrickGCD
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...
- 【2017 Multi-University Training Contest - Team 2】 Regular polygon
[Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...
- 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
[Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Competition
[Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Subset
[Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Graph
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...
- 【2017 Multi-University Training Contest - Team 4】Time To Get Up
[Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...
- 【2017 Multi-University Training Contest - Team 4】Counting Divisors
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6069 [Description] 定义d(i)为数字i的因子个数; 求∑rld(ik) 其中l,r ...
- 【2017 Multi-University Training Contest - Team 3】RXD and math
[Link]: [Description] [Solution] 发现1010mod(109+7)=999999937; 猜测答案是nk 写个快速幂; 注意对底数先取模; [NumberOf WA] ...
随机推荐
- CMD和AMD的区别
CMD和AMD俩者之间的区别 AMD和CMD最大的区别是对依赖模块的执行时机处理不同 CMD和AMD都是CommonJS延伸而来的,CommonJS是随着node的出现而出现的,它是一个规范,用于定义 ...
- JAVA-截取字符串两边指定字符
工具类: /** * 工具类 */ public class Tool { /** * 截取两边指定的字符 * @param character * @param symbol * @return * ...
- Windows 10 计划带来颜文字和Sandbox
在最新的 Window 10 测试版 Build 18305 中,Windows 10 增加了对颜文字(kaomoji)的支持. Kaomoji 是由日本符号序列组成的面脸部表情的名称.虽然有些人,比 ...
- 紫书 例题 10-7 UVa 10820 (欧拉函数)
这道题要找二元组(x, y) 满足1 <= x, y <= n 且x与y互素 那么我就可以假设x < y, 设这时答案为f(n) 那么答案就为2 * f(n) +1(x与y反过来就乘 ...
- 【习题 8-17 UVA - 11536】Smallest Sub-Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2 ...
- 【Henu ACM Round#20 E】Star
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找规律. 1,13,37.... 6n(n-1) + 1 [代码] #include <bits/stdc++.h> # ...
- 【SRM 716 DIV 1 A】 ConstructLCS
Problem Statement A string S is a subsequence of a string T if we can obtain S from T by erasing som ...
- FOJ1205 小鼠迷宫问题 (BFD+递推)
FOJ1205 小鼠迷宫问题 (BFD+递推) 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均 ...
- 用react native 做的一个推酷client
用react native 做的一个推酷client 仅供大家參考.仅仅为抛砖引玉.希望大家能以此来了解react.并编写出很多其它的优质的开源库,为程序猿做出贡献. 用的的组件: Navigator ...
- Perl初学笔记
标量数据 标量:数字和字符串. 数字:Perl不存在整形,全部是double类型.整形常量会被自动转换为浮点型. Perl数字字面量(直接量):+-和小数点是非必须的,e代表10的多少次方.例如:-1 ...