Codeforces Round #445 (Div. 1, based on Technocup 2018 Elimination Round 3) E. Mod Mod Mod

来源:互联网 发布:java中的接口有哪些 编辑:程序博客网 时间:2024/05/27 02:31

E. Mod Mod Mod
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given a sequence of integers a1, a2, …, an. Let , and for 1 ≤ i < n. Here, denotes the modulus operation. Find the maximum value of f(x, 1) over all nonnegative integers x.

Input
The first line contains a single integer n (1 ≤ n ≤ 200000) — the length of the sequence.

The second lines contains n integers a1, a2, …, an (1 ≤ ai ≤ 1013) — the elements of the sequence.

Output
Output a single integer — the maximum value of f(x, 1) over all nonnegative integers x.

Examples
input
2
10 5
output
13
input
5
5 4 3 2 1
output
6
input
4
5 10 5 10
output
16

题意:给出n个数,对于任意的x,第i为的贡献为x%num[1]%num[2],,,%num[i],问每一位的贡献和最大是多少。
做法:我就翻译一下题解好了
1:设ansi 代表第1位到第i位的贡献和,然后定义一个三元组,i,r,k.对于第i位当他取值范围是0,r时,可以用ansi=ax*i+k(0<=ax<=r)表示,那么对于每个三元组,可以往第i+1为传递两个三元组,(i,r,k)可以往后面传递两个(i+1,r%num[i+1],k+i*(r-r%mod))和(i+1,num[i+1]-1,k+i*(r-r%modnum[i+1]-num[i+1])),这两个三元组,原因么,因为第i为可以用这个三元组表示,那么对于这个三元组,当第i+1个数取值在0到r%num[i+1]时,第i个数可以取值为这个数加上r/mod*mod,这样是最优,而当大于等于r%num[i+1],就要再减去一个num[i+1]。原因自己模拟一下,这样最多有2^n中三元组,然后如果用dp[i][r]=k保存i,r状态下最大的k,这样最大的复杂度是n*n,因为对于第i为来说最多只会有i个r,假设第i为只有i个r,那么到第i+1位,最多只会多一个num[i+1]-1,因为对于大于等于num[i+1]的r,会被取余,小于的不会变。所以说每一位最多比前一位多1,所以是n*n的复杂度,然后还可优化一下,前面提到了,当从i转移到i+1的时候小于num[i+1]的r的dp值是可以保持不变的,因为通过上面那个式子可以发现是不会变大的,一个数最多经过log次取模比它小的数就会变成0,所以用map保存当前的r,然后每次找出比num[i]大的数,取模然后把这个数从map中拿掉,因为每个数最多会被拿出log次,所以复杂度是n*log(1e13)*log(n);

#include<bits/stdc++.h>#define ll long longusing namespace std;const int N = 2e5+100;map<ll,ll> mp;int n;ll num[N];int main(){    cin >> n;    for(int i = 1;i <= n;i ++) scanf("%lld",&num[i]);    mp[num[1]-1] = 0;    for(int i = 1;i <= n;i ++){        while(1){            auto it = mp.lower_bound(num[i]);            if(it == mp.end() || (*it).first < num[i]) break;            //cout <<(*it).first << endl;            ll a= (*it).first,b = (*it).second;            mp.erase(it);            ll nex = a%num[i];            mp[nex] = max(mp[nex],b+(i-1)*(a-a%num[i]));            mp[num[i]-1] = max(mp[num[i]-1],b+(i-1)*(a-a%num[i]-num[i]));        }    }    ll ans = 0;    for(auto it : mp){        ans = max(ans,it.first*n+it.second);        //cout <<it.first << ' '<< it.second<< endl;    }    cout << ans << endl;    return 0;}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 右侧附件囊状透明声可怎么办 刚刚出生小孩睾丸没有掉下来怎么办 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办 路由器我恢复出厂设置断网了怎么办 多囊卵巢综合症不来月经怎么办 天刀普通血战苍梧城没有太白怎么办 天涯明月刀把沈妄言打入水中怎么办 天涯明月刀刷本队友技能太花怎么办 手机收所有短信时显示被隐藏怎么办 div放图片多出的空白怎么办