关闭

xtu 1266 Parentheses 2017湘潭邀请赛G

140人阅读 评论(0) 收藏 举报
分类:



Parentheses

Bobo has a very long sequence divided into n consecutive groups. The i-th group consists of li copies of character ci where ci is either "(" or ")".

As the sequence may not be valid parentheses sequence, Bobo can change a character in the i-th group from "(" to ")" (and vice versa) with cost di. He would like to know the minimum cost to transform the sequence into a valid one.

Note:

  • An empty string is valid.
  • If S is valid, (S) is valid.
  • If U,V are valid, UV is valid.

Input

The input contains zero or more test cases and is terminated by end-of-file. For each test case:

The first line contains an integer n. The i-th of the following n lines contains li,ci,di.

  • 1n105
  • 1l1+l2++ln109
  • l1+l2++ln is even.
  • 1di109
  • The sum of n does not exceed 106.

Output

For each case, output an integer which denotes the result.

Sample Input

4
1 ( 1
1 ( 2
1 ( 3
1 ) 4
2
500000000 ) 1000000000
500000000 ( 1000000000

Sample Output

2
500000000000000000

Note

For the first sample, Bobo should change only the character in the second group.

For the second sample, Bobo should change half of characters in both groups.


http://www.dengwenhuo.cn/?id=455

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
#include <cmath>
using namespace std;
 
#define ll __int64
#define N 100005
struct p
{
    ll l,d;
    char c;
    bool operator < (const p&r)const
    {
        return d>r.d;
    }
} a[N];
 
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        priority_queue<p>q;
        ll ans=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%I64d %c %I64d",&a[i].l,&a[i].c,&a[i].d);
            if(a[i].c=='(')
            {
                ans+=a[i].l*a[i].d;
                a[i].d=-a[i].d;
            }
        }
        ll len=0;///已经确定了多少个左括号
        ll sum=0;///总长
        ll temp;///temp为需要的左括号
        for(int i=1; i<=n; i++)
        {
            sum+=a[i].l;
            q.push(p {a[i].l,a[i].d});
            ll temp=(sum+1)/2;
            if(len<temp)
            {
                temp=temp-len;
                while(!q.empty())
                {
                    p t=q.top();
                    q.pop();
                    if(t.l>=temp)
                    {
                        ans+=temp*t.d;
                        t.l-=temp;
                        len+=temp;
                        temp=0;
                        if(t.l!=0)
                            q.push(p {t.l,t.d});
                        break;
                    }
                    else
                    {
                        len+=t.l;
                        temp-=t.l;
                        ans+=t.l*t.d;
                    }
                }
                if(temp>0)
                {
                    ans+=(temp+1)/2*a[i].d;
                    if(temp/2)
                    q.push(p{temp/2,a[i].d});
                }
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50263次
    • 积分:2084
    • 等级:
    • 排名:第19165名
    • 原创:160篇
    • 转载:30篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论