//Author: Lixiang
#include<stdio.h>
struct Anton_and_Polyhedrons{
char s[100];
void init(){
int ans=0,N;
scanf("%d",&N);
while(N--){
scanf("%s",s);
switch(s[0]){
case 'T':ans+=4;break;
case 'C':ans+=6;break;
case 'O':ans+=8;break;
case 'D':ans+=12;break;
case 'I':ans+=20;break;
}
}
printf("%d\n",ans);
}
}sol;
int main(){
sol.init();
return 0;
}
大水题
//Author: Lixiang
#include<stdio.h>
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
struct Anton_and_Classes{
int N,M,L,R,mal1,mir1,mal2,mir2;
void init(){
mal1=mal2=0;
mir1=mir2=1000000000;
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d%d",&L,&R);
mal1=max(mal1,L);
mir1=min(mir1,R);
}
scanf("%d",&M);
for(int i=1;i<=M;i++){
scanf("%d%d",&L,&R);
mal2=max(mal2,L);
mir2=min(mir2,R);
}
}
void work(){
int ans=max(mal1-mir2,mal2-mir1);
if(ans<0)ans=0;
printf("%d\n",ans);
}
}sol;
int main(){
sol.init();
sol.work();
return 0;
}
C-Anton and Fairy Tale
稍微计算一下就出来了
如果N<=M直接输出N
如果N>M,找最大的X使得
x(x−1)2<N−M
答案就是X+M
//Author: Lixiang
#include<stdio.h>
#include<math.h>
struct Anton_and_Classes{
long long N,M,T;
void init(){
scanf("%I64d%I64d",&N,&M);
}
void work(){
if(N<=M){
printf("%I64d\n",N);
return ;
}
T=N-M;
T=sqrt(2*T);
N-=M;
while(T*(T+1)<2*N)T++;
T+=M;
printf("%I64d\n",T);
}
}sol;
int main(){
sol.init();
sol.work();
return 0;
}
D-Anton and School - 2
这题没做出来啊,厚颜无耻看了别人题解,搬运一下吧
题意:给出一个只有”(“和“)”的字符串,为有多少个子序列,它的长度为len,则左边len/2个字符为”(“右边len/2个字符为”)”,问这样的子序列有多少个。
前缀的后缀、 范德蒙恒等式
子串为 前缀的后缀,这里是子序列,所以s[i]为必取,作为序列的最后一个元素,然后前面的”(“为选取,
所以可以预处理出suml和sumr,分表表示i的左边有多少个”(“, i的右边有多少个”)”.
然后对于每个“(“,必选这一个”(“,然后i之前的(进行排列组合,选j个”(“,就在sumr[i+1]里选j个”)”。
所以就是
∑CjaCjb
类型的组合数,然后这里恰好有个叫做范德蒙恒等式的公式,
然后根据上面所描述的方法,每次i是必选的,然后进行排列组合。
ans += C(suml[i] + sumr[i+1], suml[i]) - C(suml[i] - 1 + sumr[i+1], suml[i] - 1) = C(suml[i] + sumr[i+1] - 1, sum[i]);
代码就先不放了,自己写完再放