a
【问题描述】你是能看到第一题的 friends 呢。——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx。何大爷今天为字符串定义了新的权值计算方法。一个字符串由小写字母组成,字符串的权值被定义为其中出现次数最多的字符的次数减去出现次数最少的字符的次数。 (注意,在讨论出现最少的字符的时候,该字符必须至少出现一次)现在何大爷给你一个字符串,何大爷想知道这个字符串的所有子串中权值最大的权值是多少?【输入格式】第一行一个整数?,代表字符串的长度。接下来一行?个小写字母,代表该字符串。【输出格式】一行一个整数代表答案。【样例输入】10aabbaaabab【样例输出】3【数据范围与规定】3。60%的数据,1 ≤ ? ≤ 1000。对于100%的数据,1 ≤ ? ≤ 10 6 .#include#include using namespace std;#define maxn 1000010int len,sum[maxn][26];char s[maxn];int main(){ freopen("a.in","r",stdin);freopen("a.out","w",stdout); scanf("%d%s",&len,s+1); for(int i=1;i<=len;i++){ for(int j=0;j<26;j++){ if(s[i]==(char)(j+'a'))sum[i][j]=sum[i-1][j]+1; else sum[i][j]=sum[i-1][j]; } } int ans=0; for(int i=1;i<=len;i++){ for(int j=i;j<=len;j++){ int mn=0x7fffffff,mx=0; for(int k=0;k<26;k++){ int cha=sum[j][k]-sum[i-1][k]; if(cha==0)continue; mn=min(mn,cha); mx=max(mx,cha); } ans=max(ans,mx-mn); } } printf("%d",ans);}
/* 枚举右端点,前缀和优化。对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r]-(sum[x][l-1]-sum[z][l-1]) 我们已知x和sum[x][r],对于z我们枚举,对于sum[x][l-1]-sum[z][l-1]我们需要一个最小的 用minv[x][y]表示sum[x]-sum[y]的最小值。*/#include#include #include #include using namespace std;const int maxn=1000010;int n,ans,p[26][26],minv[26][26],sum[26],last[26];char s[maxn];int main(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d",&n); scanf("%s",s+1); for (int a=1;a<=n;a++) { int c=s[a]-'a'; sum[c]++; last[c]=a; for (int b=0;b<26;b++) if (b!=a && sum[b]) ans=max(ans,max(sum[c]-sum[b]-minv[c][b]-(last[b]==p[c][b]),sum[b]-sum[c]-minv[b][c]-(last[b]==p[b][c]))); for (int b=0;b<26;b++) { if (sum[c]-sum[b]
b
【问题描述】你是能看到第二题的 friends 呢。——laekovHja 和 Yjq 在玩捉迷藏。Yjq 躲了起来,Hja 要找他。在他们玩游戏的房间里,只有一堵不透明的墙和一个双面的镜子。Hja 和 Yjq 可以看作平面上坐标分别为(? ? ,? ? )和(? ? ,? ? )的点。墙是一条连接(? ? 1 ,? ? 1 )和(? ? 2 ,? ? 2 )的线段,镜子是一条连接(? ? 1 ,? ? 1 )和(? ? 2 ,? ? 2 )的线段。如果视线和障碍物有公共点,那么我们认为视线会被阻挡,无法看见。如果视线和镜子有公共点,那么我们认为发生了反射。反射的过程遵循物理规律——入射角等于反射角,且反射光线与入射光线在镜子同侧。也就是说,想要看见对方,Hja 和 Yjq 必须在镜子的同一侧,包括镜子所在直线上(参见样例 1) 。如果视线与镜子重合, 那么不会发生反射, 并且镜子不被当作障碍物 (参见样例 4) 。Hja 很想知道他站在原地能否看见 Yjq,帮助他解决这个问题。【输入格式】第一行两个数? ? ,? ? ,表示 Hja 的坐标。第二行两个数? ? ,? ? 表示 Yjq 的坐标。第三行四个数? ? 1 ,? ? 1 ,? ? 2 ,? ? 2 ,分别表示墙的两个端点的坐标。第四行四个数? ? 1 ,? ? 1 ,? ? 2 ,? ? 2 ,分别表示镜子的两个端点的坐标。【输出格式】如果 Hja 站在原地能看到 Yjq,则输出"YES",否则输出"NO"。【样例输入 1】-1 31 30 2 0 40 0 0 1【样例输出 1】NOP97 zhxb第 4 页 共 5 页【样例输入 2】0 01 10 1 1 0-100 -100 -101 -101【样例输出 2】NO【样例输入 3】0 01 10 1 1 0-1 1 1 3【样例输出 3】YES【样例输入 4】0 010 0100 100 101 1011 0 3 0【样例输出 4】YES【数据规模与约定】对于100%的数据,所有坐标均为绝对值不超过10 4 的整数。输入的线段不会退化成点,且两条线段没有交点。Hja 和 Yjq 的位置不同,且不在任何一条线段上。#include#include using namespace std;struct node{ double x,y;}p[20];double A1,A2,B1,B2,C1,C2;node check(int n1,int n2,int A,int B,int C){ node res; if(B==0){ if(p[n1].x-p[n2].x==0){ res.x=p[n1].x,res.y=p[n1].y; return res; } } else if(-A/B==(p[n1].y-p[n2].y)/(p[n1].x-p[n2].x)){ res.x=p[n1].x,res.y=p[n1].y; return res; } double xx1=p[n1].x,yy1=p[n1].y; double xx2=p[n2].x,yy2=p[n2].y; double AA=yy1-yy2,BB=xx2-xx1,CC=xx1*yy2-xx2*yy1; res.y=(AA*C-CC*A)/(-AA*B+BB*A); //res.x=((-B*AA*C+C*AA*B)/A)+CC*B-C*BB; res.x=(-B*C*AA+A*CC*B+C*B*AA-C*A*BB)/(-A*B*AA+A*A*BB); return res;}int main(){ //freopen("Cola.txt","r",stdin); freopen("b.in","r",stdin);freopen("b.out","w",stdout); for(int i=1;i<=6;i++)scanf("%lf%lf",&p[i].x,&p[i].y); if(p[3].x max(p[3].x,p[4].x)||a1.x max(p[3].y,p[4].y)||a1.y max(p[5].x,p[6].x)||a1.x max(p[5].y,p[6].y)||a1.y max(p[3].x,p[4].x)||a1.x max(p[3].y,p[4].y)||a1.y
#include#include #include #include #include using namespace std;const double eps=1e-8;int sgn(double a){ if (fabs(a) 0.0) return 1; else return -1; }}struct point{ double x,y; point(){} point(double a,double b) { x=a;y=b; } void init() { scanf("%lf%lf",&x,&y); } point operator+(const point &a)const { point ans; ans.x=x+a.x; ans.y=y+a.y; return ans; } point operator-(const point &a)const { point ans; ans.x=x-a.x; ans.y=y-a.y; return ans; } point operator*(const double &a)const { point ans; ans.x=x*a; ans.y=y*a; return ans; } void print() { printf("%lf %lf\n",x,y); }}v,p,w1,w2,m1,m2;double cross(point a,point b){ return a.x*b.y-a.y*b.x;}double dot(point a,point b){ return a.x*b.x+a.y*b.y;}bool cross(point p1,point p2,point p3,point p4){ if (sgn(cross(p2-p1,p3-p1))*sgn(cross(p2-p1,p4-p1))==1) return false; if (sgn(cross(p4-p3,p1-p3))*sgn(cross(p4-p3,p2-p3))==1) return false; if (sgn(max(p1.x,p2.x)-min(p3.x,p4.x))==-1) return false; if (sgn(max(p1.y,p2.y)-min(p3.y,p4.y))==-1) return false; if (sgn(max(p3.x,p4.x)-min(p1.x,p2.x))==-1) return false; if (sgn(max(p3.y,p4.y)-min(p1.y,p2.y))==-1) return false; return true;}point getcross(point p1,point p2,point p3,point p4){ double a=p2.y-p1.y; double b=p1.x-p2.x; double c=-p1.x*p2.y+p1.y*p2.x; double d=p4.y-p3.y; double e=p3.x-p4.x; double f=-p3.x*p4.y+p3.y*p4.x; double x=(b*f-c*e)/(a*e-b*d); double y=(a*f-c*d)/(b*d-a*e); return point(x,y);}point calcfoot(point p1,point p2,point p3){ double ratio=dot(p1-p2,p3-p2)/dot(p3-p2,p3-p2); return p2+(p3-p2)*ratio;}bool check(){ if (!cross(v,p,w1,w2)) { if (!cross(v,p,m1,m2)) return true; if (sgn(cross(m1-v,m2-v))==0 && sgn(cross(m1-p,m2-p)==0)) return true; } if (sgn(cross(m2-m1,v-m1))*sgn(cross(m2-m1,p-m1))==1) { point foot=calcfoot(p,m1,m2); foot=foot*2.0-p; if (cross(v,foot,m1,m2)) { foot=getcross(v,foot,m1,m2); if (!cross(v,foot,w1,w2) && !cross(foot,p,w1,w2)) return true; } } return false;}int main(){ freopen("b.in","r",stdin); freopen("b.out","w",stdout); v.init(); p.init(); w1.init(); w2.init(); m1.init(); m2.init(); if (check()) printf("YES\n"); else printf("NO\n"); return 0;}