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提出的事件流,即事件由页面元素 ...
随机推荐
- React实战之60s倒计时按钮(发送短信验证按钮)
React实战之60s倒计时按钮——短信验证按钮 导入:(antd组件——Form表单) import { Button, Form, Input } from 'antd'; const FormI ...
- deepin 安装maven
1.在官网 http://maven.apache.org/download.cgi 下载mvn包 2.新建mvn目录 mkdir /usr/local/mvn 把压缩包解压到mvn目录下面 修 ...
- Windows8.1查看已连接无线WIFI密码
Windows8.1操作系统下查看已连接无线wifi密码操作步骤如下: 1.右键任务栏中的无线图标,在弹出的菜单中选择"打开网络和共享中心": 2.在网络和共享中心界面中点击&qu ...
- Android 性能优化(5)网络优化 (1) Collecting Network Traffic Data 用Network Traffic tool :收集传输数据
Collecting Network Traffic Data 1.This lesson teaches you to Tag Network Requests 标记网络类型 Configure a ...
- checkbox全选和取消功能
这是开发中常见的小功能,想当初我也曾对于attr和prop的不了解踩过坑. 前端工作中,常常会使用到select复选框,select复选框有一个属性checked,当使用js或者jquery控制这个属 ...
- 设计模式("大话设计模式"读书笔记 C#实现)
前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式 ...
- 史上最大型广告欺诈活动Methbot:黑客是如何每天赚到500万美元的
根据国外安全专家的最新报告,有一群黑客正在对美国的知名企业和媒体机构进行广告欺诈活动,而这群黑客每天都可以从中赚取三百万到五百万美金. 是的,你没看错,这绝对是人类历史上最牛X的恶意广告欺诈活动!不过 ...
- (转)Eclipse在线配置Hibernate Tools
http://blog.csdn.net/yerenyuan_pku/article/details/52733403 查看Eclipse版本 Eclipse针对程序开发有很多发行版本,除了开发语言的 ...
- 在CorelDRAW中的自定义彩虹笔刷创建迷幻背景
在60年代的艺术形式中,迷幻艺术对设计和图形艺术的影响尤为重要.在下面这个CorelDRAW教程中我们主要使用图形纸工具和艺术笔工具创建一个迷幻风格的背景,在这之前我们需要先创建出一个彩虹笔刷. 1. ...
- C++写注册表
1. 注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...