题面:

传送门

题目大意:

给定一个空集合,有两种操作:

一种是往集合中插入一个元素x,一种是给三个数x,k,s,问集合中是否存在v,使得gcd(x,v)%k==0,且x+v<=s若存在多个满足条件,则输出使得v⊕x最大的v。

分析:

首先,gcd(x,v)%k==0,由数论知识得该条件等价于x%k==0&&v%k==0

那么,我们怎么快速求出能整除k的v呢

对操作1输入的数x的每个因数,我们建立一个集合

s[i]存储能被i整除的所有x

且由于c++ STL的set的特性,集合内元素从小到大排列,我们可以快速求出x+v<=s的所有v,再从这些值中选出v⊕x最大的v即可

易错细节

1.在set中查找时我们要记得判断集合是否为空

2.注意upper_bound的返回值

3.集合中只有第一个数满足条件时的特判

因为我们是这样倒序遍历集合的 for(;it!=s[k].begin();it--)

所以当集合中只有第一个数满足条件时,it=s[k].begin(),会直接跳出循环

在循环结尾做一下特判就可以了

时间复杂度分析:

操作1时间复杂度O(nlog2n)" role="presentation" style="position: relative;">O(n−−√log2n)O(nlog2n)

操作2时间复杂度 O(log2n" role="presentation" style="position: relative;">O(log2nO(log2n

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#define maxn 100005
using namespace std;
set<int>s[maxn];
int n;
void div(int x){//分解因数,并将x插入每个因数对应的集合
int sq=(int)sqrt(x);
for(int i=1;i<=sq;i++){
if(x%i==0){
s[i].insert(x);
s[x/i].insert(x);
}
}
}
int get_ans(int x,int k,int maxs){
if(x%k!=0) return -1;
set<int>::iterator it;
if(s[k].empty()) return -1;//集合为空的特判
it=s[k].upper_bound(maxs-x);//查找x+v<=s的最大v (准确的说,是v的下标+1,因为upper_bound的返回值)
if(it==s[k].begin()) return -1;
it--;//由上知要-1
int ans=-1,sum=-1;
for(;it!=s[k].begin();it--){//从大到小找v⊕x最大的v
int v=*it;
if(sum>x+v) break;//因为v⊕x<=v+x
if(sum<(x^v)){
ans=v;
sum=x^v;
}
}
if(sum<(x^*it)) ans=*it;//只有第一个数满足条件时的特判
return ans;
}
int main(){
int cmd,x,k,s;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&cmd);
if(cmd==1){
scanf("%d",&x);
div(x);
}else{
scanf("%d %d %d",&x,&k,&s);
printf("%d\n",get_ans(x,k,s));
}
}
}

Codeforces 979D (STL set)(不用Trie简单AC)的更多相关文章

  1. 关于Trie KMP AC自动机

    个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...

  2. Codeforces 633C Spy Syndrome 2 | Trie树裸题

    Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...

  3. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  4. Educational Codeforces Round 128 (Rated for Div. 2) A-C+E

    Educational Codeforces Round 128 (Rated for Div. 2) A-C+E A 题目 https://codeforces.com/contest/1680/p ...

  5. Codeforces 997D(STL+排序)

    D. Divide by three, multiply by two time limit per test 1 second memory limit per test 256 megabytes ...

  6. 一个自己编写的简单AC自动机代码-----AC automata get √

    最近一直在优化项目中字符串匹配的问题,于是就想起了自动机,之前也看过一些文章,一直没有实现,现在项目中要用,然后又看了一些关于AC自动机的文章,这里实现了一个简单的AC自动机的小接口,我是实现自动机状 ...

  7. Codeforces 754A Lesha and array splitting(简单贪心)

    A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...

  8. Codeforces 888G Xor-MST - 分治 - 贪心 - Trie

    题目传送门 这是一条通往vjudge的高速公路 这是一条通往Codeforces的高速公路 题目大意 给定一个$n$阶完全图,每个点有一个权值$a_{i}$,边$(i, j)$的权值是$(a_{i}\ ...

  9. Codeforces 752C - Santa Claus and Robot - [简单思维题]

    题目链接:http://codeforces.com/problemset/problem/752/C time limit per test 2 seconds memory limit per t ...

随机推荐

  1. bzoj4025 二分图 LCT + 最小生成树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4025 题解 貌似这道题有一个非常简单的做法是线段树分治+并查集. 可是我是为了练 LCT 来做 ...

  2. vue单页面项目中解决安卓4.4版本不兼容的问题

    1.cnpm安装 cnpm i babel-polyfill --save cnpm i es6-promise --save 2.main.js引入 import ‘babel-polyfill‘ ...

  3. layui下拉框右边图标动画,不要动画

    /* 取消动画 / .layui-form-selected .layui-edge { margin-top: -3px; -webkit-transform: rotate(0deg); tran ...

  4. 使用Hybris Commerce User API读取用户信息时,电话字段没有返回

    在使用Hybris Commerce User API读取一个user信息时,我遇到一个问题,在API返回的结构里没有包含期望看到的Phone字段. 仔细观察Swagger里对response结构的说 ...

  5. echart--如何将echart的配置项,放到webpack中(CHARTTEMPLATE时)

    1.假如,我们已经写好了组件,我们需要把它放入到一个环境中去 2.首先在index.html中,我们需要写一个dom结构 3.新建一个,chart.js文件(这个里面放组件的代码) 1>开始创建 ...

  6. kafka broker

    在server.properties文件中配置: 1.broker.id kafka集群是由多个节点组成的,每个节点称为一个broker,中文翻译是代理.每个broker都有一个不同的brokerId ...

  7. STM32内部硬核的认识

    STM32内部含有硬核,对于一些协议(例如:UART,SPI,IIC,CRC等)我们只要调用硬核就可以了,同时我们也可以自己写通信协议. 这些硬核最终肯定是要有引脚输出的,这就是为什么STM32的引脚 ...

  8. Comet OJ - Contest #6 D. 另一道树题 并查集 + 思维 + 计数

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...

  9. Spring——IOC与Bean容器

    [IOC] (1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护.也就是说由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 (2)DI: ...

  10. 【BZOJ1563】诗人小G(决策单调性DP)

    题意:给定N,L,P,求f[N] sum[i]递增,L<=3e6,P<=10 思路:四边形不等式的证明见https://www.byvoid.com/zhs/blog/noi-2009-p ...