Codeforces Round #482 (Div. 2)
D. Kuro and GCD and XOR and SUM
字典树真好玩。。。
牛老板提供的思路:建1e5个 字典树,每个数插入到以它的因子为根所在的字典树中,这样就实现了整除,当然gcd(k, x) = k是必须的
然后如何保证v + x <= s 和 v ^ x 最大呢?
对于v + x <= s,我们可以维护01字典树中,经过每个节点的最小值,这样我们在访问每个节点时,直接min + x <= s 判断是否成立即可, 不成立就不用往下走了,因为最小值都不成立。
对于v ^ x最大,就是一般字典树思路了,~x与字典树比较选相同的位走,并且同时判断不等式条件就可以啦。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
struct node
{
int next[];
int v;
};
node tree[maxn * ];
int root[maxn];
int sz = ;
void build(int p, int x)
{
if(!root[p]) root[p] = sz++;
int tmp = root[p];
for(int i = ; i >= ; i--)
{
int id = (x >> i) & ;
if(tree[tmp].next[id] == )
{
memset(tree[sz].next, , sizeof(tree[sz].next));
tree[sz].v = 1e6;
tree[tmp].next[id] = sz++;
}
tmp = tree[tmp].next[id];
tree[tmp].v = min(tree[tmp].v, x);
}
}
void match(int k, int s, int x)
{
int par = root[k];
if(par == )
{
printf("-1\n");
return;
}
int fx = ~x;
// printf("%d\n", ((fx >> 1) & 1));
int ans = ;
int flag = ;
for(int i = ; i >= ; i--)
{
int id = (fx >> i) & ;
if(tree[par].next[id] && (tree[tree[par].next[id]].v + x) <= s) ///维护最小值,表示最少存在这样的解
{
ans = tree[tree[par].next[id]].v;
par = tree[par].next[id];
}
else if(tree[par].next[ - id] && (tree[tree[par].next[ - id]].v + x) <= s)
{
ans = tree[tree[par].next[ - id]].v;
par = tree[par].next[ - id];
}
else
{
flag = ;
break;
}
}
if(flag || (!ans))
{
printf("-1\n");
}
else
{
printf("%d\n", ans);
}
}
int gcd(int a, int b)
{
return b == ? a : gcd(b, a % b);
}
int main()
{
memset(root, , sizeof(root));
int q; scanf("%d", &q);
while(q--)
{
int t;
scanf("%d", &t);
if(t == )
{
int u; scanf("%d", &u);
for(int i = ; i * i <= u; i++)
{
if(u % i == ) ///i是u的因子
{
build(i, u);
build(u / i, u);
}
}
}
else
{
int x, k, s;
scanf("%d %d %d", &x, &k, &s);
int g = gcd(k, x);
if(g != k)
{
printf("-1\n");
}
else
{
match(k, s, x);
}
}
}
}
Code
Codeforces Round #482 (Div. 2)的更多相关文章
- Codeforces Round #482 (Div. 2) : Kuro and GCD and XOR and SUM (寻找最大异或值)
题目链接:http://codeforces.com/contest/979/problem/D 参考大神博客:https://www.cnblogs.com/kickit/p/9046953.htm ...
- Codeforces Round #482 (Div. 2) :B - Treasure Hunt
题目链接:http://codeforces.com/contest/979/problem/B 解题心得: 这个题题意就是三个人玩游戏,每个人都有一个相同长度的字符串,一共有n轮游戏,每一轮三个人必 ...
- Codeforces Round #482 (Div. 2) B题
题目链接:http://codeforces.com/contest/979/problem/B B. Treasure Hunt time limit per test1 second memory ...
- Codeforces Round #482 (Div. 2) C 、 Kuro and Walking Route(dfs)979C
题目链接:http://codeforces.com/contest/979/problem/C 大致题意 给出n个点,有n-1个边将他们链接.给出x,y,当某一路径中出现x....y时,此路不通.路 ...
- Codeforces Round #482 (Div. 2) :C - Kuro and Walking Route
题目连接:http://codeforces.com/contest/979/problem/C 解题心得: 题意就是给你n个点,在点集中间有n-1条边(无重边),在行走的时候不能从x点走到y点,问你 ...
- 【Trie】【枚举约数】Codeforces Round #482 (Div. 2) D. Kuro and GCD and XOR and SUM
题意: 给你一个空的可重集,支持以下操作: 向其中塞进一个数x(不超过100000), 询问(x,K,s):如果K不能整除x,直接输出-1.否则,问你可重集中所有是K的倍数的数之中,小于等于s-x,并 ...
- 【枚举】【贪心】Codeforces Round #482 (Div. 2) B. Treasure Hunt
题意:给你3个字符串,3个人各对自己的字符串执行n轮操作,每一次选择一个字符变为任意一个和原来不同的字符.最后问你谁能使自己的串中的任意重复子串出现的次数最大化. 显然只需关注字符而非子串. 枚举每个 ...
- Codeforces Round #482 (Div. 2) B、Treasure Hunt(模拟+贪心)979B
题目 大致题意 n表示要进行n次操作,接着给出三个字符串,表示三个人初始拥有的串.每次操作要替换字符串中的字母,询问最后在游戏中曾出现过的相同的子串谁最多. 思路 (1) 讨论最多的子串,肯定是全部 ...
- Codeforces Round #482 (Div. 2) C Kuro and Walking Route
C. Kuro and Walking Route time limit per test 2 seconds memory limit per test 256 megabytes input st ...
随机推荐
- C#基础-数组-冒泡排序
冒泡排序基础 冒泡排序原理图分析 tmp在算法中起到数据交换的作用 int[] intNums = { 12,6,9,3,8,7 }; int tmp = intNums[0]; // 一共5次冒泡, ...
- Python头脑风暴4
IT是全国平均薪资最高的行业,2017年全国最高,人均13点4万每年. 但技术固然好,创业拼的还是世界观下的创意. 蘑菇街,并夕夕,TikTok,头条,哪个不是创意用IT技术的现实化?? 未来,大平台 ...
- supervisor 安装使用
简介 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管 ...
- R-barplot()
barplot这个函数啊...坑...度娘的很多解决方案都不对,只好重新看回manual再做测试== 本文参考的是: https://stat.ethz.ch/R-manual/R-devel/lib ...
- 【南邮】md5 collision write up
源码: <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'Q ...
- postgres 用户管理
首次安装完成 pg 数据库后,会默认自带一个用户, 用户名: postgres 密码: postgres 可以使用命令 \du 查看数据库用户 创建新用户: create user dev with ...
- Linux中TTY是什么意思
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备.tty是Teletype的缩写.Teletype是最早出现的一种终端 设备,很象电传打字机(或者说就是),是由Telety ...
- hashlib.md5加密
对一个字符串拼接时间,然后对其进行md5加密: import hashlib,time a='123absg' b=time.time() c='%s|%s'%(a,b) print(c) m=has ...
- Java多线程框架源码阅读之---ReentrantLock
ReentrantLock基于Sync内部类来完成锁.Sync有两个不同的子类NonfairSync和FairSync.Sync继承于AbstractQueuedSynchronizer. Reent ...
- JAVA调用oracle存储过程实例
1.创建添加存储过程 CREATEORREPLACEPROCEDURE stu_proc(v_id INNUMBER, v_name INVARCHAR2, v_age INNUMBER) AS BE ...