【HDU 6274】Master of sequence【二分答案+下取整转换】
题意:
给定长度为 nnn 的序列 aaa 与序列 bbb,mmm次操作,操作一共有三种类型。
· 1xy1 \ x \ y1 x y:令 ax=ya_x=yax=y
· 2xy2\ x\ y2 x y:令 bx=yb_x=ybx=y
· 3k3\ k3 k:询问 minminmin{t∣k≤S(t)t|k\leq S(t)t∣k≤S(t)},S(t)=∑i=1n⌊t−biai⌋S(t)=\sum\limits_{i=1}^{n}\lfloor\frac{t-b_i}{a_i} \rfloorS(t)=i=1∑n⌊ait−bi⌋
(1≤n≤105,1≤m≤104,1≤ai≤1000,1≤bi,k≤109)(1\leq n \leq 10^5,1\leq m \leq 10^4,1\leq a_i\leq 1000,1\leq b_i,k\leq 10^9)(1≤n≤105,1≤m≤104,1≤ai≤1000,1≤bi,k≤109)
思路:
看完题就可以发现,整道题最关键的地方就是如何处理下取整,而处理下取整问题通常都是转换成余数形式来进行求解,即⌊xy⌋=⌊k∗y+cy⌋,c=xmody\lfloor \frac{x}{y}\rfloor=\lfloor \frac{k*y+c}{y}\rfloor,c=x\ mod\ y⌊yx⌋=⌊yk∗y+c⌋,c=x mod y。
因此本题也可以进行简化,令t=k1∗ai+c1,bi=k2∗ai+c2t=k_1*a_i+c_1,b_i=k_2*a_i+c_2t=k1∗ai+c1,bi=k2∗ai+c2,因此⌊t−biai⌋=k1−k2+⌊c1−c2ai⌋\lfloor\frac{t-b_i}{a_i} \rfloor= k_1-k_2+\lfloor\frac{c_1-c_2}{a_i} \rfloor⌊ait−bi⌋=k1−k2+⌊aic1−c2⌋,因此若c1<c2c_1< c_2c1<c2,则⌊c1−c2ai⌋=−1\lfloor\frac{c_1-c_2}{a_i} \rfloor=-1⌊aic1−c2⌋=−1,否则为 000。
由于aaa的范围只有100010001000,因此我们可以对于每一个aiaiai,求出k2k_2k2的累加值,并且维护一个数组cntcntcnt,cnt[x][y]cnt[x][y]cnt[x][y] 表示ai=x,bia_i=x, b_iai=x,bi mod ai≤ya_i \leq yai≤y 的个数。然后二分 ttt,每次暴力计算前100010001000个 aia_iai 的贡献,即可完成此题。
每次更新a、ba、ba、b时,暴力维护 cntcntcnt 数组即可。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 1e5+100;
const int M = 1000+10;
const db EPS = 1e-9;
using namespace std;int n,a[N],m;
ll b[N],cnt[M][M],num[M],ctt[M];
//cnt[x][y]: 表示ai = x, bi%ai <= y 有多少个
//ctt[x]: 表示ai = x, bi/ai的累加
int main()
{int _; scanf("%d",&_);while(_--){memset(cnt,0,sizeof cnt);memset(num,0,sizeof num);memset(ctt,0,sizeof ctt);scanf("%d%d",&n,&m);rep(i,1,n){scanf("%d",&a[i]);num[a[i]]++;} rep(i,1,n){scanf("%lld",&b[i]);ctt[a[i]] += b[i]/a[i];rep(j,b[i]%a[i],a[i]-1) cnt[a[i]][j]++;} rep(i,1,m){int op,x; ll k,y;scanf("%d",&op);if(op == 1){scanf("%d%lld",&x,&y);ctt[a[x]] -= b[x]/a[x];ctt[y] += b[x]/y;num[a[x]]--, num[y]++;rep(j,b[x]%a[x],a[x]-1) cnt[a[x]][j]--;a[x] = y;rep(j,b[x]%a[x],a[x]-1) cnt[a[x]][j]++;}else if(op == 2){scanf("%d%lld",&x,&y);ctt[a[x]] -= b[x]/a[x];ctt[a[x]] += y/a[x];rep(j,b[x]%a[x],a[x]-1) cnt[a[x]][j]--;b[x] = y;rep(j,b[x]%a[x],a[x]-1) cnt[a[x]][j]++;}else{scanf("%lld",&k);ll l = 1, r = 1e12, ans;while(l <= r){ll mid = (l+r)>>1;ll tp = 0;rep(i,0,1000)if(num[i]){tp += (ll)(mid/i)*(ll)num[i]-(ll)ctt[i];tp -= (ll)cnt[i][i-1]-(ll)cnt[i][mid%i];}if(tp >= k) ans = mid, r = mid-1;else l = mid+1; }printf("%lld\n",ans);}}} return 0;
}
/*
2
4 6
2 4 6 8
1 3 5 7
1 2 3
2 3 3
3 15
1 3 8
3 90
3 66
8 5
2 4 8 3 1 3 6 24
2 2 39 28 85 25 98 35
3 67
3 28
3 73
3 724
3 7775
*/
【HDU 6274】Master of sequence【二分答案+下取整转换】相关推荐
- 为什么python除法结果会有小数点0_关于python:为什么整数除法会在许多脚本语言中向下取整?...
在我测试过的语言中,- (x div y )不等于-x div y: 我已经在Python中测试了//,在Ruby中测试了/,在Perl 6中测试了div: C具有类似的行为. 该行为通常是按照规范进 ...
- 又见n/i下取整+分块
链接:https://www.nowcoder.com/acm/contest/158/A 来源:牛客网 因数个数和 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...
- math的向上取整_Javascript中Math常用操作,向上取整、向下取整、四舍五入
写在前面,最最常用几个方法: 绝对值:Math.abs(x) 最大值:Math.max([x[, y[, -]]]) 最小值:Math.min([x[, y[, -]]]) 随机值:Math.rand ...
- 【python】向上取整 向下取整
python向上取整 向下取整 向上取整 ceil() 函数返回数字的向上取整整数,就是返回大于等于变量的最近的整数. ceil()是不能直接访问的,需要导入 math 模块. import math ...
- 截断 四舍五入 进位php,PHP取整,四舍五入取整、向上取整、向下取整、小数截取 四舍五入是什么意思 四舍五入就是一个亿 excel数值四舍五...
PHP取整数函数常用的四种方法: 1.直接取整,舍弃小数,保留整数:intval(): 2.四舍五入取整:round(): 3.向上取整,有小数就加1:ceil(): 4.向下取整:floor(). ...
- Oracle四舍五入,向上取整,向下取整
用oracle sql对数字进行操作: 取上取整.向下取整.保留N位小数.四舍五入.数字格式化取整(向下取整): select floor(5.534) from dual; select trunc ...
- iOS 向下取整、向上取整、四舍五入
向上取整:float ceilf(float); double ceil(double); 向下取整:float floorf(float); double floor(double); 四舍五入:f ...
- 【学习笔记】关于正整数除法下取整和上取整的一些基本运算公式
您从来没有见过这么菜的东西对不对.没错我就是这么菜.实在对不起玷污了您的眼睛. OI 中经常遇到有关下取整和上取整的运算,这些公式手推很容易,但是对我这种菜鸡来说非常容易出错并且需要耗时,因此不如把他 ...
- python如何对人数向上取整_python中的向上取整向下取整以及四舍五入的方法
import math #向上取整 print "math.ceil---" print "math.ceil(2.3) => ", math.ceil( ...
- RAM的一个实例,向下取整
实现的一个具体算法实例 这个算法的功能是 在向下取整的意义上的除法 具体来说 对于任何一个非负整数c 和正整数d 我们都需要在做完除法之后 再实施向下取整 得到一个整数 那么这个输出 实际上也就是不超 ...
最新文章
- 孙剑亲自撰文:我在 Face++ 的这半年
- C/S框架-WebService部署图
- DOS 网络命令之 arp
- 130242014045 林承晖 第2次实验
- 2019 Vue开发指南:你都需要学点啥?
- dubbo单元测试调用_使用LocalTestServer对HTTP调用进行单元测试
- HTTP Status 500 - javax.servlet.ServletException: File [/head.jsp] not found
- python 双指针法_leetcode 11 题解:python3@ 官方题解_暴力法_双指针法
- 经纬度转换为平面坐标
- 【项目总结】订单性质识别
- C++中对字符串操作
- 全网首发:JDK绘制文字:一、绘制流程
- 【Java8 新特性 3】java8 supplier
- C/C++中使用PlaySound()播放音乐
- C++中的extern
- Summits poj3503
- 荷马史诗 csdn_拥有荷马·辛普森的创造力时如何学习网页设计
- SolidWorks2020每次新建零件图时提示默认模板无效的解决办法
- 港科夜闻|李嘉诚向香港科大等不同的院校捐款港币1.7亿元
- java 匿名类_浅谈Java的匿名类
热门文章
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- chrome失去响应问题
- apache高性能配置
- 2022 SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台
- html 边距等于父节点,css的百分比margin,padding为什么不是相对于父元素的?
- STC学习:振动声光报警器
- oracle切换实例启动,3.1 Oracle体系结构之实例启动与关闭
- linux下回收站在哪个文件夹,linux回收站在哪里
- Mysql之数据库与sql
- 中空格的asc码表_Excel怎么快速提取混合单元格中的中文、英文、数字?