题目传送门

题意:

给定一个括号序列,随意交换两个位置的括号之后,问有多少个不同长度的圈。关于圈的定义大概就是:将括号序列的后$k$个数放到括号序列的最前面,就是长度为$k$的圈。(看了好久题意emmm...)

分析:

首先,我们可以$n^2$暴力枚举交换的位置,然后再看有多少个圈。

然后,对于括号序列的正确性判断,有一个非常巧妙的方法,(只适用于只有一种括号,既有小括号,又有中括号是不得行的):

给$"("$赋值为1,$")"$赋值为-1,计算这个序列的前缀和,只要保证前缀和的每一位都大于等于0,并且最后一位刚好等于0,这个序列就是正确的括号序列。

然后再枚举一个$k$,也就是圈的长度。要判断这个$k$成不成立,也就是要保证变换之后的前缀和每一个都要大于等于0。

根据数学课上老师的传授,这是一个恒成立问题,我们只需要让最小的那个数在变换之后大于等于0就可以了。

用一个前缀最小值和后缀最小值,$m1[k]$表示$1~k$的最小值,$m2[k]$表示$k~n$的最小值,在变换之后,如果$m1[k]+(a[n]-a[i])>=0$&&$m2[k+1]-a[i]>=0$,那么就符合条件。

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<map>
  6. #include<algorithm>
  7. using namespace std;
  8. #define N 505
  9. #define ll long long
  10. #define INF 0x3f3f3f3f
  11. int n,ans,l,r;
  12. char s[N];
  13. int a[N]/*前缀和*/,min1[N]/*前缀最小值*/,min2[N]/*后缀最小值*/;
  14. void swp(int i,int j)
  15. {
  16. char tmp=s[i];
  17. s[i]=s[j],s[j]=tmp;
  18. }
  19. int f()
  20. {
  21. int res=;
  22. for(int i=;i<=n;i++)
  23. {
  24. if(s[i]=='(') a[i]=a[i-]+;
  25. if(s[i]==')') a[i]=a[i-]-;
  26. min1[i]=min2[i]=INF;
  27. min1[i]=min(min1[i-],a[i]);
  28. }
  29. for(int i=n;i>=;i--)
  30. min2[i]=min(min2[i+],a[i]);
  31. if(min1[n]>=&&a[n]==) res++;//不进行轮换就已经是正确的序列
  32. for(int i=;i<n;i++)//从i和i+1之间断开
  33. if(min2[i+]-a[i]>=&&min1[i]+(a[n]-a[i])>=&&a[n]==)
  34. res++;
  35. return res;
  36. //程序一开始的时候就判断了a[n]!=0的情况 所以这里不写其实也可以
  37. }
  38. int main()
  39. {
  40. scanf("%d",&n);
  41. scanf("%s",s+);
  42. int cnt1=,cnt2=;
  43. for(int i=;i<=n;i++)
  44. {
  45. if(s[i]=='(') cnt1++;
  46. else cnt2++;
  47. }
  48. if(cnt1!=cnt2)
  49. {
  50. puts("0\n1 1");
  51. return ;
  52. }
  53. ans=f(),l=,r=;
  54. for(int i=;i<=n;i++)
  55. for(int j=i+;j<=n;j++)
  56. {
  57. if(s[i]==s[j]) continue;
  58. swp(i,j);
  59. int res=f();
  60. if(ans<res) ans=res,l=i,r=j;
  61. swp(i,j);
  62. }
  63. printf("%d\n%d %d\n",ans,l,r);
  64. return ;
  65. }

Code

CF The World Is Just a Programming Task (Easy Version)【分析·思维】的更多相关文章

  1. Codeforces Round #594 (Div. 1) D2. The World Is Just a Programming Task (Hard Version) 括号序列 思维

    D2. The World Is Just a Programming Task (Hard Version) This is a harder version of the problem. In ...

  2. [cf 1239 B] The World Is Just a Programming Task (Hard Version)

    题意: 给你一个长度为n的括号序列,你可以交换其中的两个元素,需要使该序列的n个循环移位中合法的括号序列个数尽量多. 输出最大的答案以及交换哪两个元素能够取到这个答案. $n\leq 3\times ...

  3. Codeforces 1239B. The World Is Just a Programming Task (Hard Version)

    传送门 这一题好妙啊 首先把括号序列转化成平面直角坐标系 $xOy$ 上的折线,初始时折线从坐标系原点 $(0,0)$ 出发 如果第 $i$ 个位置是 '(' 那么折线就往上走一步($y+1$),否则 ...

  4. CF #579 (Div. 3) D1.Remove the Substring (easy version)

    D1.Remove the Substring (easy version) time limit per test2 seconds memory limit per test256 megabyt ...

  5. 并不对劲的CF1239B&C&D Programming Task in the Train to Catowice City

    CF1239B The World Is Just a Programming Task 题目描述 定义一个括号序列s是优秀的,当且仅当它是以下几种情况的一种: 1.|s|=0 2.s='('+t+' ...

  6. codeforces#1248D2. The World Is Just a Programming Task(括号匹配转化为折线处理)

    题目链接: http://codeforces.com/contest/1248/problem/D2 题意: 可以执行一次字符交换的操作 使得操作后的字符串,循环移位并且成功匹配的方案最多 输出最多 ...

  7. Codeforces Round #594 (Div. 2) D1 - The World Is Just a Programming Task

    思路:枚举换的位置i,j 然后我们要先判断改序列能否完全匹配 如果可以 那我们就需要把差值最大的位置换过来 然后直接判断就行

  8. Codeforces Round #594 (Div. 2) D1 - The World Is Just a Programming Task (贪心)

    思路:枚举换的位置i,j 然后我们要先判断改序列能否完全匹配 如果可以 那我们就需要把差值最大的位置换过来 然后直接判断就行

  9. hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

    题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 最后的差确定,只需要计算和的种类 ...

随机推荐

  1. 前端面试题-CSS Hack

    一.CSS Hack的概念 由于不同厂商的流览器或某浏览器的不同版本(如IE,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中呈现出不一 ...

  2. 如何解决tab栏切换只发一次请求的问题

    用的antd的tab栏组件,发现切换tab栏只在componentDidMount里面发了一次请求,后来发现是缓存问题,于是用activeKey再次进行了判断,代码如下:

  3. SQL Server中一些不常见的查询

    把一些不常见但又会用到的SQL查询整理备份一下 --筛选出某个字段中包含中文的记录 SELECT * FROM temp WHERE W1 LIKE '%[吖-座]%' --筛选出某个字段在哪些表中存 ...

  4. Word:表格前添加新行 + 删除表格后的空行

    本文适用于Word 2007 + Windows 7,造冰箱的大熊猫@cnblogs 2018/8/3 近日新学(百度到)两条新Word操作,记录下来以备查询 1.在表格前添加新行 场景:有没有遇到过 ...

  5. UVa 1592 Database (map)

    题意:给出n行m列的数据库(数据范围: n 1~10000, m 1~10), 问你能不能找出两行r1, r2,使得这两行中的c1, c2列是一样的, 即(r1,c1)==(r2,c1) && ...

  6. javascript中的原型和原型链(一)

    原型和原型链是 JS 中不可避免需要碰到的知识点,本文使用图片思维导图的形式缕一缕原型.原型链.实例.构造函数等等概念之间的关系. Constructor 构造函数 首先我们先写一个构造函数 Pers ...

  7. 使用Qt Designer进行布局

    在使用Form之前,需要将Form上的对象放置到布局中.这确保在应用程序中预览或使用Form时,对象将正确显示.在布局中放置对象还可以确保在调整窗体大小时它们也能正确调整大小. 应用和打断布局    ...

  8. python模块turtle简单用法

    ##初始化turtle:t = turtle.Turtle() 或者 t = turtle.Pen()##查询turtle状态#位置t.position() #箭头朝向,箭头朝向按照顺时针或者逆时针偏 ...

  9. oracle判断一个字段为空

    比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...

  10. Feature Engineering and Feature Selection

    首先,弄清楚三个相似但是不同的任务: feature extraction and feature engineering: 将原始数据转换为特征,以适合建模. feature transformat ...