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 ...
随机推荐
- SDOI2010代码拍卖会 (计数类DP)
P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...
- 【NOIP2016提高A组8.11】种树
题目 分析 题目要求把图删点,删成树. 考虑一下树的定义,点数n=边数m+1 并且,树中点两两之间联通,那么选的点就不能是割点. 可以用tarjan将图中最大的联通块,保证其中点两两之间有不止一条路径 ...
- 【usaco 2013 open yinyang】阴阳
题目 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的道路 ...
- 【leetcode】1122. Relative Sort Array
题目如下: Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all elements in arr2 ar ...
- python-jsonpath、findall返回值提取
findall import re """ "d"表示取数字0-9, "D"表示不要数字, "w"在正则里面代 ...
- POST接口测试的请求方式
一.基础知识 1.HTTP的八种请求方法:GET, POST ,HEAD,OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法. GET请求:请求指定的页面信息,并返回实体 ...
- vue父组件更新,子组件也更新的方法
1.父组件 使用 Math.ramdom() 2.子组件获取 然后监听这个ramdom变化,处理子组件的更新
- css3中的过渡效果和动画效果
一.CSS3 过渡 (一).CSS3过渡简介 CSS3过渡是元素从一种样式逐渐改变为另一种的效果. 实现过渡效果的两个要件: 规定把效果添加到哪个 CSS 属性上 规定效果的时长 定义动画的规则 过渡 ...
- 一些性能优化的tips
工作中积累的一些性能优化的tips,记录一下: 1. Message的创建 Message message = Message.obtain(); // 推荐 Message message = n ...
- spring学习笔记之---IOC和DI
IOC和DI (一)IOC (1) 概念 IOC (Inverse of Control) 反转控制,就是将原本在程序中手动创建对象的控制权,交给spring框架管理.简单的说,就是创建对象控制权被反 ...