隔了好几天,终于又开始写博客了,最近的题好难,改的都没时间写博客了!!!
今天打一个总结。(题解发链接,若有意者可以看一看)
赛前
又是日常晚20分钟起床,日常不吃早餐,这次到教室还有10分钟就开始了。(反正没人管 )
之后就随便水水题,比赛开始。
赛时
第一题
又是关于字符串,烦死!!!,自从转c++以后,面对字符串都是绕着走,什么读入,删啊,选啊,判断啊,不懂。也是最近才将快读搞懂,但是那函数真不会用。
所以第一题算是水题,爆0。
讲讲具体怎么爆0:
1.输出要求double保留两位小数。。。不会,之后问大佬,得到了这个:printf("%.2llf\n",b);本地正确,OJ错误
2.没审题,误认。
第二题
【中山市选2014】dwarf tower
算是一个树型dp,本来就没想ac,随后72.5。
第三题
【中山市选2014】J语言
又是字符串,无视。
正解太繁杂,不会。直接给题目看吧:
描述
J语言作为一门编程语言,诞生于20世纪90年代…
好学的小H今天又学到了一种新东西——J语言。显然,J语言的背景已经被小H忘得一干二净了,但是小H仍然记得J语言中有趣的数学计算——向量计算。
在J语言中,向量,标量和操作符是基本的组成元素,但是在小H的印象中,J语言中最有趣的就是它的语法,好学的小H也曾经认真研究J语言的语法并且进行了化简。在小H简化了J语言的语法中,用X来表示向量,用N来表示向量X的长度。
简化版J语言的规则如下:
操作符中有有二元操作符,“+”,“-”,“*”,而对应操作数可以是两个标量,两个向量,或则一个标量和一个向量。(当两个向量运算时,为对应位分别计算,例如(1,2,3) * (2,3,4) = (2,6,12),当一个标量和一个向量运算时,当成标量和向量的每一位运算,例如(1,2,3) * 5 = (5,10,15)
操作符中也有一元操作符,包括负数运算符“-”和平方运算符“:”,其操作数可以为标量和向量。(向量取平方运算符时表示为每一位都取平方,例如:(1, 2, 3) = (1, 4, 9),标量取平方时即数学意义上的平方,例如*:4 = 16)
求和运算符“+/”,该运算符只能作用于向量,能让向量求和为标量,例如+/(1,2,3) = 6
J操作符的运算顺序为从右到左,并且忽略优先级,需要优先计算的部分将用括号改变优先顺序(允许嵌套括号)。
小H化简的J语言还有一个限制——最高阶数的限制,我们这样定义一个表达数的阶数:
标量(数字, ‘N’ ,求和运算符“+/”的结果)的阶数为0
'X’的复杂度为1 ;
加减法的阶数是其操作数的阶数的最大值;
乘法的阶数是其操作数的阶数的总和;
一元平方的阶数是其操作数的阶数的两倍。
例如,表达式“(3-+/::X)-X**:X”的阶数是3 ,而它的子表达式“::X”的阶数是4 。
小H找到了一道以前写过简化版J语言的表达式,但是别忘了小H只是喜欢思考而不喜欢计算。现在,小H想请你帮他计算一下给定表达式的答案,并且将最终答案取模109(必须保证结果非负,即如果求余后是负数要加上109), 当然小H还清晰的记得他写下的表达式在运算过程中阶数不会超过10。
Input
第一行包含一个整数N,表示向量X的长度
第二行包含N个整数表示向量X的组成部分。
第三行表示待计算的表达式。
数据保证求和运算符不会使用在标量上,保证出现的数字不会超过10^9。
Output
输出一个整数,表示表达式的答案,结果取模10^9
Sample Input
Sample1
5
1 2 3 4 5
+/*:X
Sample2
5
1 2 3 4 5
N++/X-X+1
Sample3
3
11 56 37
+/(3-+/::X)-X**:X
Sample4
3
1 2 3
10++/X
Sample Output
Sample1
55
Sample2
0
Sample3
964602515
Sample4
16
Data Constraint
40%数据,n<=10
60%数据,n<=100,长度<=100
100%数据,n<=100000,长度<=100000
找到了一个好代码(不是本人的)
{$inline on}
{$M 1000000,0,maxlongint}//扩大系统栈,不会打人工的
const
maxn=1000000000;
type
arr=array[0..10] of int64;
var
now:int64;
s:ansistring;
s1,s2:string[1];
n,i,j,o,xi:longint;
sum:array[0..10] of int64;
p,last:array[0..10] of int64;
a,l,pre,zhan:array[0..100000] of int64;
function dg(l,r:longint):arr; inline;
var
k:longint;
wait:string[1];
begin
k:=r;
fillchar(dg,sizeof(dg),0);
if s[k]='X' then
begin
dg[1]:=1; dec(k);
end
else
if s[k]='N' then
begin
dg[0]:=n; dec(k);
end
else
if s[k]=')' then
begin
dg:=dg(pre[k]+1,k-1);
k:=pre[k]-1;
end
else
if (ord(s[k])>=48) and (ord(s[k])<=57) then
begin
now:=0; xi:=1;
while (k>0) and (ord(s[k])>=48) and (ord(s[k])<=57) do
begin
now:=now+(ord(s[k])-48)*xi;
xi:=xi*10; dec(k);
end;
dg[0]:=now;
end;//初始值
wait:='';
while k>=l do
begin
if s[k]='^' then
begin
fillchar(last,sizeof(last),0);
for i:=0 to 10 do
if dg[i]<>0 then
for j:=0 to 10 do
if dg[j]<>0 then
last[i+j]:=(last[i+j]+dg[i]*dg[j]) mod maxn;
dg:=last;
dec(k); continue;
end;
if s[k]='#' then
begin
now:=dg[0]*n;
for i:=1 to 10 do
now:=(now+sum[i]*dg[i]) mod maxn;
fillchar(dg,sizeof(dg),0);
dg[0]:=now;
dec(k); continue;
end;
if (s[k]='-') and not (s[k-1] in ['X','N',')','0'..'9']) then
begin
for i:=0 to 10 do
dg[i]:=-dg[i];
dec(k); continue;
end;//一元运算符
wait:=s[k];
dec(k);
fillchar(p,sizeof(p),0);
if s[k]='X' then
begin
p[1]:=1; dec(k);
end
else
if s[k]='N' then
begin
p[0]:=n; dec(k);
end
else
if s[k]=')' then
begin
p:=dg(pre[k]+1,k-1);
k:=pre[k]-1;
end
else
if (ord(s[k])>=48) and (ord(s[k])<=57) then
begin
now:=0; xi:=1;
while (k>0) and (ord(s[k])>=48) and (ord(s[k])<=57) do
begin
now:=now+(ord(s[k])-48)*xi;
xi:=xi*10; dec(k);
end;
p[0]:=now mod maxn;
end;
if wait='+' then
for i:=0 to 10 do
dg[i]:=(dg[i]+p[i]) mod maxn;
if wait='-' then
for i:=0 to 10 do
dg[i]:=(p[i]-dg[i]) mod maxn;
if wait='*' then
begin
fillchar(last,sizeof(last),0);
for i:=0 to 10 do
if dg[i]<>0 then
for j:=0 to 10 do
if p[j]<>0 then
last[i+j]:=(last[i+j]+dg[i]*p[j]) mod maxn;
dg:=last;
end;
wait:='';
end;
end;
begin
assign(input,'s.in');reset(input);
readln(n);
for i:=1 to n do
begin
read(a[i]); l[i]:=a[i];
end;
readln;
sum[0]:=1;
for i:=1 to 10 do
for j:=1 to n do
begin
sum[i]:=(sum[i]+l[j]) mod maxn;
l[j]:=l[j]*a[j] mod maxn;
end;
readln(s);
while (s[1]='(') and (s[length(s)]=')') do
begin
delete(s,1,1);
delete(s,length(s),1);
end;
o:=1; s1:='#';
while o<=length(s)-1 do
begin
if (s[o]='+') and (s[o+1]='/') then
begin
delete(s,o,2);
insert(s1,s,o);
end;
inc(o);
end;
o:=1; s2:='^';
while o<=length(s)-1 do
begin
if (s[o]='*') and (s[o+1]=':') then
begin
delete(s,o,2);
insert(s2,s,o);
end;
inc(o);
end;//替换符号长度为2的
for i:=length(s) downto 1 do //预处理括号位置
if s[i]=')' then
begin
inc(zhan[0]);
zhan[zhan[0]]:=i;
end
else
if s[i]='(' then
begin
pre[zhan[zhan[0]]]:=i;
dec(zhan[0]);
end;
last:=dg(1,length(s));
writeln((last[0]+maxn*10) mod maxn);
end.
第四题
中山市选2014】图
构造题,看不懂,放弃。
大佬:100+100+无+100=300
我:0+72.5+无+无=72.5