首页 > 其他分享 >P6105 [Ynoi2010] y-fast trie

P6105 [Ynoi2010] y-fast trie

时间:2024-03-28 21:25:11浏览次数:26  
标签:return Ynoi2010 数对 trie int 匹配 P6105 best

[Ynoi2010] y-fast trie - 洛谷

  • 这道题让我学到了一些之前看过但没总结出来的 \(trick\)

  • 显然加入集合中数要先取模

  • 对于 \(x+y \geq C\) 的部分,直接取最大和次大即可

  • 对于 \(x + y < C\) 的部分,我们先考虑暴力枚举 \(x\),二分找到每一个 \(y\) 取最优即可

  • 若此题离线,考虑线段树分治,每次加入一个数时把这个数的最佳匹配取出来,对答案取 \(\max\),\(O(n \log^2 n)\)

  • 现在在线,对于最优化数对问题,通常是先弄出 \(O(n^2)\) 的解法,然后看数对中满足什么条件,使得 \((i,j)\) 一定比 \((j,k)\) 优,从而大量减少维护数对的次数

  • 对于此题,如果 \(i < k\),那我们可以只考虑 \((j,k)\) 这一数对

  • 因此数对最多有 \(O(n)\) 个,用 \(multiset\) 维护最优数对,时间 \(O(n \log n)\)

  • 不过代码坑点挺多的毕竟是 lxl 出的题

  • 首先要注意的是 \(multiset\) 删除的时候要先找到位置再删除,不然会都删了。s.erase(s.find(x));

  • void add(int x){
    	int y = best(x, 0), z = best(y, 1), w = best(z, 1);
    	
    	if(y >= 0 && x > z){
    		if(z >= 0 && y == w)
    			val.erase(val.find(y + z));
    		val.insert(x + y);
    	}
    	
    	a.insert(x);
    }
    
  • 然后当插入一个 \(x\) 的时候应该先找到 \(x\) 的匹配 \(y\) 再把 \(x\) 差进去,因为与 \(y\) 的匹配必然不能是不在数组中的数 \(x\)

  • 然后 \(add\) 函数中 \(w\) 的用途是判断是否有 \((y,z)\) 这一匹配,不然 \(z\) 偷偷和别人匹配了 \(y\) 还不知道呢

  • 其次就是因为我们先寻找匹配再插入 \(x\),就会出现是否要求重复这样的不同的需求,\(best\) 函数要处理一下

  • int best(int x, int opt){
    	if(x < 0)
    		return -1;
    		
    	auto it = a.lower_bound(mod - x);
    	
    	if(it == a.begin())// 如果没有
    		return -1; 
    	
    	-- it;
    	
    	if(opt && *it == x){// 如果是自身 
    		if(it == a.begin())// 如果前面没有了 
    			return -1;
    		
    		-- it;
    	}
    	
    	return *it;
    }
    
  • 做完题之后反思自己寻找 \(trick\) 的思维好像少了很多,不太会总结问题之前做的题都白做了,下次做完题之后应该更仔细的剖析一下而不是单纯记住表面

标签:return,Ynoi2010,数对,trie,int,匹配,P6105,best
From: https://www.cnblogs.com/fox-konata/p/18102641

相关文章

  • 蓝桥杯算法基础(29)字符串匹配(RabinKarp)(KMP)(前缀树,字典树,trie,后缀数组,高度数组)
     RabinKarpRabinKarpS:ABABABm个P:ABBn个1.朴素算法,挨个匹配2.哈希法hash->滚动哈希c0*31^2+c1*31^1+c2类似于进制的求法求hash值(c0*31+c1)*31+c2hash(p)=o(n)hash(s)=o(m*n)privatestaticvoidmatch(Stringp,Strings){longhash_p=hash(p);......
  • 【leetcode】【100268. 最长公共后缀查询】【Trie树】
    Howtoslovethisproblem?Ifwereversethestrings,theproblemchangestofindingthelongestcommonprefix.BuildaTrie,eachnodeisaletterandonlysavesthebestword’sindexineachnode,basedonthecriteria.code:classSolution{publ......
  • mysql 连接出现 Public Key Retrieval is not allowed
    在MySQL连接中出现“PublicKeyRetrievalisnotallowed”错误,通常是因为在使用安全套接字层(SSL)连接时遇到了问题。这是因为MySQL8.0及以上版本对安全性要求更高,特别是在使用密码插件如caching_sha2_password时,默认要求加密通信,并且不允许通过不安全的方式获取服务器的公钥。......
  • python requests.post Max retries exceeded with url 报错
    python requests.post  Maxretriesexceededwithurl 报错 importrequestsfromrequests.adaptersimportHTTPAdapterfromrequests.packages.urllib3.util.retryimportRetrysession=requests.Session()retries=Retry(total=5,backoff_factor=0.1,st......
  • 数据结构(六)串,Trie字符串统计---以题为例
    维护一个字符串集合,支持两种操作:Ix 向集合中插入一个字符串 x;Qx 询问一个字符串在集合中出现了多少次。共有 N 个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为......
  • Semantic Kernel 学习笔记:通过 Kernel Memory 初步体验 Retrieval Augmented Generati
    学习材料:QuickintrotoKernelMemory:install,uploadadoc,askaquestion创建控制台项目dotnetnewconsoledotnetaddpackageMicrosoft.KernelMemory.Core创建IKernelMemory实例varmemory=newKernelMemoryBuilder().WithOpenAIDefaults(OPENAI_API_KEY......
  • 01trie
    01Trie字符集为\(\{0,1\}\)的字典树Trie一般用于解决异或相关问题基本问题给定数集\(S\)和数\(x\),求\(\max\{x\oplusS_i\}\)。从高到低将集合\(S\)中的数插入Trie(注意高位要补齐)。从根节点开始,尽量选和\(x\)当前位不同的,计算答案。容易证明这一定是最大值......
  • C# Directory.GetFileSystemEntries(path) Directory.EnumerateFileSystemEntries(pat
    usingSystem;usingSystem.IO;staticvoidMain(string[]args){DirectoryDemo();}staticvoidDirectoryDemo(){stringpath="D:\\C\\ConsoleApp13";Console.WriteLine($"Directory.GetCurrentDirectory():{Director......
  • U329011 trie pi 题解
    花了2d打磨出来的题目,觉得很有意思。先讲点无关的,这道题有两版,但都是对要求的量进行改动。1.第一次要求的是y属性为a与y属性为b的两个节点的路径权值之和,对于要求的这个量,我们设v[i]为i到根节点的权值之和。那么我们先对a,b进行质因数分解,设dcg为a,b分解质因数后最长公共前缀的乘......
  • 可持久化trie
    可持久化trie考虑像主席树建树,然后可以处理trie的进阶问题最大异或和题目描述给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。有\(M\)个操作,有以下两种操作类型:Ax:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N\)加\(1\)。Qlrx:询问操作,你需要找到一个......