首页 > 其他分享 >ABC 350F

ABC 350F

时间:2024-04-20 22:11:27浏览次数:19  
标签:rt ABC int ry son 500005 350F define

没有 push_down 调了 15 分钟,然后在赛后 7 分钟过的,中间看到E是期望题就去打舟了,哎,再也不摆了(期望能不能别再出现了)

翻转?这我熟,fhq 啊!然后大写变小写?简单,再 lazytag 搞一下就好了。时间复杂度 \(O(n \log n)\),带一个大常数,但是绰绰有余。

#include<bits/stdc++.h>
#define for1(i,a,b) for( int i=(a);i<=(b);i++)
#define for2(i,a,b) for( int i=(a);i<(b);i++)
#define for3(i,a,b) for( int i=(a);i>=(b);i--)
#define for4(i,a,b) for( int i=(a);i>(b);i--)
#define mx(a,b) max(a,b)
#define mn(a,b) min(a,b)
#define puba push_back
#define mem(a) memset((a),0,sizeof((a)))
#define int long long
using namespace std;
string s;
struct node{
   int rd;
   char val;
}p[500005];
int root,siz[500005],son[500005][2],la[500005],cnt=0,rx,ry,rz;
int stk[500005],top,pre[500005],nxt[500005];
void update(int rt){
	siz[rt]=siz[son[rt][0]]+siz[son[rt][1]]+1;
}
void change(char &x){
    if(x>='a'&&x<='z') x=x-'a'+'A';
    else x=x-'A'+'a';
}
void push_down(int rt){
    if(la[rt]){
        change(p[son[rt][0]].val);
        change(p[son[rt][1]].val);
        la[son[rt][0]]^=1;
        la[son[rt][1]]^=1;
        swap(son[rt][0],son[rt][1]);
        la[rt]=0;
    }
}
int add(char x){
	cnt++;
	siz[cnt]=1;
	p[cnt].val=x;
	p[cnt].rd=rand();
	return cnt;
}
void split(int rt,int siz1,int &x,int &y) {
	if(!rt){
		x=y=0;
		return;
	}
    push_down(rt);
    if(siz[son[rt][0]]>=siz1){
		y=rt;
		split(son[rt][0],siz1,x,son[rt][0]);
	}else{
		x=rt;
		split(son[rt][1],siz1-(siz[son[rt][0]]+1),son[rt][1],y);
	}
	update(rt);
}
int merge(int l,int r){
	if(!l||!r) return l+r;
    push_down(l);
    push_down(r);
	if(p[l].rd<p[r].rd){
		son[l][1]=merge(son[l][1],r);
		update(l);
		return l;
	}else{
		son[r][0]=merge(l,son[r][0]);
		update(r);
		return r;
	}
}
void dfs(int u){
    if(!u) return;
    push_down(u);
    dfs(son[u][0]);
    cout<<p[u].val;
    dfs(son[u][1]);
}
signed main(){
    srand(time(0));
    cin>>s;
    int len=s.size(),tot=0;
    for2(i,0,len){
        if(s[i]!='('&&s[i]!=')'){
            tot++;
            root=merge(root,add(s[i]));
        }
    }
    int st=tot+1;
    for3(i,len-1,0){
        if(s[i]!=')'&&s[i]!='(') st--;
        if(s[i]=='(') nxt[i]=st;
    }
    st=0;
    for2(i,0,len){
        if(s[i]!=')'&&s[i]!='(') st++;
        if(s[i]==')') pre[i]=st;
    }
    for2(i,0,len){
        if(s[i]=='('){
            top++;
            stk[top]=nxt[i];
        }if(s[i]==')'){
            int x=stk[top],y=pre[i];
            top--;
            split(root,x-1,rx,ry);
            split(ry,y-x+1,ry,rz);
            la[ry]^=1;
            change(p[ry].val);
            root=merge(merge(rx,ry),rz);
        }
    }
    dfs(root);
    
    
    return 0;
}

标签:rt,ABC,int,ry,son,500005,350F,define
From: https://www.cnblogs.com/wuhupai/p/18148277

相关文章

  • ABC350题解(E-G)
    E直接搜一下\(N\)的可能到达的值的个数,发现不多(大约\(10^4\)个),直接暴力dp(记忆化搜索)。转移式\(f_i=\max(X\log_{A}N,\dfrac{\sum\limits_{j=1}^6f_{i/j}}{6}+Y)\)。化简得到\(f_i=\max(X\log_{A}N,\dfrac{\left(\sum\limits_{j=2}^6f_{i/j}\right)+6Y}{5})\)。F文艺......
  • ABC 286 C - Rotate and Palindrome
    题目链接:注意到“您可以按任意顺序执行以下两种运算零次或多次”。因此,解决这个问题的一个重要观察点是,你可以假设\(A\)操作执行了几次,然后\(B\)操作执行了几次。你也可以假设\(A\)操作最多被执行\(N\)次(因为执行\(N\)次就会使它处于原始状态)有了这个观察结果,你就......
  • [题解]ABC209F Deforestation
    ABC209FDeforestation首先我们可以思考\(a_i\)和\(a_{i+1}\)先砍哪棵花费少。可以看出,当\(a[i]<a[i+1]\)时,先砍\(a[i+1]\),反之亦然。所以这个题转化成了:给定\(n-1\)个关系,分别表示\(n\)个值中相邻两个的大小关系,问满足这些关系的序列个数。与AtcoderEducationalDPContest......
  • ABC349F题解
    思想看到LCM想到质因数分解。首先,我们先把\(M\)质因数分解了,根号复杂度刚好1e8级别。然后我们发现一个很显然的性质:如果一个数不是\(M\)的因数那他肯定没用。所以此处我们就把不是因数地踢掉。我们惊奇地发现因为\(M\)的质因数分解最多\(13\)个不同的质数,然后我......
  • [ABC232G] Modulo Shortest Path (优化建图)
    链接:https://www.luogu.com.cn/problem/AT_abc232_g暴力的做法肯定不行,这道题要用到一个比较经典的拆点操作:把一个点拆成内点和外点。在接下来的分析中会慢慢介绍。由于题目每次连的边都是单向边,那要考虑的问题是:比如说现在要从1走到3,怎么走才能与暴力建边等价。先不考虑取模这......
  • 「杂题乱刷」AT_abc230_e
    链接(luogu)链接(at)典题。整除分块。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*/#include<bits/stdc++.h>usingnamespacestd;#definemapunordered_map#defineforl(i,a,b)for(registerlong......
  • [题解]ABC282E Choose Two and Eat One
    ABC282EChooseTwoandEatOne又一个图论的回顾——Kruskal最小(最大)生成树算法。看到\(n\)的范围只有\(500\),应该没有什么特别的算法。那么我们考虑建一个*\(n\)个顶点的完全图,节点\(x\)到节点\(y\)的边权值就是\(x^y+y^x\)。然后跑一遍最大生成树,得到的和就是最大结果了。如......
  • [ABC240E] Ranges on Tree 题解
    [ABC240E]RangesonTree题解思路解析由题意可知,只要一个点的所有儿子节点都被确定了,那么当前节点也就被确定了。也就是说,只要确定了所有叶子节点,也就能一层层地确定所有节点,而叶子节点没有儿子节点不受此条件的约束,同时我们希望\(\max\limits^N_{i=1}R_i\)最小,所以我们把所......
  • ABC240 复盘
    ABC240复盘[ABC240C]JumpingTakahashi思路解析显而易见,求是否可能,用可能性dp即可。code#include<bits/stdc++.h>usingnamespacestd;constintN=1e2+10,M=1e4+10;intn,x,a[N],b[N];boolf[N][M];intmain(){ cin>>n>>x; for(inti=1;i......
  • ABC191 复盘
    ABC191复盘[ABC191C]DigitalGraffiti思路解析求不规则图形的边数,根据题目可知多边形的内角只有\(90^\circ\)和\(270^\circ\),所以只需要从四个方向扫描一遍,求出每个方向上分别有几条边即可。code#include<bits/stdc++.h>usingnamespacestd;intn,m;charch[15][15......