首页 > 其他分享 >[Ynoi2010] y-fast trie(multiset+思维)

[Ynoi2010] y-fast trie(multiset+思维)

时间:2023-08-03 22:14:27浏览次数:49  
标签:return Ynoi2010 res fast trie int num ans match

题目传送门

solution

妙妙题。

分成 \(a+b\geq C\) 和 \(a+b<C\) 讨论。

第一类是简单的,只需要选择最大和次大的数就行了。

第二类加入是容易的,但是有删除。

常规做法是线段树分治+\(multiset\),不能在线。

考虑一个性质:

如果对于 \(x\),小于等于 \(C-1-x\) 的最大的 \(y\) 记作 \(mat(x)\) 。

那么如果 \(mat(mat(x))\neq x\),则 \(mat(x)+mat(mat(x))\) 一定大于 \(x+mat(x)\) 。

换句话说,只有 "双向" 的匹配关系是有用的。

那么加入和删除一个数的时候,"双向"匹配的变化量显然是 \(O(1)\) 的,再用一个 \(multiset\) 维护所有双向匹配的值就好了。

复杂度 \(O(n\log n)\)

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+7;
multiset<int> num,ans;
int n,C;
int match(int x,int c)
{
	if(x==-1)return -1;
	auto it=num.upper_bound(C-1-x);
	if(it==num.begin())return -1;
	it--;
	if(c&&(*it)==x&&num.count(x)==1)
	{
		if(it==num.begin())return -1;
		return *(--it);
	}
	return *it;
}
void ins(int x)
{
	if(num.empty())
	{
		num.insert(x);
		return;
	}
	int y=match(x,0),z=match(y,1),w=match(z,1);
	if(y!=-1&&x>z) 
	{
		if(z!=-1&&y==w) ans.erase(ans.find(y+z));
		ans.insert(x+y); 
	}
	num.insert(x);
}
void del(int x)
{
	num.erase(num.find(x));
	if(num.empty())return;
	int y=match(x,0),z=match(y,1),w=match(z,1);
	if(y!=-1&&x>z) 
	{
		if(z!=-1&&y==w) ans.insert(y+z);
		ans.erase(ans.find(x+y)); 
	}
}
int query()
{
	int res=0;
	auto it=(--num.end());
	if(num.count(*it)>1) res=max(res,(*it)*2%C);
	else res=max(res,((*it)+(*--it))%C);
	if(!ans.empty())res=max(res,*(--ans.end()));
	return res; 
}
int main()
{
	cin>>n>>C;
	int lst=0;
	while(n--)
	{
		int op,x;
		scanf("%d %d",&op,&x);
		x=(x^lst)%C;
		if(op==1)ins(x%C);
		if(op==2)del(x%C);
		if(num.size()<2)
		{
			printf("EE\n");
			lst=0;
		}
		else printf("%d\n",lst=query()); 
	}
	return 0;
} 

标签:return,Ynoi2010,res,fast,trie,int,num,ans,match
From: https://www.cnblogs.com/jesoyizexry/p/17604591.html

相关文章

  • KMP与Trie
    KMP算法KMP算法用于解决字串与母串的匹配问题,可看作哈希的简单写法,时间复杂度O(m+n)KMP算法的核心优势在于相对于暴力枚举,它可以省去重复的步骤,从而将匹配过程由O(mn)优化为近似O(2m),该算法的核心在于寻找子串前缀与后缀重合的最大长度,也就是next数组,那么怎么求呢?就是将子串自匹......
  • flask初体验和fastapi初体验
    0.flask的介绍#python界的web框架 -Django:大而全,快速开发,公司内部项目-Flask:小而精,不具备web开发好多功能,丰富的第三方插件-FastApi:异步框架,主要为了做前后端分离接口-Sanic:异步框架,只支持python3.6及以上,性能比较高-Tornado:公司用的比较少。。。1.fl......
  • fastjson 1.2.80 漏洞浅析及利用payload
    0x01说明在fastjson的1.2.80版本中可以通过将依赖加入到java.lang.Exception期望类的子类中,绕过checkAuto。0x02简析{"@type":"java.lang.Exception","@type":"org.codehaus.groovy.control.CompilationFailedException","unit":{......
  • FastAPI初体验
    官网......
  • Wordpress:在Fastcomet中如何进行网站备份?
    使用Fastcomet平台搭建Wordpress网站后,为了安全,需要进行备份,如何操作呢?步骤如下:1.登陆Fastcomet后台后,点击网站后面的AccesscPanel,进入网站面板管理; 2.选择cPanel下的WPToolkit选项,点击Backup/Restore 3.侧边弹出的面板中,点击BackUp,底部会出现进度条,等待备份OK后,会......
  • fastapi 中文档显示空白
    原因:fastapiswaggerjscss都是写死在代码中的,他的正常传参修改地址不没有打开的,所以不能用正常的方式修改他的内置jscss路径:原始路径为:墙内很难打开解决方案:在生命app=FastAPI(....)之前粘贴下面代码,可以修改swaggerjscss引用路径fromfastapiimportapplications......
  • 【Java】使用fastjson进行序列化时出现空指针异常问题研究
    最近在使用fastjson的JSONObject.toJSONString()方法将bean对象转为字符串的时候报如下错误:com.alibaba.fastjson.JSONException:writejavaBeanerror,fastjsonversion1.2.58,classcom.sun.proxy.$Proxy395,fieldName:0 atcom.alibaba.fastjson.serializer.JavaBeanS......
  • 靳宇灵 | fastadmin目录结构
    FastAdmin所有应用插件都是存放在addons目录,一个插件一个目录,目录名必须和插件标识相同,且全部为小写,不允许出现大写或下划线等特殊符号。mydemo//插件标识├──application//此文件夹中所有文件会覆盖到根目录的/application文件夹├──assets//此文件夹中所有......
  • 靳宇灵 | fastadmin目录结构
    FastAdmin所有应用插件都是存放在addons目录,一个插件一个目录,目录名必须和插件标识相同,且全部为小写,不允许出现大写或下划线等特殊符号。mydemo//插件标识├──application  //此文件夹中所有文件会覆盖到根目录的/application文件夹├──assets    //此文件夹......
  • FastPrint开发日志
    2023.7.271.MEF插件框架   DirectoryCatalog扫描指定目录路径中的DLL文件时不能识别带'.'的DLL例如:ICSharpCode.TextEditor.dll2.关于System.Data.SQLite.dll 如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“AnyCPU” 但是Syste......