首页 > 其他分享 >CF1625E2. Cats on the Upgrade

CF1625E2. Cats on the Upgrade

时间:2024-11-09 10:19:44浏览次数:1  
标签:CF1625E2 Upgrade int sum t1 括号 Cats root bid

题目

题解

题目给了很重要的性质,就是保证询问的[l,r]是合法括号串(没有的话可能要莫队+二分找?)

假设给出的s串是合法括号序,按照树转括号序的方法逆向转成树,用左括号下标作为树上点的标号

例如 ()(()()) ,则有root-1, root-3, 3-4, 3-6,方法是维护左括号的栈,加入右括号时弹左括号t1,然后用上一个左括号t2向t1连边(无t2则用root连)

这样一个子树代表一个左右括号包起来的合法括号串,一段连续的兄弟代表一个合法括号串

记f[t]表示子树t内(不包括子树)的方案,则显然有 \(f_t=\frac{|son_t|(|son_t|+1)}{2}+\sum_{t_s \in son_t} f_{t_s}\),后者是儿子内的方案,前者补上新增的选整段儿子的方案

发现这个式子就是在点t处维护一个和儿子个数相关的量,然后对子树求和

类推一下,询问[l,r]就是求[l,r]对应那一段兄弟节点的f之和,以及 兄弟个数*(兄弟个数+1)/2
前者是对一些连续子树求和,式子与儿子个数相关,在dfs序上连续;后者是对连续兄弟求和,未删为1删为0,在bfs序上连续

所以建树,然后按dfs序和bfs序分别建线段树or树状数组,单点修改(修改父亲在\(tree_{dfs}\)和自己在\(tree_{bfs}\)的值)区间查询


当s串不是合法括号序时,①加右括号时先判栈是否为空 ②最后用root向栈剩下的左括号连边,这样就可以处理了

例如 ())(() ,连root-1,忽略位置3的右括号,4-5连边后4剩下,最后连root-4

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (int a=b; a<=c; a++)
#define fd(a,b,c) for (int a=b; a>=c; a--)
#define low(x) ((x)&-(x))
#define ll long long
//#define file
using namespace std;

const int N=3e5+10;
int n,Q,T;
vector<int> sont[N];
int sumson[N],fa[N];
int xid[N]; //xid[x]: t
int nodeR[N]; //nodeR[t]: x
int dbg[N],ded[N],dfsid; //t
int bid[N],bfsid; //t
char st[N];
vector<int> d;
int root;

struct tree{
	ll tr[N];
	int n;
	void change(int x,ll s)
	{
		while (x<=n) tr[x]+=s,x+=low(x);
	}
	ll Find(int t)
	{
		ll ans=0;
		if (t<=0) return 0;
		while (t) ans+=tr[t],t-=low(t);
		return ans;
	}
	ll find(int x,int y)
	{
		return Find(y)-Find(x-1);
	}
} trb,trd;

void New(int x,int y)
{
	sont[x].push_back(y);
	++sumson[x];
//	cout<<x<<" "<<y<<endl;
}

void buildtree()
{
	root=0;
	fo(i,1,n)
	if (st[i]=='(')
	d.push_back(i),xid[i]=i;
	else
	if (!d.empty())
	{
		int t=d.back();
		xid[i]=t;
		nodeR[t]=i;
		d.pop_back();
		int tfa=d.empty()?root:d.back();
		New(tfa,t);
	}
	for (auto t:d) New(root,t);
}

void dfs(int Fa,int t)
{
	dbg[t]=++dfsid;
	fa[t]=Fa;
	for (auto tson:sont[t]) dfs(t,tson);
	ded[t]=dfsid;
}
void bfs()
{
	deque<int> d;
	d.push_back(root);
	while (!d.empty())
	{
		int t=d.front();
		d.pop_front();
		bid[t]=++bfsid;
		for (auto tson:sont[t]) d.push_back(tson);
	}
}

void solve()
{
    scanf("%d%d",&n,&Q);
    scanf("%s",st+1);
    
    buildtree();
    dfs(0,root);
    bfs();
    trd.n=dfsid,trb.n=bfsid;
    fo(t,1,n)
    if (dbg[t])
    {
    	ll sum=sont[t].size();
    	trd.change(dbg[t],sum*(sum+1)/2);
    	trb.change(bid[t],1);
	}
    
    for (;Q;--Q)
    {
    	int tp,x,y,t1,t2;
    	ll ans=0,sum=0;
    	
    	scanf("%d%d%d",&tp,&x,&y);
    	t1=xid[x],t2=xid[y];
    	if (tp==1)
    	{
    		trd.change(dbg[fa[t1]],-sumson[fa[t1]]);
    		trb.change(bid[t1],-1);
    		--sumson[fa[t1]];
		}
		else
		{
			sum=trb.find(bid[t1],bid[t2]);
			ans=trd.find(dbg[t1],ded[t2])+sum*(sum+1)/2;
			printf("%lld\n",ans);
		}
	}
}

int main()
{
//	freopen("CF1625E.in","r",stdin);
	#ifdef file
	freopen("a.out","w",stdout);
	#endif

    T=1;
    //scanf("%d",&T);
    for (;T;--T) solve();

    return 0;
}

标签:CF1625E2,Upgrade,int,sum,t1,括号,Cats,root,bid
From: https://www.cnblogs.com/gmh77/p/18536398

相关文章

  • helm upgrade
    要更新Helm中的单个依赖Chart的版本,你可以按照以下步骤操作:1.**修改`Chart.yaml`或`requirements.yaml`文件**:在你的主Chart中,找到`Chart.yaml`或`requirements.yaml`文件(Helm3使用`Chart.yaml`,Helm2使用`requirements.yaml`),并修改其中依赖的版本号。......
  • centos7-kernel-upgrade-内核升级
    CentOS7升级内核版本yum安装参考1参考2参考3首先查看当前系统的内核版本uname-rs导入ELRepo仓库的公钥信息rpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org安装指令#RHEL-7,SL-7orCentOS-7yuminstallhttps://www.elrepo.org/elrepo-release-7.e......
  • autoupgrade升级(二)
    AnalyzeProcessingMode分析处理模式会检查您的数据库是否已准备好升级。仅从数据库读取数据,而不会对数据库执行任何更新。您可以在正常工作时间内使用分析模式运行AutoUpgrade。在源OracleDatabase主目录上以分析模式运行AutoUpgrade程序。使用以下语法在分析模式下......
  • autoupgrade升级(一)
    关于autoupgarde建议从MyOracleSupportDocument2485457.1下载最新版的autoupgrade.jar程序。每出一个版本RU(releaseupdate)都提供新的autoupgrade.jar程序。默认下载autoupgrade.jar到oracleHome,(Oracle_home/rdbms/admin)但是我没有,我是放到了/tmp下也可以只适用于EE企......
  • 关于ubuntu系统升级遇到的问题:upgrades to the development release are only.......
    主要问题在于使用的是命令:sudodo-release-upgrade-d这将会寻找最新的版本进行安装,但是如果最新版本不稳定的话请求会受到拒绝,导致更新无法进行。具体区别如下:do-release-upgrade是Ubuntu系统用于升级到新版本的命令。当你运行这个命令时,系统会检查是否有新版本可用,并且会自......
  • 揭秘Windows Anytime Upgrade的守护神:windowsanytimeupgradecpl.dll及缺失应对秘籍
    在Windows操作系统的世界里,有一个不为人知但至关重要的文件——windowsanytimeupgradecpl.dll。这个文件是WindowsAnytimeUpgrade功能的守护者,它负责管理和执行Windows版本的升级过程,确保用户能够顺利地从低版本升级到更高版本的Windows系统。WindowsAnytimeUpgrade的守......
  • spring mybatis upgrade to mybatisplus 实战小记
    我司压箱底儿的灵工服务商系统,系统框架是spring,持久层是mybatis。最近,将Mybatisplus集成到系统中,以提高开发效率。升级版本:mybatis版本3.2.2,升级到3.5.16Mybatisplus版本:3.5.3mybatis-spring版本1.2.0,升级到3.0.0pagehelper版本:5.3.1【注】mybatis官方提供了Myba......
  • flask db upgrade出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in
    Traceback(mostrecentcalllast):File"<frozenrunpy>",line198,in_run_module_as_mainFile"<frozenrunpy>",line88,in_run_codeFile"D:\pycharm_project\rag-api\api\.venv\Scripts\flask.exe\__main__......
  • SAP B1 Web Client & MS Teams App集成连载二:安装Install/升级Upgrade/卸载Uninstall
    一、安装/Install过程/Procedure:1.获取应用包并将其解压缩/Gettheapppackageandunzipit。导航到SAPBusinessOne产品包的以下文件夹:Packages.x64\MSTeamsIntegration\NavigatetothefollowingfolderintheSAPBusinessOneproductpackage:Packages.x64\MSTea......
  • Recovery Catalog Schema Upgrade Fails With ORA-02298 On Constraint ROUT_F3
    OracleDatabase-EnterpriseEdition-Version19.16.0.0.0andlaterRecoveryCatalogschemaupgradetoversion19.16 failsWithORA-02298onconstraintROUT_F3RMAN>upgradecatalogrecoverycatalogispartiallyupgradedto19.16.00.00errorcreatingu......