题意:

给定长度为 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​⌊ai​t−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⌊ai​t−bi​​⌋=k1​−k2​+⌊ai​c1​−c2​​⌋,因此若c1&lt;c2c_1&lt; c_2c1​<c2​,则⌊c1−c2ai⌋=−1\lfloor\frac{c_1-c_2}{a_i} \rfloor=-1⌊ai​c1​−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【二分答案+下取整转换】相关推荐

  1. 为什么python除法结果会有小数点0_关于python:为什么整数除法会在许多脚本语言中向下取整?...

    在我测试过的语言中,- (x div y )不等于-x div y: 我已经在Python中测试了//,在Ruby中测试了/,在Perl 6中测试了div: C具有类似的行为. 该行为通常是按照规范进 ...

  2. 又见n/i下取整+分块

    链接:https://www.nowcoder.com/acm/contest/158/A 来源:牛客网 因数个数和 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  3. math的向上取整_Javascript中Math常用操作,向上取整、向下取整、四舍五入

    写在前面,最最常用几个方法: 绝对值:Math.abs(x) 最大值:Math.max([x[, y[, -]]]) 最小值:Math.min([x[, y[, -]]]) 随机值:Math.rand ...

  4. 【python】向上取整 向下取整

    python向上取整 向下取整 向上取整 ceil() 函数返回数字的向上取整整数,就是返回大于等于变量的最近的整数. ceil()是不能直接访问的,需要导入 math 模块. import math ...

  5. 截断 四舍五入 进位php,PHP取整,四舍五入取整、向上取整、向下取整、小数截取 四舍五入是什么意思 四舍五入就是一个亿 excel数值四舍五...

    PHP取整数函数常用的四种方法: 1.直接取整,舍弃小数,保留整数:intval(): 2.四舍五入取整:round(): 3.向上取整,有小数就加1:ceil(): 4.向下取整:floor(). ...

  6. Oracle四舍五入,向上取整,向下取整

    用oracle sql对数字进行操作: 取上取整.向下取整.保留N位小数.四舍五入.数字格式化取整(向下取整): select floor(5.534) from dual; select trunc ...

  7. iOS 向下取整、向上取整、四舍五入

    向上取整:float ceilf(float); double ceil(double); 向下取整:float floorf(float); double floor(double); 四舍五入:f ...

  8. 【学习笔记】关于正整数除法下取整和上取整的一些基本运算公式

    您从来没有见过这么菜的东西对不对.没错我就是这么菜.实在对不起玷污了您的眼睛. OI 中经常遇到有关下取整和上取整的运算,这些公式手推很容易,但是对我这种菜鸡来说非常容易出错并且需要耗时,因此不如把他 ...

  9. python如何对人数向上取整_python中的向上取整向下取整以及四舍五入的方法

    import math #向上取整 print "math.ceil---" print "math.ceil(2.3) => ", math.ceil( ...

  10. RAM的一个实例,向下取整

    实现的一个具体算法实例 这个算法的功能是 在向下取整的意义上的除法 具体来说 对于任何一个非负整数c 和正整数d 我们都需要在做完除法之后 再实施向下取整 得到一个整数 那么这个输出 实际上也就是不超 ...

最新文章

  1. 孙剑亲自撰文:我在 Face++ 的这半年
  2. C/S框架-WebService部署图
  3. DOS 网络命令之 arp
  4. 130242014045 林承晖 第2次实验
  5. 2019 Vue开发指南:你都需要学点啥?
  6. dubbo单元测试调用_使用LocalTestServer对HTTP调用进行单元测试
  7. HTTP Status 500 - javax.servlet.ServletException: File [/head.jsp] not found
  8. python 双指针法_leetcode 11 题解:python3@ 官方题解_暴力法_双指针法
  9. 经纬度转换为平面坐标
  10. 【项目总结】订单性质识别
  11. C++中对字符串操作
  12. 全网首发:JDK绘制文字:一、绘制流程
  13. 【Java8 新特性 3】java8 supplier
  14. C/C++中使用PlaySound()播放音乐
  15. C++中的extern
  16. Summits poj3503
  17. 荷马史诗 csdn_拥有荷马·辛普森的创造力时如何学习网页设计
  18. SolidWorks2020每次新建零件图时提示默认模板无效的解决办法
  19. 港科夜闻|李嘉诚向香港科大等不同的院校捐款港币1.7亿元
  20. java 匿名类_浅谈Java的匿名类

热门文章

  1. 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
  2. chrome失去响应问题
  3. apache高性能配置
  4. 2022 SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台
  5. html 边距等于父节点,css的百分比margin,padding为什么不是相对于父元素的?
  6. STC学习:振动声光报警器
  7. oracle切换实例启动,3.1 Oracle体系结构之实例启动与关闭
  8. linux下回收站在哪个文件夹,linux回收站在哪里
  9. Mysql之数据库与sql
  10. 中空格的asc码表_Excel怎么快速提取混合单元格中的中文、英文、数字?