lxhgww最近迷上了一款游戲,在游戲里,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。并且每種裝備最多只能使用一次。
游戲進行到最后,lxhgww遇到了終極boss,這個終極boss很奇怪,攻擊他的裝備所使用的屬性值必須從1開始連續遞增地攻擊,才能對boss產生傷害。也就是說一開始的時候,lxhgww只能使用某個屬性值為1的裝備攻擊boss,然后只能使用某個屬性值為2的裝備攻擊boss,然后只能使用某個屬性值為3的裝備攻擊boss……以此類推。
現在lxhgww想知道他最多能連續攻擊boss多少次?
對于30%的數據,保證N<=1000
對于100%的數據,保證N<=1000000
#include<iostream>
#define MAXM 1000001
#define MAXN 1000001
#define MAXNANS 10000
using namespace std;
int a,b,n,tot,Tnow[MAXM],Ty[MAXM],pre[MAXM];
int head;
int from[MAXN];
bool visit[MAXN];
int Happen[MAXN];
bool find(int x){
int mark = Tnow[x];
while (mark > 0)
{
if (!visit[Ty[mark]])
{
visit[Ty[mark]] = true;
Happen[++head] = Ty[mark];
if ((!from[Ty[mark]]) || (find(from[Ty[mark]])))
{
from[Ty[mark]] = x;
return true;
}
}
mark = pre[mark];
}
return false;
}
void cnt(int x,int y){
tot++;
pre[tot] = Tnow[x];
Tnow[x] = tot;
Ty[tot] = y;
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
cin>>n;
tot = 0;
for (int i=1;i<=n;i++)
{
cin>>a>>b;
cnt(a,i+MAXNANS);
cnt(b,i+MAXNANS);
}
int Answer ;
memset(visit,false,sizeof(visit));
for (int i=1;i<=n;i++)
{
head = 0;
if (!find(i))
{
Answer = i - 1;
break;
}
for (int i=1;i<=head;i++)
visit[Happen[i]] = false;
}
printf("%d\n",Answer);
return 0;
}
內部不包含0的最大矩陣和.
#include<cstdio>
#include<algorithm>
#define maxn 1001
#define maxm 1001
#define INF 0x7fffffff
using namespace std;
int n,m;
int sum[maxn][maxm];
int l[maxn][maxn],r[maxn][maxn],h[maxn][maxn],v[maxn][maxn];
int L[maxn][maxn],R[maxn][maxn];
int getsum(int a,int b,int c,int d){
return (sum[c][d]-sum[a-1][d]-sum[c][b-1]+sum[a-1][b-1]);
}
int main(){
freopen("Candy.in","r",stdin);
freopen("Candy.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
scanf("%d",&v[i][j]);
sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
if (v[i][j]!=0)
l[i][j] = l[i][j-1]+1;
for (int j=m;j>=1;j--)
if (v[i][j]!=0)
r[i][j] = r[i][j+1]+1;
}
for (int i=1;i<=m;i++)
h[1][i] = 0;
memset(L,63,sizeof(L));
memset(R,63,sizeof(R));
int Answer = -INF;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (v[i][j]!=0)
{
h[i][j] = h[i-1][j]+1;
L[i][j] = min ( l[i][j] , L[i-1][j]);
R[i][j] = min ( r[i][j] , R[i-1][j]);
Answer = max ( Answer , getsum (i-h[i][j]+1,j-L[i][j]+1,i,j+R[i][j]-1) );
}
printf("%d\n",Answer);
return 0;
}