首页 > 其他分享 >【题解】[Ynoi2010] y-fast trie

【题解】[Ynoi2010] y-fast trie

时间:2023-03-08 09:45:12浏览次数:60  
标签:return Ynoi2010 题解 trie int && 匹配 最优 best

题目分析:

显然可以对于所有的 \(x\) 对 \(C\) 取模后处理。
那么就是两种情况:

  1. \(x + y \ge C\)
  2. \(x + y < C\)

对于第一种情况直接找最大的两个数就好了,关键就是第二种情况。
其实我们可以考虑,维护每一个数的最优匹配是什么。
这样的话插入操作就非常简单了,直接去匹配就好了,但是删除操作如果直接暴力删除的话可能会出现一次删除 \(O(n)\) 个,因为会有连锁反应。
当然,如果这个题不强制在线直接线段树分治就可以实现只有插入操作,但是它偏偏就是强制在线。
我们考虑对于 \(i\) 的最优匹配为 \(j\) 而 \(j\) 的最优匹配为 \(k\),那么 \((i,j)\) 一定是不优于 \((j,k)\) 的,这个应该很显然吧。
那么此时我们就不去维护 \((i,j)\) 了,因为不可能最优,所以就去维护 \((j,k)\) 也就是双向匹配才可能是最优解。
这样的话每次插入和删除都更改 \(O(1)\) 的匹配,复杂度就很对了。
代码加了注释,所以应该会好懂很多。

代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n,c,sz;
multiset<int> a,b;
multiset<int>::iterator it;
int best(int x,int op){   //找最优值 
	if(x==-1) return -1;
	it=a.upper_bound(c-1-x);   //找前驱 
	if(it==a.begin()) return -1;
	it--;
	if(op==1 && *it==x && a.count(x)==1)	return (it==a.begin())?-1:*--it;   //判掉最优值就是这个数的情况 
	else	return *it;
}
void insert(int x){
	sz++;
	if(sz==1){
		a.insert(x);
		return;
	}
	int y=best(x,0),z=best(y,1),w=best(z,1);
	if(y!=-1 && z<x){   //注意,此时找到的都是没有插入 x 的时候的值 
		if(z!=-1 && y==w) b.erase(b.find(y+z));
		b.insert(x+y);
	}
	a.insert(x);
}
void erase(int x){
	a.erase(a.find(x)),sz--;
	if(!sz) return;
	int y=best(x,0),z=best(y,1),w=best(z,1);
	if(y!=-1 && z<x){   //注意,此时找到的都是删除 x 的时候的值 
		if(z!=-1 && y==w) b.insert(y+z);
		b.erase(b.find(x+y));
	}
}
inline int query(){
	it=--a.end();
	return (*it+*--it)%c;
}
int main(){
	scanf("%d%d",&n,&c);
	int lst=0;
	while(n--){
		int op,x;
		scanf("%d%d",&op,&x); x^=lst;
		if(op==1) insert(x%c);
        else erase(x%c);
		if(sz<2) puts("EE"),lst=0;
		else printf("%d\n",lst=max(query(),b.empty()?0:*--b.end()));
	}
	return 0;
}

标签:return,Ynoi2010,题解,trie,int,&&,匹配,最优,best
From: https://www.cnblogs.com/linyihdfj/p/17190836.html

相关文章

  • 春测2023 T2题解
    这是一个从暴力到正解的过程。暴力从\(1\)枚举到\(\sqrtn\),枚举每一个\(x\),进行累乘,顺便用一个map数组判重,时间复杂度\(\mathcal{O}(\sqrtn\logn\logn)\),直接T飞......
  • Ubuntu服务器ssh缓慢问题解决
    Ubuntu服务器ssh缓慢问题解决现象:ssh登陆或su-账号时间较长 排查:1、查看了/var/log/syslog未发现明显报错2、查看/var/log/auth.log发现有pam_systemd:Failedtocreate......
  • AGC060C题解
    Link简要题意:称一个长为\(2^n-1\)的排列\(P\)像堆,如果\(P_i\ltP_{2i}\),且\(P_i\ltP_{2i+1}\)。给定\(a,b\),设\(u=2^a,v=2^{b+1}-1\),在所有像堆的排列中任取......
  • ABC279H 题解
    学考时候推的。场上记错模数,以为是\(998244353\)然后想了半天组合数怎么算)简单题。首先序列问题考虑每个位置的生成函数然后乘起来。位置\(k\)的生成函数显然是\[\s......
  • 指针8道笔试题解析
    笔试题1:intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return0;}//程序的结果是什么?第一......
  • P3574 [POI2014] FAR-FarmCraft 吐槽 + 题解
    洛谷上面的题解写的真的不太好,有很多错误,我来谈谈自己的理解。设\(f[i]\)表示以\(i\)为根节点的子树中(包括节点\(i\))的所有人安装好游戏所需要的时间(与下面的\(g[i]......
  • UVA-212 医院设备利用 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​这也是一道根据根据时间做出行为的题目,我的做法和之前的UVA822类似,也是用优先队......
  • UVA-442 矩阵链乘 题解答案代码 算法竞赛入门经典第二版GitHub - jzplp/aoapc-UVA-Ans
    GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版AC代码#include<iostream>#include<string>#include<stack>usingnamespacestd;struct......
  • UVA-210 并行程序模拟 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​注意:每次unlock后,只需要拿出一个在阻塞队列里面的程序放到等待队列的头部。因为......
  • UVA-822 客户中心模拟 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​AC代码这个题目的做法可能并不唯一,对于某些场景有不同的答案也能过。我的思路:是......