1. 统计子矩阵
输入:
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
输出:
19
#include<iostream>//前缀和与双指针的完美结合!!!
using namespace std;
int n,m,k;
int s[510][510];//存每一列上的前缀和
long long cnt;
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&s[i][j]);
s[i][j]=s[i][j]+s[i-1][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)//外两层for循环遍历行
{
int l=1,sum=0;
for(int r=1;r<=m;r++)//内层for循环对列进行双指针
{
sum=sum+s[j][r]-s[i-1][r];
while(sum>k)//用双指针来维护sum,使其永远小于k
{
sum=sum-(s[j][l]-s[i-1][l]);
l++;
}
cnt=cnt+r-l+1;//这里要着重说明一下r-l+1是怎么来的,并不是指的这个区间,而是从r开始往前数:[r,r], [r-1,r], [r-2,r],..., [l,r], 统计的这些区间和成立
}
}
}
cout<<cnt<<endl;
return 0;
}
2. 三升序列
数据
VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX
#include<iostream>
#include<cstring>
using namespace std;
char s[60][60];
int ans;
int main()
{
for(int i=0;i<30;i++)
{
for(int j=0;j<50;j++)
{
cin>>s[i][j];
}
}
//按行
for(int i=0;i<30;i++)
{
for(int k1=0;k1<48;k1++)
{
for(int k2=k1+1;k2<49;k2++)
{
for(int k3=k2+1;k3<50;k3++)
{
if((s[i][k3]-'0')-(s[i][k2]-'0')>0&&(s[i][k2]-'0')-(s[i][k1]-'0')>0) ans++;
}
}
}
}
//cout<<ans<<endl;
//按列
for(int i=0;i<50;i++)
{
for(int k1=0;k1<28;k1++)
{
for(int k2=k1+1;k2<29;k2++)
{
for(int k3=k2+1;k3<30;k3++)
{
if((s[k3][i]-'0')-(s[k2][i]-'0')>0&&(s[k2][i]-'0')-(s[k1][i]-'0')>0) ans++;
}
}
}
}
//cout<<ans<<endl;
//左上到右下
for(int i=0;i<28;i++)
{
for(int x1=i,y1=0;x1<28&&y1<48;x1++,y1++)
{
for(int x2=x1+1,y2=y1+1;x2<29&&y2<49;x2++,y2++)
{
for(int x3=x2+1,y3=y2+1;x3<30&&y3<50;x3++,y3++)
{
if((s[x3][y3]-'0')-(s[x2][y2]-'0')>0&&(s[x2][y2]-'0')-(s[x1][y1]-'0')>0) ans++;
}
}
}
}
//cout<<ans<<endl;
for(int j=1;j<48;j++)
{
for(int x1=0,y1=j;x1<28&&y1<48;x1++,y1++)
{
for(int x2=x1+1,y2=y1+1;x2<29&&y2<49;x2++,y2++)
{
for(int x3=x2+1,y3=y2+1;x3<30&&y3<50;x3++,y3++)
{
if((s[x3][y3]-'0')-(s[x2][y2]-'0')>0&&(s[x2][y2]-'0')-(s[x1][y1]-'0')>0) ans++;
}
}
}
}
//cout<<ans<<endl;
//左下到右上and右上到左下
int flag=1;
for(int i=29;i>=2;i--)
{
for(int j=0;j<48;j++)
{
for(int x1=i-1,y1=j+1;x1>=1&&y1<49;x1--,y1++)
{
for(int x2=x1-1,y2=y1+1;x2>=0&&y2<50;x2--,y2++)
{
if(((s[x2][y2]-'0')-(s[x1][y1]-'0')>0&&(s[x1][y1]-'0')-(s[i][j]-'0')>0)||((s[x2][y2]-'0')-(s[x1][y1]-'0')<0&&(s[x1][y1]-'0')-(s[i][j]-'0')<0)) ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}
答案:180414
3. 螺旋折线
#include<iostream>
using namespace std;
long long x,y;
int main()
{
cin>>x>>y;
if(x+y>=0)//y=-x
{
if(x>y) cout<<4*x*x+(x-y)<<endl;
else if(x<y) cout<<4*y*y-(y-x)<<endl;
else cout<<4*x*x<<endl;
}
else
{
y=y-1;//为了使x和y关于y=x对称,这样做好处理
if(x==y) cout<<(2*(abs(x)-1)+1)*(2*(abs(x)-1)+1)<<endl;
else if(abs(x)<abs(y)) cout<<(2*(abs(y)-1)+1)*(2*(abs(y)-1)+1)-(x-y)<<endl;
else cout<<(2*(abs(x)-1)+1)*(2*(abs(x)-1)+1)+(y-x)<<endl;
}
return 0;
}