乙個0到n-1的環,初始在0,每次隨機前進或後退一格,當所有點都訪問過就結束,問結束時站在k的概率是多少。(注意輸出的是字首積)
一開始站在0,最後顯然不可能在0,剩下n-1格,隨機數打表發現概率相同,都為\(\frac\)
#include using namespace std;
typedef long long ll;
const int mod=1e9+7;
int cnt[1050];
bool vis[1050];
void sui(int n)\sum_^dp[j]\),這是一種線性遞推的關係,所以求出前幾項,然後用bm演算法求出第n項。
當n為無窮大的情況,先計算走一步的期望,\(\sum_^k\frac=\frac\),那麼反過來,走到某一格的概率就是\(\frac}=\frac\)
#include using namespace std;
#define rep(i,a,n) for (int i=a;i=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef vectorvi;
typedef pairpii;
const ll mod=1000000007;
ll powmod(ll a,ll b) return res;}
// head
ll n;
namespace linear_seq
int solve(ll n,vi a,vi b)
}rep(i,0,k) ans=(ans+res[i]*b[i])%mod;
if (ans<0) ans+=mod;
return ans;
}vi bm(vi s)
};bs g[n];
bs t;
priority_queuepq;
int main(void)^dp[i-1][j]+\sum_^dp[i-1][j]\),其中\(l\)和\(r\)表示\(g[i-1][j]\),左右連續0延伸的位置。
所以答案顯然就是\(dp[n+1][b]\),因為\(dp[n][b]\)只考慮了從\(g[n-1][b]\)往下走的方案數。
顯然從第一層到第二層狀態的轉移是乙個線性遞推的式子,中間可以構造乙個矩陣,那麼從第一層到第n+1層的狀態顯然就是n個矩陣的乘積了,所求結果就是\((\sum_^nm_i)[a][b]\)。
修改的操作直接修改矩陣,然後線段樹單點修改即可。
#include using namespace std;
#define ls i<<1
#define rs i<<1|1
#define mid (l+r)/2
typedef long long ll;
const int n=50050;
const int m=12;
const ll mod=1e9+7;
int n,m,q,o,a,b;
int g[n][m];
char s[m];
struct mat
};mat mmul(mat a,mat b)else}}
return;
}build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
}void update(int i,int l,int r,int a,int b)else
}for(int k=j;k>=1;k--)else}}
return;
}if(a<=mid)else
pushup(i);
}int main(void)
}build(1,1,n);
//對於每乙個查詢 答案就是(\prod_^n mi)[a][b]
while(q--)else if(o==2)
}return 0;
}
將2n個人分為兩隊,給定乙個n*n的權值矩陣,定義總權值為兩隊各n個人分別的權值和,求最大總權值。
直接暴力搜尋,每加入乙個就算貢獻,不要等到全部分完再計算。
#include using namespace std;
typedef long long ll;
ll g[30][30];
int n;
ll ans;
// vectora,b;
int a[30],b[30];
int ac,bc;
void dfs(int idx,ll now)
if(ac給乙個01矩陣,求第二大的全1子矩陣。
和最大的全1子矩陣類似,對於每一行,我們維護每個點能往上延伸的最大長度,然後就相當於經典的單調棧題目,給一些不同高度的柱子,求最大面積。
我們只需要用單調棧維護每個高度作為最小值能延伸到的最左和最右,然後掃一遍就能求出最大矩陣大小,但是這題要求的是次大,所以我們不能單獨考慮最大的矩陣,也就是不能求出次大的最大子矩陣,而是要把每個最大子矩陣長減1,和寬減1再加入更新。
#include using namespace std;
const int n=1050;
const int inf=0x3f3f3f3f;
int h[n],le[n],ri[n];
int n,m;
char s[n][n];
struct nodeelse if(x>se)
}int main(void)
for(int i=1;i<=n;i++)else
}while(!ss.empty())
for(int j=1;j<=m;j++)
if(ss.size()>0)else
ss.push(j);
}while(!ss.empty())
for(int j=m;j>=1;j--)
if(ss.size()>0)else
ss.push(j);
}for(int j=1;j<=m;j++)
if(mp)
mp=1;
update(h[j]*(ri[j]-le[j]+1));
update(h[j]*(ri[j]-le[j]));
update((h[j]-1)*(ri[j]-le[j]+1));}}
printf("%d\n",se);
return 0;
}
2019牛客多校第二場
蒙特卡洛 猜答案 注意答案要累乘 最大的可以用rmq rmqrm q做然後挖掉四個角分別再做一次即可 掛一下大佬的鏈結 最重要的是學會了字首和查詢相差為1 11的時候的奇技淫巧 include include define fo i,a,b for i a i b i define fd i,a,b...
2019牛客多校第二場
upsloved 有乙個長為 n 的環,一開始位於 0 每次隨機向前或者向後走,求最後乙個走到 m 的概率 ps 這題實際上求的是所有詢問的字首積 實際上概率相等 俺也不知道為啥 如果 m 0 則概率是 frac 1 特判 n 1,m 0 就行了 不放了 solved at 03 54 2 有乙個無...
牛客多校第二場 J farm
輸入描述 the first line of input contains 3 integers n,m,t n m 1000000,t 1000000 for the next n lines,each line contains m integers in range 1,n m denotin...