Description

【题目背景】
  小Q最近喜欢上了一款游戏,名为《舰队connection》,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao。在游戏中,不仅船只能力很重要,搭配合适的装备更是如虎添翼。小Q潜心研究配装三十年,终于——把装备凑齐了。
【题意描述】
  小Q有n艘船,m件装备。为了简单起见,我们假定每艘船都只能携带一件装备,且可以携带任何一件装备。每艘船和每件装备都有自己的能力值。船携带装备时,能力值为两者相乘。另外,小q还有可能对船或装备进行改修(强化)。改修成功会让能力提升,失败则会让能力降低。由于最佳配置已经用了无数次了毫无挑战性,因此,小Q并不打算直接使用最佳配置,而是使用相对弱一些的第k佳配置。具体来说,每次选择船只时,由于关卡限制,小Q需要在编号为L到R的船只中选择一艘,并在编号为a和b之间的装备选择一架,组成出击用的船只。于是,小Q总共有(R-L+1)*(b-a+1)种选择,小Q希望知道,所有这些选择中,第k大的能力值是多少。例如:
  船只:5 3 7
  装备:4 2 1 8 16
对于L=1,R=3,a=1,b=5,k=10的询问,将所有可能的能力值排序,分别为7*16=102,5*16=80,7*8=56,3*16=48,5*8=40,7*4=28,3*8=24,5*4=20,7*2=14,3*4=12,5*2=10,7*1=7,3*2=6,5*1=5,3*1=3,其中第10大的是12。对于L=2,R=3,a=2,b=4,k=5的询问,将所有可能的能力值排序,分别为7*8=56,3*8=24,7*2=16,7*1=7,3*2=6,3*1=3,其中第5大的是6。假定小Q改修了第二艘船使其能力值成功增加至4,并改修了第5件装备但由于失败使得它的能力值减小为9。现在,对于L=1,R=2,A=4,B=5,K=3的询问,所有可能的能力值分别为5*9=45,5*8=40,4*9=36,
4*8=32,其中第3大的是36。现在,你要编写一个程序回答这些问题。提示:由于游戏的特殊性,装备比船多得不知道到哪里去了,另外,作为一个人类,小Q才不会在一秒钟之内问几百万个问题让你回答,他只会问几百个,而且给你好几秒钟的时间回答。

Input

第一行两个数n,m,空格分隔,表示小Q的船的数量和装备的数量。
第二行n个数,空格分隔,表示小Q的船的能力值(按编号)。
第三行m个数,空格分隔,表示小Q的装备的能力值(按编号)。
第四行一个数q,表示小q的操作数量。
接下来q行,每行描述一个操作,操作要么为一个改修事件,要么为一个询问。
对于改修事件,该行4个数0,type,pos,val,type为0或1,0表示把pos号船改修成val的能力值
1表示把pos号装备改修成val的能力值。
对于询问操作,该行6个数1,L,R,a,b,k,空格分隔,表示一个询问。
n<=250,m<=100000,q<=100000,其中询问操作不会超过200。
对于100%的数据,1<=L<=R<=n,1<=a<=b<=m,1<=k<=(R-L+1)*(b-a+1)
任何时候船能力值为不超过2000的正整数,装备能力值为不超过1000000的正整数。

Output

对于每个询问操作,输出一行,包含一个数,表示询问的答案。
 
  话说我看到这题时限$100s$的时候简直惊呆了……这给人一种怎么搞都可以过的感觉啊……
  这道题由于询问特别少,修改较多,所以显然可以让询问的复杂度适量大一点。于是每次询问可以先二分一个答案$x$,然后判断大于$x$的方案有多少种即可。由于船的能力值范围很小,所以我们可以每次扫一遍$[l,r]$中的所有船,并且把能力值用一个前缀和数组存下来。然后枚举选哪一个装备,用前缀和数组算一下有多少艘船符合条件,就可以了。
  由于我二分上界设的比较大,好像跑得很慢TAT……其实好像是这样复杂度不太对……$100s$时限强行跑过去~
  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define N 310
#define M 100010
#define INF 2147483647 using namespace std;
typedef long long llg; int n,m,q,a[N],b[M];
int w[N<<2]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} int pd(int x,int l,int r){
int ans=0; x--;
for(int i=l;i<=r;i++) ans+=w[2000]-w[min(x/b[i],2000)];
return ans;
} int main(){
File("a");
n=getint(); m=getint();
for(int i=1;i<=n;i++) a[i]=getint();
for(int i=1;i<=m;i++) b[i]=getint();
q=getint();
while(q--){
int lcf=getint();
if(!lcf){
int ty=getint(),po=getint();
if(!ty) a[po]=getint();
else b[po]=getint();
}
else{
int L=getint(),R=getint(),ll=getint(),rr=getint(),k=getint();
int l=0,r=INF,mid;
for(int i=1;i<=2000;i++) w[i]=0;
for(int i=L;i<=R;i++) w[a[i]]++;
for(int i=1;i<=2000;i++) w[i]+=w[i-1];
while(l!=r){
mid=((llg)l+(llg)r+1LL)>>1;
if(pd(mid,ll,rr)<k) r=mid-1;
else l=mid;
}
printf("%d\n",l);
}
}
return 0;
}

BZOJ 4717 改装的更多相关文章

  1. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  2. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  3. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  4. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  5. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  6. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  7. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  8. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  9. bzoj 刷水

    bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. #include <iostream> #include <cst ...

随机推荐

  1. iOS Unicode和汉字互转

    //unicode转中文 NSString* strA = [@"%E4%B8%AD%E5%9B%BD"stringByReplacingPercentEscapesUsingEn ...

  2. C语言中的运算符

    1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...

  3. C阶段【02】 - 分支结构

    知识重点: BOOL布尔类型 关系运算符 逻辑运算符 if语句 枚举类型 switch语句 一.BOOL布尔类型 用来存储“真”或者“假”,变了只有YES和NO两个值.YES(1)表示表达式结果为真, ...

  4. iOS 申请测试用的远程推送证书

    进入member center创建一个App ID 注意下面证书名字的变化 将刚刚生成的两个证书下载下来,双击安装 安装完成后可以在钥匙串中查看 这样远程推送证书的申请流程就走完了

  5. 初识JavaScript,Ajax,jQuery,并比较三者关系

    一.基本认识 1.JavaScript 定义: javaScript的简写形式就是JS,是由Netscape公司开发的一种脚本语言,一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态 ...

  6. json官方学习档案

    项目经常用json开发,但说实话,对json了解的一直不深入.今天看了下json的官方资料,明了很多. json官方网址:http://www.json.org/json-zh.html JSON(J ...

  7. Hello BIEE

      这篇文章提供了一个Hello World式的例子,讲述如何创建一个最简单的BIEE资料库.本文使用的示例数据可以在从此链接下载:http://www.zw1840.com . 目录 创建资料库 创 ...

  8. [SqlServer]创建链接服务器

    把一个数据库中数据表中的内容,从一个SQL SERVER服务器 导出到另一个SQL Server服务器 不同服务器数据库之间的数据操作 --创建链接服务器  exec sp_addlinkedserv ...

  9. sqlyog不用密码登陆(强制取消)

    1.启用命令行.cd ../返回磁盘根目录.输入D: 进入D盘.dir可以显示所以文件夹. 2.在D盘找到mysql安装目录的bin文件夹 cd /xampp/mysql/bin 3.然后输入命令'm ...

  10. mkfifo

    管道是Linux的十种文件类型之一,使用管道通信本质上还是以文件作为通信的媒介 有名管道+无名管道=管道 有名管道(FIFO文件):就是 有文件名的管道, 可以用于任意两个进程间的通信 无名管道(pi ...