Codeforces 979D (STL set)(不用Trie简单AC)
题面:
传送门
题目大意:
给定一个空集合,有两种操作:
一种是往集合中插入一个元素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)的更多相关文章
- 关于Trie KMP AC自动机
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...
- Codeforces 633C Spy Syndrome 2 | Trie树裸题
Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- 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 ...
- Codeforces 997D(STL+排序)
D. Divide by three, multiply by two time limit per test 1 second memory limit per test 256 megabytes ...
- 一个自己编写的简单AC自动机代码-----AC automata get √
最近一直在优化项目中字符串匹配的问题,于是就想起了自动机,之前也看过一些文章,一直没有实现,现在项目中要用,然后又看了一些关于AC自动机的文章,这里实现了一个简单的AC自动机的小接口,我是实现自动机状 ...
- Codeforces 754A Lesha and array splitting(简单贪心)
A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...
- Codeforces 888G Xor-MST - 分治 - 贪心 - Trie
题目传送门 这是一条通往vjudge的高速公路 这是一条通往Codeforces的高速公路 题目大意 给定一个$n$阶完全图,每个点有一个权值$a_{i}$,边$(i, j)$的权值是$(a_{i}\ ...
- Codeforces 752C - Santa Claus and Robot - [简单思维题]
题目链接:http://codeforces.com/problemset/problem/752/C time limit per test 2 seconds memory limit per t ...
随机推荐
- 日记(OI 无关,文化课无关)
2019.11.13 今天在研究 wss 的代码为什么比我快那么多. 看见他定义了一个结构体叫 thxorz,一定是因为 orz 了 thx 得到了信仰加成了. 然后刚说完这句话就看见 thx 走了进 ...
- Python中的网络扫描大杀器Scapy初探
Python中的网络扫描大杀器Scapy初探 最近经历了Twisted的打击,这个网络编程实在看不懂,都摸不透它的内在逻辑,看来网络编程不是那么好弄的.还好,看到了scapy,这种网络的大杀器 ...
- java -cp与java -jar的区别
java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”格式:java -cp .;myClass.j ...
- 【Luogu4221】[WC2018] 州区划分
题目链接 题目描述 略 Sol 一个州合法就是州内点形成的子图中 不存在欧拉回路(一个点也算欧拉回路). 这个东西显然就状压 dp 一下: 设 \(f[S]\) 表示当前考虑了 \(S\) 这个集合内 ...
- Apach Hadoop 与 CDH 区别
1.Apache Hadoop 不足之处 • 版本管理混乱 • 部署过程繁琐.升级过程复杂 • 兼容性差 • 安全性低 2.Hadoop 发行版 • Apache Hadoop • Cloudera’ ...
- LeetCode--128--最长连续序列(python)
给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, ...
- HTML和CSS实现图片翻转效果
实现图片翻转,首先来分析一下我们希望实现的是怎样的翻转效果?又该如何去实现呢? 一.希望实现的效果 页面上的图片在光标悬停在上面的时候会发生翻转效果,翻转过后显示出背面的说明文字. 鼠标没有悬停在上面 ...
- java 如何实现大文件上传下载(传输)各种格式
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- 为什么阿里巴巴要禁用Executors创建线程池?
作者:何甜甜在吗 juejin.im/post/5dc41c165188257bad4d9e69 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadP ...
- echarts曲线图
drawLeftLine(){ let drawLine = echarts.init(document.getElementById('data-left-middle-table-wrap')); ...