xtu 1266 Parentheses 2017湘潭邀请赛G

来源:互联网 发布:淘宝个性化标签 算法 编辑:程序博客网 时间:2024/06/04 20:09



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

41 ( 11 ( 21 ( 31 ) 42500000000 ) 1000000000500000000 ( 1000000000

Sample Output

2500000000000000000

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 100005struct 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;}


原创粉丝点击