hdu5831 Rikka with Parenthesis II

http://acm.hdu.edu.cn/showproblem.php?pid=5831

又是迷之水题,你说不难吧,闷声发大财这是坠吼的,你说难吧,会不会有一种钦定的感觉

给出一个括号化序列问能不能通过一次必须的交换两个位置上的括号变成合法的。

显然先要用stack搞一搞,但是这里要求必须交换。于是分一下情况,一种是已经合法的,那么显然只要n>2一定依然可以合法,一种是不合法的,那么剩下的形式一定是.....))))((((....,于是)(,))((合法,其余不合法。

做的时候没有讨论全))((

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<stack>
#include<queue>
#include<set>
#include<sstream>
#include<map>
using namespace std;
#define For(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,k,n) for(int i=n;i>=k;i--)
#define Lson (u<<1)
#define Rson ((u<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define NEG(a) memset(a,-1,sizeof(a));
#define FILL(a) memset(a,0x3f,sizeof(a));
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+‘0‘;tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;}
#define printarr(i,a,f,b) {For(i,f,b) cout<<a[i]<<" "; printf("\n");}
#define ptf printf("fuck\n")
#define pt(a) cout<<a<<endl
#define flgprint(flg,a,b) {if(flg) printf("%s\n",a);else printf("%s\n",b);}
#define fp   freopen("in.txt","r",stdin)

#define maxn 200000
int num;
char c;
char buf[maxn];
int s[maxn],sz;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        sz=0;
        int flg=0;
        int n;
        scanf("%d",&n);
        getchar();
        gets(buf+1);
        int cnt=0;
        For(i,1,n)
        {
            c=buf[i];
            if(c==‘(‘) num=1;
            else num=0;
            if(sz>0&&s[sz-1]==1&&num==0)
            {
                sz--;
            }
            else
            {
                s[sz++]=num;
                if(num) cnt++;
            }
        }
        if(n-cnt!=cnt)
        {
            puts("No");
        }
        else if(sz==0)
        {
            if(flg||n>2)
            {
                puts("Yes");
            }
            else puts("No");
        }
        else if(sz==2)
        {
            int a=s[sz-1];
            int b=s[sz-2];
            if(a==1&&b==0) flg=1;
            if(flg==1)
            {
                puts("Yes");
            }
            else puts("No");
        }
        else if(sz==4)
        {
            int a=s[sz-1];
            int b=s[sz-2];
            int c=s[sz-3];
            int d=s[sz-4];
            if(a==1&&b==1&&c==0&&d==0) flg=1;
            if(flg==1)
            {
                puts("Yes");
            }
            else puts("No");
        }
        else puts("No");
    }
    return 0;
}

时间: 2024-10-11 07:44:10

hdu5831 Rikka with Parenthesis II的相关文章

hdu-5831 Rikka with Parenthesis II(贪心)

题目链接: Rikka with Parenthesis II Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to pr

HDU 5831 Rikka with Parenthesis II(六花与括号II)

HDU 5831 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Description 题目描述 As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math ta

HDU 5831 Rikka with Parenthesis II ——(括号匹配问题)

用一个temp变量,每次出现左括号,+1,右括号,-1:用ans来记录出现的最小的值,很显然最终temp不等于0或者ans比-2小都是不可以的.-2是可以的,因为:“))((”可以把最左边的和最右边的交换即可,其他-2的情形同理.另外要注意的坑点是Hint里面所说的:“But do nothing is not allowed.”.因此,“()”是不可以的,这个要特判. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #inc

hdu 5424 Rikka with Graph II 哈密顿通路

Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 367    Accepted Submission(s): 90 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situatio

hdu 5425 Rikka with Tree II(暴力)

题目链接:hdu 5425 Rikka with Tree II 直接枚举就好了,当概率极小时贡献值可以忽略. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N,

HDU 5424——Rikka with Graph II——————【哈密顿路径】

Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1051    Accepted Submission(s): 266 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situati

hihoCoder #1454 : Rikka with Tree II

Description 一个\(n\)个节点的树,先根遍历为\(1...n\).已知两个数组,一个数组表示是否是叶节点,另一个数组表示十分有右兄弟节点...'?'表示未知,求方案数\(n\leqslant 500\). Solution 区间DP. DFS序的一段表示一个子树. \(f[l][r][0/1]\)表示[l,r]变成几个子树,并不是一个...右边是否还能放的方案数... 为了方便我多写了一个函数A,他表示仅有一个子树的方案数.. Code #include <bits/stdc++.

hdu5424 Rikka with Graph II

给一个n个节点n条边的无向图G,试判断图中是否存在哈密顿路径. 若G中存在哈密顿路径l,则路径端点度数不小于1,其余点度数不小于2. 则G存在哈密顿路径的必要条件: 1)G连通: 2)G中度数为1的点不超过两个. 考虑到简单连通图中边的数目m不超过n, 1)若 m = n - 1,则可从任一度数为1的点搜索即可: 2)若 m = n,多余的一条边连接哈密顿路径上的两点,从任一度数为1的点搜索即可. 3)若不存在度数为1的点,从任一点开始搜索. 复杂度O(n). http://acm.hdu.ed

HDU5424——DFS——Rikka with Graph II

http://acm.hdu.edu.cn/showproblem.php?pid=5424 /* 对于一个连通图,有N个顶点,如果有N条边,那么肯定有环 因为N个点如果不成环最多N-1条边...然后找最小度的点DFS就行... */ /************************************************ * Author :Powatr * Created Time :2015-8-31 17:29:13 * File Name :HDU5424.cpp *****