#include<iostream>#include<cstdio>#include<stdio.h>usingnamespace std ;longlong INF =1000000000000000;//设极限值longlong add[1001],x[1001],n ,m ,minn = INF ,maxx =0;//前缀和longlong max_f[101][101][11],min_f[101][101][11];//最大值状态转移,最小值状态转移intmain(){scanf("%lld%lld",&n ,&m);//初始化for(int i =1;i <=100;++i){for(int j =1;j <=100;++j){for(int z =1;z <=10;++z){
min_f[i][j][z]= INF ;//将min数组全部初始化为最大值}}}//计算前缀和for(int i =1;i <= n;++i){scanf("%lld",&x[i]);
add[i]+= add[i-1]+ x[i];//拆环为链操作,第一部分(1-n)}for(int i = n+1;i <=2* n;++i){
add[i]+= add[i-1]+ x[i-n];//第二部分(n+1 - 2*n)}for(int i =1;i <= n *2;++i){for(int j =1;j <= n *2;++j){//为了防止有负的模存在(-11 mod 10 = -1)加上一个极大值INF后取模
max_f[i][j][1]=(add[j]- add[i-1]+ INF)%10;
min_f[i][j][1]=(add[j]- add[i-1]+ INF)%10;}}for(int i =1;i <= n *2;++i){//从第i个数for(int j = i;j <= n *2;++j){//到第j个数for(int l =2;l <= m;++l){//分成第l段for(int k = i;k <= j-1;++k){//中间数的数量
max_f[i][j][l]=max(max_f[i][j][l], max_f[i][k][l-1]* max_f[k+1][j][1]);
min_f[i][j][l]=min(min_f[i][j][l], min_f[i][k][l-1]* min_f[k+1][j][1]);}}}}for(int i =1;i <= n;++i){
maxx =max(maxx , max_f[i][i + n -1][m]);//从这个数到循环1圈后的这个数之前的那个数之间
minn =min(minn , min_f[i][i + n -1][m]);}printf("%lld\n%lld", minn , maxx);return0;}
P3958 [NOIP2017 提高组] 奶酪
#include<iostream>#include<cstdio>#include<cmath>#include<stdio.h>usingnamespace std ;structPoint{double x ,y ,z ;}p[1010];doubledist(Point a , Point b){returnsqrt((a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y)+(a.z - b.z)*(a.z - b.z));}int fa[1010];intget(int x){return fa[x]== x ? x : fa[x]=get(fa[x]);}voidbuild(int a ,int b){if(get(a)!=get(b))
fa[get(a)]=get(b);}intmain(){int t ;scanf("%d",&t);while(t){--t ;int n ;double h ,r ;scanf("%d%lf%lf",&n ,&h ,&r);for(int i =1;i <= n;++i){double x ,y ,z ;scanf("%lf%lf%lf",&x ,&y ,&z);
p[i].x = x ;
p[i].y = y ;
p[i].z = z ;}for(int i =0;i <1010;++i)
fa[i]= i ;for(int i =1;i <= n;++i){if(p[i].z >=-r && p[i].z <= r)build(i , n+1);if(p[i].z >= h - r && p[i].z <= h + r)build(i , n +2);}for(int i =1;i <= n;++i)for(int j = i +1;j <= n;++j)if(dist(p[i], p[j])<=2* r)build(i , j);if(get(n +1)==get(n +2))printf("Yes\n");elseprintf("No\n");}return0;}