思路:ans=初始值+sigma(c[i]) 判定简单,二分出最大的初始值即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
int n,c[N],d[N];
bool check(int x)
{
for(int i=0;i<n;i++)
{
if(d[i]==1&&x<1900) return true;//当前rating太小
if(d[i]==2&&x>=1900) return false;
x+=c[i];
}
return true;
}
int main()
{
while(cin>>n)
{
int l=-1e9,r=1e9,mid,ans=INT_MIN;
for(int i=0;i<n;i++)
{
cin>>c[i]>>d[i];
}
//二分出初始的最大值
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
if(ans>=1e9)
puts("Infinity");
else
{
bool flag=true;
for(int i=0;i<n;i++)
{
if(d[i]==1&&ans<1900)
{
flag=false;
break;
}
if(d[i]==2&&ans>=1900)
{
flag=false;
break;
}
ans+=c[i];
}
if(flag==false)
puts("Impossible");
else
cout<<ans<<endl;
}
}
return 0;
}