• codeforces 979D


    标签(空格分隔): Trie树


    题目链接

    http://codeforces.com/problemset/problem/979/D

    题意

    给定一个空集合,有两种操作:
    一种是往集合中插入一个元素,一种是给三个数(x,k,s),问集合中是否存在(v),使得(x mod k==0)(v mod k==0),若存在多个满足条件,则输出使得(voplus x)最大。

    分析

    首先如果没有整除条件的话,可以维护一个字典树就能解决。
    对于这个题我们可以建立(10^5)个字典树,编号分别为(1,2,3....),编号为(k)的字典树为例,我们只向其中插入(k)的倍数的元素。
    然后每次集合中加入新元素时,我们暴力的把它插入到它所有的因子的字典树中去。
    每个元素的因子可以在(O(nlog(n)))时间内预处理得到。

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    using namespace std;
    const int maxn=100050;
    struct Trie{
    	int ch[maxn*400][2];
    	int T[maxn],sz,val[maxn*400];
    	Trie(){
    	    sz=0;
    		for(int i = 1; i < maxn; ++i) T[i]=++sz;
    	}
    	void insert(int k,int x){
    		int u = T[k];
    		for(int i = 19; i >= 0; --i){
    			int c=(x>>i)&1;
    			if(!ch[u][c]) ch[u][c]=++sz,u=sz,val[u]=x;
    			else u=ch[u][c],val[u]=min(val[u],x);
    		}
    	}
    	int query(int x,int k,int s){
    		if(x%k) return -1;
    		int u=T[k];
    		for(int i = 19; i >= 0; --i){
    			int c=((x>>i)&1^1);
    			if(ch[u][c]&&val[ch[u][c]]<=s-x) u=ch[u][c];
    			else u=ch[u][c^1];
    		}
    		if(val[u]>s-x||val[u]==0) return -1;
    		return val[u];
    	}
    }T;
    vector<int> v[maxn];
    bool vis[maxn];
    int main(){
    	for(int i = 1; i < maxn; ++i){
    		for(int j = i; j < maxn; j+=i){
    			v[j].push_back(i);
    		}
    	}
    	int q;
    	scanf("%d", &q);
    	while(q--){
    		int t,x,k,s;
    		scanf("%d", &t);
    		if(t&1){
    			scanf("%d", &x);
    			if(vis[x]) continue;
    			for(auto c:v[x]) T.insert(c,x);
    		}
    		else{
    			scanf("%d%d%d", &x,&k,&s);
    			printf("%d
    ", T.query(x,k,s));
    		}
    	}
    }
    
    
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/sciorz/p/9069103.html
Copyright © 2020-2023  润新知