题:http://codeforces.com/problemset/problem/18/D
对于每个顾客,若之前存在其要求的x,将其记录下来。然后将记录下来的x进行排序,取最大的,因为2^x>2^(x-1)+2^(x-2)+……
import java.math.*;
import java.util.*;
public class Main {
static class node
{
int x,l,r;
}
static class cmp implements Comparator<node>
{
public int compare(node a,node b)
{
return a.x-b.x;
}
}
static Boolean vis[]=new Boolean[5005];
static BigInteger a[]=new BigInteger[2005];
static node w[]=new node[5005];
static int f[]=new int[2005];
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
int i;
a[0]=BigInteger.valueOf(1);
a[1]=BigInteger.valueOf(2);
for(i=2;i<=2000;++i) a[i]=a[i-1].multiply(a[1]);
while(cin.hasNextInt())
{
int n=cin.nextInt(),x,t=0;
String s;
Arrays.fill(f,0);
Arrays.fill(vis, false);
for(i=1;i<=n;++i)
{
s=cin.next();
x=cin.nextInt();
if(s.equals("win")==true) f[x]=i;
else
{
if(f[x]!=0)
{
w[t]=new node();
w[t].x=x;
w[t].l=f[x];
w[t++].r=i;
}
}
}
Arrays.sort(w,0,t,new cmp());
BigInteger ans=BigInteger.valueOf(0);
for(i=t-1;i>=0;--i)
{
Boolean flag=true;
for(int j=w[i].l;j<=w[i].r;++j)
{
if(vis[j]==true){flag=false;break;}
}
if(flag==true)
{
for(int j=w[i].l;j<=w[i].r;++j)
vis[j]=true;
ans=ans.add(a[w[i].x]);
}
}
System.out.println(ans);
}
cin.close();
}
}