2018.9.28 正睿普及3
时间:(实际)
期望得分:100+100+100+...100?
实际得分:100+96+100+0
D这种模拟还是趁早放弃好
放代码自己体会
C题是搞笑的吧
过几天能交了再改
A
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e6+5;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
LL a=read(),b=read(),c=read();
if(a==1||b==1||c==1) return putchar('0'),0;
LL ans=2ll*a*b;
ans+=2ll*(b*c-b*2);
ans+=2ll*(a*c-c*2-std::max(0ll,a-2)*2);
printf("%lld
",a*b*c-ans);
return 0;
}
B
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
int opt[7];
LL a,b,c,d,Ans;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
void DFS(int x)//懒得换double怎么办
{// 1+ 2- 3* 4/
if(x>3)
{
LL res=0,tmp;
if(opt[1]==1||opt[1]==2)
{
if(opt[2]==1||opt[2]==2)
{
if(opt[3]==1||opt[3]==2)
res=a+(opt[1]==1?b:-b)+(opt[2]==1?c:-c)+(opt[3]==1?d:-d);
else
{
if(opt[3]==4 && c%d) return;
tmp=opt[3]==3?c*d:c/d;
res=a+(opt[1]==1?b:-b)+(opt[2]==1?tmp:-tmp);
}
}
else
{
if(opt[2]==4 && b%c)
{
if(opt[3]==3 && !(b*d%c)) Ans=std::min(Ans,std::abs(a+(opt[1]==1?1ll:-1ll)*b*d/c));
return;
}
tmp=opt[2]==3?b*c:b/c;
if(opt[3]==1||opt[3]==2)
tmp+=(opt[3]==1?d:-d);
else
{
if(opt[3]==4 && tmp%d) return;
tmp=(opt[3]==3?tmp*d:tmp/d);
}
res=opt[1]==1?a+tmp:a-tmp;
}
}
else//*/
{
if(opt[1]==4 && a%b)
{
if(opt[2]==3)
{//mmp
if(opt[3]==3)
if(!(a*c*d%b)) Ans=std::min(Ans,std::abs(a*c*d/b));
else return;
else if(opt[3]==4)
if(!(a*c%(b*d))) Ans=std::min(Ans,std::abs(a*c/b/d));
else return;
else if(!(a*c%b)) Ans=std::min(Ans,std::abs(a*c/b+(opt[3]==1?d:-d)));
else return;
}
else if(opt[2]==4)
{
if(opt[3]==3)
if(!(a*d%(b*c))) Ans=std::min(Ans,std::abs(a*d/b/c));
else return;
else return;
}
return;
}
tmp=opt[1]==3?a*b:a/b;
if(opt[2]==1||opt[2]==2)
{
if(opt[3]==1||opt[3]==2)
res=tmp+(opt[2]==1?c:-c)+(opt[3]==1?d:-d);
else
{
if(opt[3]==4 && c%d) return;
res=tmp+(opt[2]==1?(opt[3]==3?c*d:c/d):-(opt[3]==3?c*d:c/d));
}
}
else
{
if(opt[2]==4 && tmp%c)
{
if(opt[3]==3 && !(tmp*d%c)) Ans=std::min(Ans,std::abs(tmp*d/c));
else return;
return;
}
tmp=opt[2]==3?tmp*c:tmp/c;
if(opt[3]==1||opt[3]==2)
res=opt[3]==1?tmp+d:tmp-d;
else
{
if(opt[3]==4 && tmp%d) return;
res=opt[3]==3?tmp*d:tmp/d;
}
}
}
// printf("%d %d %d %I64d
",opt[1],opt[2],opt[3],res);
Ans=std::min(Ans,std::abs(res));
return;
}
for(int i=1; i<=4; ++i)
opt[x]=i, DFS(x+1);
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
a=read(),b=read(),c=read(),d=read();
Ans=std::abs(a+b+c+d), DFS(1), printf("%lld
",Ans);
return 0;
}
C
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int n,tot,dep[N],fa[N];
LL Ans;
std::vector<int> e[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AE(int u,int v)
{
e[u].push_back(v), e[v].push_back(u);
}
bool cmp(int x,int y)
{
return dep[x]<dep[y];
}
void DFS1(int x)
{
for(int i=0,l=e[x].size(),v; i<l; ++i)
if((v=e[x][i])!=fa[x])
fa[v]=x, dep[v]=dep[x]+1, DFS1(v);
}
void DFS2(int x)
{
static int Time=0;
Ans+=tot-Time, ++Time;
// std::sort(e[x].begin(),e[x].end(),cmp);
for(int i=0,l=e[x].size(),v; i<l; ++i)
if((v=e[x][i])!=fa[x]) DFS2(v), ++Time;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(), tot=2*n-2;
for(int i=1; i<n; ++i) AE(read(),read());
DFS1(1), DFS2(1);
printf("%lld
",Ans);
return 0;
}
D
考试代码
D
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e5+7;
int n;
char s[N];
int Nxt_Oct(int now,int &p)
{
if(now>n) {p=now; return 0;}
int nxt,res=0;
while(s[now]=='O')
{
nxt=now+1,res=0;
while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
now=nxt;
}
p=now;
return res;
}
void Nxt_Vol(int now,int &p,int &vol,int &ans)
{
int nxt=now+1,res=0,tmp=now;
while(s[now]=='V')
{
nxt=now+1,res=0;
while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
tmp=now, now=nxt;
}
p=now;
for(int i=now; i<=n; ++i)
if(isalpha(s[i]) && s[i]!='V' && s[i]!='O') {ans+=now-tmp; break;}
else if(i==n) p=n+1;
if(res!=vol) vol=res;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
while(scanf("%s",s+1),s[1]!='*')
{
n=strlen(s+1), s[n+1]='$';
int oct=4,real=4,vol=100;//volume
int ans=0,now=1;
for(; now<=n; )
{
// printf("n:%d now:%d oct:%d real:%d vol:%d ans:%d
",n,now,oct,real,vol,ans);
if(s[now]=='V')
{
int nxt=now+1,res=0,tmp=now;
while(s[now]=='V')
{
nxt=now+1,res=0;
while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
tmp=now, now=nxt;
}
if(nxt>n) break;
if(res!=vol) vol=res, ans+=nxt-tmp;
}
else if(s[now]=='O')
{
int nxt,res=oct;
while(s[now]=='O')
{
nxt=now+1,res=0;
while(nxt<=n && isdigit(s[nxt])) res=res*10+s[nxt]-'0', ++nxt;
now=nxt;
}
if(nxt>n) break;
if(std::abs(oct-res)>1)
{
if(res>oct) ans+=res-oct-1, oct=res-1;
else ans+=oct-res-1, oct=res+1;
}
real=res;
}
else if(real==oct)
{
if(now+1<=n && s[now]=='B' && s[now+1]=='+')
{
int nxt=now+2,tm=1;
while(nxt+1<=n && s[nxt]=='B' && s[nxt+1]=='+') nxt+=2, ++tm;
now=nxt;
if(tm==1)
{
if(s[now]!='O'&&s[now]!='V') ;//还有bug mmp
else if(s[now]!='O')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
}
if(s[now]=='O')
{
int tmp,nxtoct=Nxt_Oct(now,tmp);
now=tmp;
while(now<=n && s[now]=='V')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
if(s[now]=='O')
nxtoct=Nxt_Oct(now,tmp), now=tmp;
}
if(tmp>n) ans+=2;
else if(nxtoct>oct)
{
ans+=2, ++oct;
real=nxtoct;
if(std::abs(oct-real)>1)
{
if(real>oct) ans+=real-oct-1, oct=real-1;
else ans+=oct-real-1, oct=real+1;
}
}
else ans+=2;
}
else ans+=2;
}
else ans+=tm+1, ++oct;
}
else if(now+1<=n && s[now]=='C' && s[now+1]=='-')
{
int nxt=now+2,tm=1;
while(nxt+1<=n && s[nxt]=='C' && s[nxt+1]=='-') nxt+=2, ++tm;
now=nxt;
if(tm==1)
{
if(s[now]!='O'&&s[now]!='V') ;
else if(s[now]!='O')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
}
if(s[now]=='O')
{
int tmp,nxtoct=Nxt_Oct(now,tmp);
now=tmp;
while(now<=n && s[now]=='V')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
if(s[now]=='O')
nxtoct=Nxt_Oct(now,tmp), now=tmp;
}
if(tmp>n) ans+=2;
else if(nxtoct<oct)
{
ans+=2, --oct;
real=nxtoct;
if(std::abs(oct-real)>1)
{
if(real>oct) ans+=real-oct-1, oct=real-1;
else ans+=oct-real-1, oct=real+1;
}
}
else ans+=2;
now=tmp;
}
else ans+=2;
}
else ans+=tm+1, --oct;
}
else
{
while(now<=n && ((s[now]=='+'||s[now]=='-')||((s[now]!='V' && s[now]!='O' && (now==n||s[now]!='C'||s[now+1]!='-') && (now==n||s[now]!='B'||s[now+1]!='+')))))
// printf("Loop:%d %d %d
",ans,now,n),
++ans, ++now;
}
}
else if(real>oct)
{
int tm=0;
while(now+1<=n && s[now]=='C' && s[now+1]=='-')
++tm, now+=2;
ans+=tm;
if(s[now]!='O'&&s[now]!='V') ;
else if(s[now]!='O')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
}
if(s[now]=='O')
{
int tmp,nxtoct=Nxt_Oct(now,tmp);
if(tmp>n) ;
else// if(nxtoct<oct)
{
real=nxtoct;
if(std::abs(oct-real)>1)
{
if(real>oct) ans+=real-oct-1, oct=real-1;
else ans+=oct-real-1, oct=real+1;
}
}
now=tmp;
}
else if(now<=n) ++ans, ++oct;
}
else if(real<oct)
{
int tm=0;
while(now+1<=n && s[now]=='B' && s[now+1]=='+')
++tm, now+=2;
ans+=tm;
if(s[now]!='O'&&s[now]!='V') ;
else if(s[now]!='O')
{
Nxt_Vol(now,now,vol,ans);
if(now>n) now=n+1;
}
if(s[now]=='O')
{
int tmp,nxtoct=Nxt_Oct(now,tmp);
if(tmp>n) ;
else// if(nxtoct<oct)
{
real=nxtoct;
if(std::abs(oct-real)>1)
{
if(real>oct) ans+=real-oct-1, oct=real-1;
else ans+=oct-real-1, oct=real+1;
}
}
now=tmp;
}
else if(now<=n) ++ans, --oct;
}
}
printf("%d
",ans);
}
return 0;
}