ParenthesesBobo 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 " As the sequence may not be valid parentheses sequence, Bobo can change a character in the
i
-th group from " Note:
InputThe 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 .
OutputFor each case, output an integer which denotes the result. Sample Input4 1 ( 1 1 ( 2 1 ( 3 1 ) 4 2 500000000 ) 1000000000 500000000 ( 1000000000 Sample Output2 500000000000000000 NoteFor 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. |
#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;
}