求助

P1080 [NOIP2012 提高组] 国王游戏

@[かみじょ](/space/show?uid=126074) 这题要写高精
by 缥缈的鸿影 @ 2018-11-08 00:22:50


@[爱吃肉的瓶子](/space/show?uid=98606) 你没看清吧,用了,,,话说之前没用也是60
by かみじょ @ 2018-11-08 00:26:03


@[かみじょ](/space/show?uid=126074) ```cpp #include<stdio.h> #include<cstring> #include<string> #include<iostream> #include<vector> using namespace std; struct BigNum { static const int BASE=100000000; static const int WIDTH=8; vector<long long>s; BigNum(long long num=0){*this=num;} BigNum operator = (long long num){ s.clear(); do{ s.push_back(num%BASE); num/=BASE; } while(num>0); return *this; } BigNum operator = (const string& str){ s.clear(); int x,len=(str.length()-1)/WIDTH+1; for(int i=0;i<len;i++){ int end=str.length()-i*WIDTH; int start=max(0,end-WIDTH); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } BigNum operator + (const BigNum& b)const{ BigNum c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0&&i>=s.size()&&i>=b.s.size())break; int x=g; if(i<s.size())x+=s[i]; if(i<b.s.size())x+=b.s[i]; c.s.push_back(x%BASE); g=x/BASE; } return c; } bool operator < (const BigNum& b)const{ if(s.size()!=b.s.size())return s.size()<b.s.size(); for(int i=s.size()-1;i>=0;i--) if(s[i]!=b.s[i])return s[i]<b.s[i]; return false; } bool operator > (const BigNum& b)const{return b<*this;} bool operator <= (const BigNum& b)const{return !(b<*this);} bool operator >= (const BigNum& b)const{return !(*this<b);} bool operator != (const BigNum& b)const{return b<*this||*this<b;} bool operator == (const BigNum& b)const{return !(b<*this)&&!(*this<b);} void S(int a){ vector<long long>c; for(int i=0;i<s.size();++i){ if(c.size()<=i)c.push_back(s[i]*a);else c[i]+=s[i]*a; if(c[i]/BASE) if(c.size()<=i+1)c.push_back(c[i]/BASE);else c[i+1]=c[i]/BASE; c[i]%=BASE; } s=c; } void C(int a){ vector<long long>c(s); if(s.back()/a)c[s.size()-1]=s.back()/a,s[s.size()-1]%=a;else c.pop_back(); for(int i=s.size()-2;i>=0;--i){ long long num=s[i+1]*BASE+s[i]; c[i]=num/a; num%=a; s[i]=num; } s=c; } }; ostream& operator << (ostream &out,const BigNum& x){ out<<x.s.back(); for(int i=x.s.size()-2;i>=0;i--){ char buf[20]; sprintf(buf,"%08d",x.s[i]); for(int j=0;j<strlen(buf);j++)out<<buf[j]; } return out; } istream& operator >> (istream &in,BigNum& x){ string s; if(!(in>>s))return in; x=s; return in; } ``` 这是高精模板,拿去吧
by 缥缈的鸿影 @ 2018-11-08 00:26:52


@[かみじょ](/space/show?uid=126074) 我的AC代码: ```cpp #include<map> #include<cmath> #include<stack> #include<cstdio> #include<queue> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef unsigned long long ll; int n; struct BigNum { static const int BASE=100000000; static const int WIDTH=8; vector<long long>s; BigNum(long long num=0){*this=num;} BigNum operator = (long long num){ s.clear(); do{ s.push_back(num%BASE); num/=BASE; } while(num>0); return *this; } BigNum operator = (const string& str){ s.clear(); int x,len=(str.length()-1)/WIDTH+1; for(int i=0;i<len;i++){ int end=str.length()-i*WIDTH; int start=max(0,end-WIDTH); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } BigNum operator + (const BigNum& b)const{ BigNum c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0&&i>=s.size()&&i>=b.s.size())break; int x=g; if(i<s.size())x+=s[i]; if(i<b.s.size())x+=b.s[i]; c.s.push_back(x%BASE); g=x/BASE; } return c; } bool operator < (const BigNum& b)const{ if(s.size()!=b.s.size())return s.size()<b.s.size(); for(int i=s.size()-1;i>=0;i--) if(s[i]!=b.s[i])return s[i]<b.s[i]; return false; } bool operator > (const BigNum& b)const{return b<*this;} bool operator <= (const BigNum& b)const{return !(b<*this);} bool operator >= (const BigNum& b)const{return !(*this<b);} bool operator != (const BigNum& b)const{return b<*this||*this<b;} bool operator == (const BigNum& b)const{return !(b<*this)&&!(*this<b);} void S(int a){ vector<long long>c; for(int i=0;i<s.size();++i){ if(c.size()<=i)c.push_back(s[i]*a);else c[i]+=s[i]*a; if(c[i]/BASE) if(c.size()<=i+1)c.push_back(c[i]/BASE);else c[i+1]=c[i]/BASE; c[i]%=BASE; } s=c; } void C(int a){ vector<long long>c(s); if(s.back()/a)c[s.size()-1]=s.back()/a,s[s.size()-1]%=a;else c.pop_back(); for(int i=s.size()-2;i>=0;--i){ long long num=s[i+1]*BASE+s[i]; c[i]=num/a; num%=a; s[i]=num; } s=c; } }; ostream& operator << (ostream &out,const BigNum& x){ out<<x.s.back(); for(int i=x.s.size()-2;i>=0;i--){ char buf[20]; sprintf(buf,"%08d",x.s[i]); for(int j=0;j<strlen(buf);j++)out<<buf[j]; } return out; } istream& operator >> (istream &in,BigNum& x){ string s; if(!(in>>s))return in; x=s; return in; } BigNum ans,b[10005],sum,t; struct AC{ int l,r; }a[1005]; bool cmp(AC x,AC y){ return x.l*x.r<y.l*y.r; } int main(){ scanf("%lld",&n); scanf("%lld%lld",&a[0].l,&a[0].r); for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].l,&a[i].r); sort(a+1,a+1+n,cmp); sum=a[0].l; for(int i=1;i<=n;i++){ t=sum; sum.C(a[i].r); b[i]=sum; sum=t; if(b[i]>ans)ans=b[i]; sum.S(a[i].l); } cout<<ans<<endl; return 0; } ```
by 缥缈的鸿影 @ 2018-11-08 00:28:56


|