HDU 6274 Master of Sequence (暴力+下整除)
题意
两个1e5的数组a,b,定义\(S(t)=\left \lfloor \frac{t-b_i}{a_i} \right \rfloor\),有三个操作
1 x y:将\(a[x]\)变为\(y\)
2 x y:将\(b[x]\)变为\(y\)
3 x:求使得\(S(t)\geq k\)的最小\(k\)
其中\(a_i\leq 1000\),\(b_i,k\leq 1e9\)
思路
这题主要突破口在于\(a_i\leq 1000\)
我们先从下整除下手,
\(\left \lfloor \frac{t-b_i}{a_i} \right \rfloor=\left \lfloor \frac{k_1a_i+c_1-k_2a_i-c_2}{a_i} \right \rfloor=k_1-k_2+\left \lfloor \frac{c_1-c_2}{a_i} \right \rfloor\)
其中
\(c_1=t\bmod a_i\)
\(c_2=b_i \bmod a_i\)
\(k_1=t/ a_i\)
\(k_2=b_i/ a_i\)
\(\left \lfloor \frac{c_1-c_2}{a_i} \right \rfloor=\left\{\begin{matrix}
-1,c_1<c_2\\ 0,c_1\geq c_2
\end{matrix}\right.\)
那么
\(S(t)=ret+\sum_{i=1}^{1000}(\frac{t}{i}cnt[i]-f[i][t\bmod i+1])\)
其中
\(f[x][y]\)表示\(a_i=x\)时,\(y \leq c_2 \leq 1000\)的个数
\(cnt[x]\)表示\(a_i=x\)的个数,即\(f[x][0]\)
\(ret\)表示所有数\(k_2\)的和
这题就做完了。。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
const db eps = 1e-6;
const int mod = 998244353;
const int maxn = 2e6+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);
int n,m;
ll a[maxn],b[maxn];
ll f[1111][1111];
ll ret;
ll S(ll t){
ll ans = 0;
for(int i = 1; i <= 1000; i++){
ans+=t/i*f[i][0]-f[i][t%i+1];
}
return ans-ret;
}
int main() {
int T;
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%lld",&a[i]);
}
for(int i = 1; i <= n; i++){
scanf("%lld", &b[i]);
}
mem(f, 0);
ret = 0;
for(int i = 1; i <= n; i++){
ret+=b[i]/a[i];
f[a[i]][b[i]%a[i]]++;
}
for(int i = 1; i <= 1000; i++){
for(int j = i-1; j >= 0; j--){
f[i][j]+=f[i][j+1];
}
}
while(m--){
int op,x;
ll y;
scanf("%d",&op);
if(op<=2){
scanf("%d %lld", &x ,&y);
if(op==1){
ret-=b[x]/a[x];
ret+=b[x]/y;
for(int i = b[x]%a[x]; i >= 0; i--)f[a[x]][i]--;
for(int i = b[x]%y; i >= 0; i--)f[y][i]++;
a[x]=y;
}
else if(op==2){
ret-=b[x]/a[x];
ret+=y/a[x];
for(int i = b[x]%a[x]; i >= 0; i--)f[a[x]][i]--;
for(int i = y%a[x]; i >= 0; i--)f[a[x]][i]++;
b[x]=y;
}
}
else{
ll ans = 0;
scanf("%lld", &y);
ll l = 0,r = 1e13;
while(l<=r){
ll mid = l+r>>1;
if(S(mid)>=y){
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 (暴力+下整除)的更多相关文章
- HDU 5273 Dylans loves sequence 暴力递推
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5273 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- HDU 5063 Operation the Sequence(暴力)
HDU 5063 Operation the Sequence 题目链接 把操作存下来.因为仅仅有50个操作,所以每次把操作逆回去执行一遍,就能求出在原来的数列中的位置.输出就可以 代码: #incl ...
- HDU - 1711 A - Number Sequence(kmp
HDU - 1711 A - Number Sequence Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1 ...
- HDU 5783 Divide the Sequence(数列划分)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence
// 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...
- hdu 4893 Wow! Such Sequence!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- 2017ccpc 杭州Master of Sequence
Problem K. Master of SequenceTherearetwosequencesa1,a2,··· ,an, b1,b2,··· ,bn. LetS(t) =∑n i=1⌊t−bi ...
- HDU 2920 分块底数优化 暴力
其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...
- Master of Sequence
Master of Sequence 时间限制: 10 Sec 内存限制: 128 MB 题目描述 There are two sequences a1,a2,...,an , b1,b2,..., ...
随机推荐
- 傅立叶变换—FFT(cuda实现)
背景: 无意间看到cuda解决FFT有一个cufft函数库,大体查看了有关cufft有关知识,写了一个解决一维情况的cuda代码,据调查知道cufft在解决1D,2D,3D的情况时间复杂度都为O(nl ...
- Ant Design中根据用户交互展示不同的标签
Ant Design中根据用户交互展示不同的标签 Ant Design使用的是React框架,那么我们先看代码: <Fragment> <a onClick={() => th ...
- 变量键盘读取、数组与宣告:read,array,declare
1.read 2.declare/typeset 宣告变量的类型 3.数组(array)变量类型 4.与文件系统及程序的限制关系:ulimit 限制用户的某些系统资源,包括,可以开启的文件的数量,可以 ...
- 【转】Java Web Services面试问题集锦
Q. 应用集成方式有哪些? A. 应用可以采用以下方式集成: 1. 共享数据库 2. 批量文件传输 3. 远程过程调用(RPC) 4. 通过消息中间件来交换异步信息(MOM) Q. 应用集成可以采用的 ...
- VUE CLI环境搭建文档
VUE CLI环境搭建文档 1.安装Node.js 下载地址 https://nodejs.org/zh-cn/download/ 2.全局安装VUE CLI win+R键打开运行cmd窗口输入一下代 ...
- js最简单的编写地点
1. 在哪里? 在浏览器的控制台. 2. 有什么作用? 方便快捷的测试纯js代码语句. 3. 如何使用? Google浏览器为例: 按 F12键 打开 开发者工具 (或者 浏览器工具栏 => ...
- enum sizeof typedef分析
1.枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值是可以根据需要自定义的整型值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值的基础上加1 enum类型的变 ...
- 一文熟练使用python mock
mock作为python测试模拟对象工具,在单元测试当中使用较多,官方文档详细不够精简,这篇文章介绍mock常用的用法,以下为引用全文,留给自己和有需要的人查阅. https://realpython ...
- Python语言的configparser模块便捷的读取配置文件内容
配置文件是在写脚本过程中经常会用到的,所以读取配置文件的模块configparser也非常重要,但是很简单. 首先我们的配置文件内容为: 这样的配置文件,[]里面的内容叫section,[]下面的内容 ...
- Mysql.新建数据库和用户
//建立数据库 drop database if exists 你的db名; create database 你的db名 CHARACTER SET utf8 COLLATE utf8_general ...