給乙個01字串,求0和1個數相同的最長子序列和子串長度。
子串行長度就是\(min(cnt(0),cnt(1))*2\),子串的長度也是原題,記錄一下0和1個數差的字首和,然後用乙個陣列記錄前面掃過的0個數和1個數差值的最左位置,字首和的思想更新答案即可。
#include using namespace std;
const int n=1e5+50;
int n;
char s[n];
int cnt[2],mp[2*n];
int main(void)
ans1=max(ans1,i-mp[(int)1e5+cnt[0]-cnt[1]]);
}ans2=min(cnt[0],cnt[1])*2;
printf("%d %d\n",ans1,ans2);
return 0;
}
給乙個矩陣,求出最大的子矩陣滿足最大值和最小值之差不超過\(m\)。
資料範圍給的是\(n^3\)的做法,對於二維的乙個子矩陣,需要\(n^2\)的時間來列舉上下底,然後使用單調佇列維護橫向的最大值與最小值之差。
關鍵一點在於列舉上下底\(i\)行和\(j\)行後,中間的二維矩陣的每一列其實就可以用這一列的最大值和最小值來表示,其他數值都已經無關緊要了,從而轉化為一維陣列的情況。
#include using namespace std;
const int n=505;
const int inf=0x3f3f3f3f;
int t,n,m,a[n][n];
int mx[n],mn[n];
int mxq[n],mnq[n];
int main(void)
}int ans=0;
//列舉列
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
mxq[++r1]=r;
while(l2<=r2 && mn[r]m)elseelse
}else if(v==0)else if(v==1)else}}
if(ac)else
}else if(o==0));
auto t=ls.end();
t--;
it->second=t;
}else);
auto t=ls.end();
t--;
mp[s]=t;
if(ls.size()>m)
}printf("%d\n",ans);}}
}return 0;
}
Magic Line(牛客多校第三場)
magic line 首先我先把所有的點按照先橫座標後縱座標 都是由小到大 然後由於題目給的範圍很大,我們可以想到,如果取一條最為豎的線,那麼一定能分開,然後考慮一下最中間的兩個點橫座標相同的情況即可。include include include include include include i...
2020牛客多校第三場
沒有魚,沒有魚餌 沒有魚,有魚餌 有魚,沒魚餌 有魚,有魚餌 每個只能做其中乙個操作,如果在某個點之前已經拿過魚餌,還沒用,就能拿個魚,如果在某個點有魚,就能拿個魚。現在問最多能拿多少條魚?思路 貪心,如果有魚那肯定拿魚,魚 1,然後就剩0和1操作了,如果遇到1操作,直接拿魚餌,遇到0操作,看有沒有...
2019牛客暑期ACM集訓多校第三場
1.emmmm,牛客這場多校題目還是挺平和的,但是,由於隊伍狀態不是很好 玄學卡常所以沒打好。2.首先上來時字串,這個之前寫過最長的相等01串,子串行就是01出現的次數取個最小值的2倍。然後隨便寫寫ac了。用的是dp寫的,看了其他大佬把1看作1,0看作 1,然後計算字首和也挺好的。3.然後是h,由於...