ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Asia Regional Contest, Tokyo, 2014

2021-05-02 12:34:36  阅读:204  来源: 互联网

标签:前缀 Tokyo int Regional mid pos 括号 2014 变成


Asia Regional Contest, Tokyo, 2014–10–19

这场全程在行为艺术…

最签到的应该是B,写个表达式求值。

然后是A题,问题在于求一个01串变成另一个01串的最小步数(只能交换相邻的bit),数据范围巨小只有十几,一开始想直接逆序对数,wa了两发发现显然不对…想一下一般的情况怎么做…比如要把s串100110换成t串011010,第s的\(i\)个1/0一定是要到t串的第\(i\)个1/0,可以处理出一个\(to[i]\)表示这个位置的元素要换到哪里,如果\(s=t\),那\(to[]=\{1,2,3,4.\dots\}\),所以我们就考虑把to变成单调递增要几步,还是那个s,t,对应的\(to\)数组是\(\{2,1,4,3,5,6\}\),在to串中的一步交换,必然对应着to串中的一步交换(因为我们要换一定是换两个不同的元素),那这里就是求个to数组的逆序对数啦…

赛后看了别人的代码发现好像又搞麻烦了…

C题也是,我第一反应是把相交的区间用并查集合并起来,同时记录左右端点,没注意到\(N\)的范围只有1000,又整麻烦了…

之后是G题,给一个合法的括号序列,输入若干次翻转某个括号的操作,然后让你选一个最左边的括号把它翻转,使得括号序列依然合法。

我还在行为艺术(比如一开始读错了题面),读对题意之后,依然是想着把"("变成+1,")"变成-1,括号序列合法当且仅当所有前缀和非负,且总和是0(YY一下用栈模拟的操作),之后考虑修改。

  • 如果是"("变成")",那我们要挑一个-1变成+1,那这其实直接挑最左边的-1就行了(这只会让后面的前缀和都变大),这直接上个set维护一下每个+1/-1的位置
  • 如果是")"变成"(",意味着一个地方的-1变成+1(也就是加了个2),对应着后面一段的前缀和都会+2,现在要找一个位置\(p\)让它-2,同时要合法,也就是要让\([1,p],[1,p+1],\dots,[1,n]\)里所有的的前缀和都不小于2,于是可以考虑用一个线段树维护前缀和的区间最小值,这里直接暴力地二分找到位置\(p\):
int l=1,r=n,pos=n;
while(r>=l){
    int mid=(l+r)>>1;
    int t=query(1,1,n,mid,n);
    if(t>=2){
        pos=mid;
        r=mid-1;
    }else l=mid+1;
}
printf("%d\n",pos);
flip(pos);

(相比线段树上二分,多一个log)

未完待续

标签:前缀,Tokyo,int,Regional,mid,pos,括号,2014,变成
来源: https://www.cnblogs.com/yoshinow2001/p/14725508.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有