xtu 1266 Parentheses 2017湘潭邀请赛G



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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值