hdu3303
分析:一个最暴力的想法是把加入到集合S的数据一个个按顺序保存起来,然后每次查询的时候由后向前计算余数,如果遇到余数为0的,就直接把时间输出,否则就一直比较到最后找余数最小时间最晚的,这样查询的时间复杂度是n(当前S的元素个数)。
另一个想法就是利用x、y的数据范围,建线段树表示[1,500000]这个区间,用来更新和查询任意[a,b]区间的最小值。因为[m*y,(m + 1)y - 1]内每个数除y的余数都是唯一的,而且被除数越小余数就越小,所以我们可以查询每个小区间的最小值,再比较应该取哪个时间就可以了。查询的时间复杂度为(maxN/y)*lg(maxN),可见y越大查询时间越短。但y很小时,就要进行很多次对线段树的查询才能得出结果,所以当y很小时,应该用暴力的方法查询。
#pragma warning(disable:4996)
#include <cstdio>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
#include <map>
#define maxN 1000001
using namespace std;
int sum[maxN << ], data[maxN];
int stk[maxN], s;
//向上更新,rt是要更新的节点的下标
void pushUp(int rt){
int m = rt << ;
if (sum[m] != -){
sum[rt] = sum[m];
}
else{
sum[rt] = sum[m | ];
}
}
//初始化线段树
void initTree(int a, int b, int rt){
sum[rt] = -;
if (a == b){
return;
}
int m = rt << ;
initTree(a, (a + b) / , m);
initTree((a + b) / + , b, m | );
}
//更新节点
void update(int tgt, int time, int a, int b, int rt){
if (a == b){
sum[rt] = a;
data[a] = time;
return;
}
int m = rt << ;
if (tgt > (a + b) / ){//更新右子树
update(tgt, time, (a + b) / + , b, m | );
}
else{//更新左子树
update(tgt, time, a, (a + b) / , m);
}
pushUp(rt);
}
int query(int ta, int tb, int a, int b, int rt){
if (ta <= a && tb >= b || sum[rt] == -){
return sum[rt];
}
int ret = -, m = rt << ;
if (ta <= (a + b) / ){//查询左子树
ret = query(ta, tb, a, (a + b) / , m);
}
if (ret == - && tb > (a + b) / ){//查询右子树
ret = query(ta, tb, (a + b) / + , b, m | );
}
return ret;
}
int query(int x){
int ret = 0xfffffff, start = , end = x - ,rmdRet = x;
do{
int temp = query(start, end, , , );
int rmdTemp = temp % x;
if (temp != -){
if(rmdRet > rmdTemp){
rmdRet = rmdTemp;
ret = temp;
}
else if (rmdRet == rmdTemp && data[ret] < data[temp]){
ret = temp;
}
}
start = end + ;
end += x;
}while (end < );
if (ret == 0xfffffff){
return -;
}
else{
return data[ret];
}
}
int main(){
int t, x, time;
char op;
int caseNum = ;
while (scanf("%d", &t), t){
if (caseNum != ){
printf("\n");
}
printf("Case %d:\n", caseNum++);
initTree(, , );
s = ;
time = ;
for (int i = ; i <= t; i++){
scanf("%*c%c%d", &op, &x);
if (op == 'B'){
update(x, time++, , , );
stk[s++] = x;
}
else{
if (x > ){
printf("%d\n", query(x));
}
else{
int rmd = x,ans = -;
bool flag = false;
for (int i = s - ; i >= ; i--){
if (stk[i] % x == ){
printf("%d\n", i + );
flag = true;
break;
}
else if(stk[i] % x < rmd){
rmd = stk[i] % x;
ans = i + ;
}
}
if (!flag){
printf("%d\n", ans);
}
}
}
}
}
return ;
}
hdu3303的更多相关文章
- JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...
随机推荐
- mac更改本地mysql登陆密码
安装完mysql 之后,登陆以后,运行任何命令,提示 You must SET PASSWORD before executing this statement解决办法. step 1: SET PA ...
- 模拟 HDOJ 4552 Running Rabbits
题目传送门 /* 模拟:看懂题意,主要是碰壁后的转向,笔误2次 */ #include <cstdio> #include <algorithm> #include <c ...
- Windows平台下Oracle实例启动过程中日志输出
Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...
- checkbox全选和取消功能
这是开发中常见的小功能,想当初我也曾对于attr和prop的不了解踩过坑. 前端工作中,常常会使用到select复选框,select复选框有一个属性checked,当使用js或者jquery控制这个属 ...
- 关于dbms_output包的使用
General Source {ORACLE_HOME}/rdbms/admin/dbmsotpt.sql First Available 7.3.4 Data Types TYPE chararr ...
- SQL数据库——静态成员
静态: 1.普通成员普通成员都是属于对象的用对象调用 2.静态成员静态成员是属于类的用类名调用 stactic 静态关键字 静态方法里面不能包含普通成员普通方法里面可以包含静态成员 静态: 1.普通成 ...
- C#模拟百度登录并到指定网站评论回帖(三)
上次说到怎么获取BAIDUID,这个相信很多人都能够拿到就不多说了,今天一连说两个,获取token和raskey 2.利用以上获得的cookie直接访问页面 https://passport.baid ...
- php简易计算器
php循环结构 案例:php简易计算器 步骤: 1.先绘制这个表格 2.根据表单提交的sub属性判断一下,是否点击计算了 (GET方式提交的数据,通过地址栏传递的) 3.计算,并将结果输入到第二行 问 ...
- SQL SERVER 执行计划各字段注释
SET SHOWPLAN_ALL使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句.相反,SQL Server 返回有关语句执行方式和语句预计所需资源的详细信息. ...
- dutacm.club_1094_等差区间_(线段树)(RMQ算法)
1094: 等差区间 Time Limit:5000/3000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Total ...