#include<bits/stdc++.h>usingnamespace std;
constint N = 1010;
int a[N][N];
int b[N][N];
intmain(){
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
}
}
while(m--){
int sx,sy,ex,ey;
cin>>sx>>sy>>ex>>ey;
++b[sx][sy];
--b[ex+1][sy];
--b[sx][ey+1];
++b[ex+1][ey+1];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
return0;
}
数学
进制转换
// 2~36 base converterstructBaseConverter {
int s;int t;bool u=false;
BaseConverter(int source, int target,bool upper) : s(source), t(target),u(upper) {}
BaseConverter(int source, int target) : s(source), t(target){}
BaseConverter(bool upper):u(upper){}
BaseConverter(){}
string work(const string& source){
int v = XTD(source, s);
returnDTX(v, t);
}
// 将源进制的数字字符串转为十进制intXTD(const string& source, int b){
int v = 0;
int p = 1;
for (int i = source.length() - 1; i >= 0; --i) {
int bits = charToDigit(source[i]);
if (bits == -1 || bits >= b) {
cerr << "Invalid x in source number.\n";
return-1;
}
v += bits * p;
p *= b;
}
return v;
}
// 将十进制的值转为目标进制的字符串string DTX(int v, int b){
if (v == 0) return"0";
string res = "";
while (v > 0) {
int rem = v % b;
res = digitToChar(rem) + res;
v /= b;
}
return res;
}
// 获取字符对应的数字值intcharToDigit(char x){
if (x >= '0' && x <= '9') {
return x - '0';
} elseif (x >= 'A' && x <= 'Z') {
return x - 'A' + 10;
} elseif (x >= 'a' && x <= 'z') {
return x - 'a' + 10;
}
return-1;
}
// 获取数字值对应的字符chardigitToChar(int val){
if (val >= 0 && val <= 9) {
return'0' + val;
} elseif (val >= 10 && val <= 35) {
if(!u){
return'a' + val - 10;
}else{
return'A'+val-10;
}
}
return'\0';
}
};
求约数
vector<int> get_divisors(int x){
vector<int> res;
for (int i = 1; i <= x / i; i ++ )
if (x % i == 0){
res.push_back(i);
if (i != x / i) res.push_back(x / i);
}
sort(res.begin(), res.end());
return res;
}
判质数
boolisPrime(int x){
if(x<2){
returnfalse;
}
for(int i=2;i<=x/i;i++){
if(x%i==0){
returnfalse;
}
}
returntrue;
}
//常数优化 sqrt(x)/3boolisPrime(int n){
if (n == 1) returnfalse;
if (n == 2 || n == 3) returntrue;
if (n % 6 != 1 && n % 6 != 5) returnfalse;
for (int i = 5, j = n / i; i <= j; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
returnfalse;
}
}
returntrue;
}
ll smul(ll a,ll b,ll mod){
ll res = 0;
while (b){
if (b & 1) res = (res + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return res%mod;
}
快速幂
ll qpow(ll a, ll n, ll mod){
ll res = 1;
while (n){
if (n & 1) res = res * a % mod;
a = a * a % mod;
n >>= 1;
}
return res%mod;
}
质数筛
constexprint N =1e6+10;
int primes[N], cnt; // primes[]存储所有素数bool st[N]; // st[x]存储x是否被筛掉voidget_primes(int n){
for (int i = 2; i <= n; i ++ ){
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ ){
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
//欧拉筛
vector<int> prime;
auto euler_Prime = [&](int n){
int cnt=0;
vector<int> v(n + 1);
for (int i = 2; i <= n; ++i) {
if (!v[i]) {
v[i] = i;cnt+=i;
prime.push_back(i);
}
for (int j = 0; j < prime.size(); ++j) {
if (prime[j] > v[i] || prime[j] > n / i) break;
v[i * prime[j]] = prime[j];
cnt+=prime[j];
}
}
//return sum of 1~n min prime factorreturn cnt;
};
欧拉函数
intphi(int x){
int res = x;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0){
res = res / i * (i - 1);
while (x % i == 0) x /= i;
}
if (x > 1) res = res / x * (x - 1);
return res;
}
//扩展欧拉定理降幂 p = phi(m) b为次数auto depow = [&](string str){
int b=0;
bool flag=false;
for(int i=0;i<str.size();i++){
b=b*10+str[i]-'0';
if(b>=p){
flag=true;
b%=p;
}
}
if(flag){
b+=p;
}
return b;
};
欧拉函数筛
constint N = 1e6+10;
int primes[N], cnt; // primes[]存储所有素数int euler[N]; // 存储每个数的欧拉函数bool st[N]; // st[x]存储x是否被筛掉voidget_eulers(int n){
euler[1] = 1;
for (int i = 2; i <= n; i ++ ){
if (!st[i]){
primes[cnt ++ ] = i;
euler[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j ++ ){
int t = primes[j] * i;
st[t] = true;
if (i % primes[j] == 0){
euler[t] = euler[i] * primes[j];
break;
}
euler[t] = euler[i] * (primes[j] - 1);
}
}
}
Stirling
constint mod = 1e9+7;
constint N = 1e6+100;
int fac[N+2],invfac[N+2];
intqpow(int a,int b,int mod){
int res=1;while(b){if(b&1){res=res*a%mod;}a=a*a%mod;b>>=1;}return res;
}
intinv(int x){returnqpow(x,mod-2,mod);}
voidinit(int n){
fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i % mod;
invfac[n] = inv(fac[n]);for (int i = n - 1; i >= 0; --i) invfac[i] = (invfac[i + 1] * (i + 1)) % mod;
}
intC(int n,int m){
if (n < m || m < 0) return0;return fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
intS(int n,int k){
int ans=0;
for(int i=0;i<=k;i++){
ans=(ans+mod)%mod;
ans=(ans+(i%2?-1:1)*C(k,i)%mod*qpow(k-i,n,mod)%mod)%mod;
}
ans=ans*invfac[k]%mod;
return ans;
}
Catalan
template<typename T>
structCatalan{
T c=1;
T C(int x, int y){
T m;
if( x < 0 || y < 0 || y > x ){
m = 0;
}
elseif( y == 0 ){
m = 1;
}
elseif( y > x / 2 ){
y = x - y;
m = C( x , y );
}
else{
m = C( x - 1, y - 1)*x / y;
}
return m;
};
T query1(int n){
for(int i=1;i<=n;i++){
c=c*(4*i-2)/(i+1);
}
return c;
}
T query2(int n,int m){
returnC(n+m,n)-C(n+m,m-1);
}
T query3(int n){
returnC(2*n,n)/(n+1);
}
};
namespace BSGS {
ll a, b, p;
map<ll, ll> f;
inline ll gcd(ll a, ll b){ return b > 0 ? gcd(b, a % b) : a; }
inline ll qpow(ll n, ll k, int p){
ll r = 1;
for (; k; k >>= 1) {
if (k & 1) r = r * n % p;
n = n * n % p;
}
return r;
}
voidexgcd(ll a, ll b, ll &x, ll &y){
if (!b) {
x = 1, y = 0;
} else {
exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - a / b * y;
}
}
ll inv(ll a, ll b){
ll x, y;
exgcd(a, b, x, y);
return (x % b + b) % b;
}
ll bsgs(ll a, ll b, ll p){
f.clear();
int m = ceil(sqrt(p));
b %= p;
for (int i = 1; i <= m; i++) {
b = b * a % p;
f[b] = i;
}
ll tmp = qpow(a, m, p);
b = 1;
for (int i = 1; i <= m; i++) {
b = b * tmp % p;
if (f.count(b) > 0) return (i * m - f[b] + p) % p;
}
return-1;
}
ll exbsgs(ll a, ll b, ll p){ //a^x ≡ b(mod p)
a %= p,b %= p;
if (b == 1 || p == 1) return0;
ll g = gcd(a, p), k = 0, na = 1;
while (g > 1) {
if (b % g != 0) return-1;
k++;
b /= g;
p /= g;
na = na * (a / g) % p;
if (na == b) return k;
g = gcd(a, p);
}
ll f = bsgs(a, b * inv(na, p) % p, p);
if (f == -1) return-1;
return f + k;
}
} usingnamespace BSGS;
exCRT
using ll = longlong;
constint N = 1e5+10;
ll Ai[N], Mi[N];
int n;
constexprintqpow(int n, int k, int p){
int r = 1;
for (; k; k >>= 1, n = n * n % p)
if (k & 1) r = r * n % p;
return r;
}
constexpr ll mul(ll a, ll b, ll p){
ll res = a * b - ll(1.L * a * b / p) * p;
res %= p;
if (res < 0) {
res += p;
}
return res;
}
ll exgcd(ll a, ll b, ll &x, ll &y){
if (b == 0) { x = 1, y = 0; return a; }
ll gcd = exgcd(b, a % b, x, y), tp = x;
x = y, y = tp - a / b * y;
return gcd;
}
ll excrt(){
ll x, y, k;
ll M = Mi[1], ans = Ai[1];
for (int i = 2; i <= n; ++ i) {
ll a = M, b = Mi[i], c = (Ai[i] - ans % b + b) % b;
ll gcd = exgcd(a, b, x, y), bg = b / gcd;
if (c % gcd != 0) return-1;
x = mul(x, c / gcd, bg);
ans += x * M;
M *= bg;
ans = (ans % M + M) % M;
}
return (ans % M + M) % M;
}
exGCD
intexgcd(int a, int b, int &x, int &y){
if (!b) {
x = 1, y = 0;
return a;
}
int g = exgcd(b, a % b, y, x);
y -= a / b * x;
return g;
}
//求逆元,要求a与p互质intinv(int a, int p){
int x, y;
exgcd(a, p, x, y);
return (p + x % p) % p;
}
auto calc = [&](int a,int b,int c)->int{
int x, y, d = exgcd(a, b, x, y);
if (c % d != 0) {
return-1;
}
return (x*c/d%b/d+b/d)%b/d;
};
constint N = 110;
structGauss{
constdouble eps = 1e-8;
double a[N][N];
ll n;
Gauss(int n):n(n){}
ll gauss(){
ll c, r;
for (c = 0, r = 0; c < n; c ++ ){
ll t = r;
for (int i = r; i < n; i ++ )
if (fabs(a[i][c]) > fabs(a[t][c]))
t = i;
if (fabs(a[t][c]) < eps) continue;
for (int j = c; j < n + 1; j ++ ) swap(a[t][j], a[r][j]);
for (int j = n; j >= c; j -- ) a[r][j] /= a[r][c];
for (int i = r + 1; i < n; i ++ )
if (fabs(a[i][c]) > eps)
for (int j = n; j >= c; j -- )
a[i][j] -= a[r][j] * a[i][c];
r ++ ;
}
if (r < n){
for (int i = r; i < n; i ++ )
if (fabs(a[i][n]) > eps)
return2;
return1;
}
for (int i = n - 1; i >= 0; i -- )
for (int j = i + 1; j < n; j ++ )
a[i][n] -= a[i][j] * a[j][n];
return0;
}
voidwork(){
int t=gauss();
if(t==0){
for (int i = 0; i < n; i ++ ){
if (fabs(a[i][n]) < eps) a[i][n] = abs(a[i][n]);
cout<<a[i][n]<<"\n";
}
}
elseif (t == 1) cout << "Infinite group solutions\n";
else cout << "No solution\n";
}
};
Pollard Rho & Miller Rabin
ll mul(ll a, ll b, ll m){
returnstatic_cast<__int128_t>(a) * b % m;
}
ll power(ll a, ll b, ll m){
ll res = 1 % m;
for (; b; b >>= 1, a = mul(a, a, m))
if (b & 1)
res = mul(res, a, m);
return res;
}
boolisprime(ll n){
if (n < 2)
returnfalse;
staticconstexprint A[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
int s = __builtin_ctzll(n - 1);
ll d = (n - 1) >> s;
for (auto a : A) {
if (a == n)
returntrue;
ll x = power(a, d, n);
if (x == 1 || x == n - 1)
continue;
bool ok = false;
for (int i = 0; i < s - 1; ++i) {
x = mul(x, x, n);
if (x == n - 1) {
ok = true;
break;
}
}
if (!ok)
returnfalse;
}
returntrue;
}
std::vector<ll> factorize(ll n){
std::vector<ll> p;
std::function<void(ll)> f = [&](ll n) {
if (n <= 10000) {
for (int i = 2; i * i <= n; ++i)
for (; n % i == 0; n /= i)
p.push_back(i);
if (n > 1)
p.push_back(n);
return;
}
if (isprime(n)) {
p.push_back(n);
return;
}
auto g = [&](ll x) {
return (mul(x, x, n) + 1) % n;
};
ll x0 = 2;
while (true) {
ll x = x0;
ll y = x0;
ll d = 1;
ll power = 1, lam = 0;
ll v = 1;
while (d == 1) {
y = g(y);
++lam;
v = mul(v, std::abs(x - y), n);
if (lam % 127 == 0) {
d = std::__gcd(v, n);
v = 1;
}
if (power == lam) {
x = y;
power *= 2;
lam = 0;
d = std::__gcd(v, n);
v = 1;
}
}
if (d != n) {
f(d);
f(n / d);
return;
}
++x0;
}
};
f(n);
std::sort(p.begin(), p.end());
return p;
}
多项式(zhoukangyang poly)
#define Fo(i, j, k) for(int i = (j); i <= (k); ++i)#define Rep(i, j, k) for(int i = (j); i >= (k); --i)#define sz(a) ((int) (a).size())constint mod = 998244353, _G = 3, N = (1 << 21), inv2 = (mod + 1) / 2;
#define add(a, b) (a + b >= mod ? a + b - mod : a + b)#define dec(a, b) (a < b ? a - b + mod : a - b)intqpow(int x, int y = mod - 2){
int res = 1;
for(; y; x = (ll) x * x % mod, y >>= 1) if(y & 1) res = (ll) res * x % mod;
return res;
}
int fac[N + 1], ifac[N + 1], inv[N + 1];
voidinit(int x){
fac[0] = ifac[0] = inv[1] = 1;
Fo(i, 2, x) inv[i] = (ll) inv[mod % i] * (mod - mod / i) % mod;
Fo(i, 1, x) fac[i] = (ll) fac[i - 1] * i % mod, ifac[i] = (ll) ifac[i - 1] * inv[i] % mod;
}
intC(int x, int y){
return y < 0 || x < y ? 0 : (ll) fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
inlineintsgn(int x){
return (x & 1) ? mod - 1 : 1;
}
int rt[N], Lim;
voidPinit(int x){
for(Lim = 1; Lim <= x; Lim <<= 1) ;
for(int i = 1; i < Lim; i <<= 1) {
int sG = qpow (_G, (mod - 1) / (i << 1));
rt[i] = 1;
Fo(j, i + 1, i * 2 - 1) rt[j] = (ll) rt[j - 1] * sG % mod;
}
}
structpoly {
vector<int> a;
intsize(){ returnsz(a); }
int & operator [] (int x) { return a[x]; }
intv(int x){ return x < 0 || x >= sz(a) ? 0 : a[x]; }
voidclear(){ vector<int> ().swap(a); }
voidrs(int x = 0){ a.resize(x); }
poly (int n = 0) { rs(n); }
poly (vector<int> o) { a = o; }
poly (const poly &o) { a = o.a; }
poly Rs(int x = 0){ vector<int> res = a; res.resize(x); return res; }
inlinevoiddif(){
int n = sz(a);
for (int l = n >> 1; l >= 1; l >>= 1)
for(int j = 0; j < n; j += l << 1)
for(int k = 0, *w = rt + l; k < l; k++, w++) {
int x = a[j + k], y = a[j + k + l];
a[j + k] = add(x, y);
a[j + k + l] = (ll) * w * dec(x, y) % mod;
}
}
voiddit(){
int n = sz(a);
for(int i = 2; i <= n; i <<= 1)
for(int j = 0, l = (i >> 1); j < n; j += i)
for(int k = 0, *w = rt + l; k < l; k++, w++) {
int pa = a[j + k], pb = (ll) a[j + k + l] * *w % mod;
a[j + k] = add(pa, pb), a[j + k + l] = dec(pa, pb);
}
reverse(a.begin() + 1, a.end());
for(int i = 0, iv = qpow(n); i < n; i++) a[i] = (ll) a[i] * iv % mod;
}
friend poly operator * (poly aa, poly bb) {
if(!sz(aa) || !sz(bb)) return {};
int lim, all = sz(aa) + sz(bb) - 1;
for(lim = 1; lim < all; lim <<= 1);
aa.rs(lim), bb.rs(lim), aa.dif(), bb.dif();
Fo(i, 0, lim - 1) aa[i] = (ll) aa[i] * bb[i] % mod;
aa.dit(), aa.a.resize(all);
return aa;
}
poly Inv(){
poly res, f, g;
res.rs(1), res[0] = qpow(a[0]);
for(int m = 1, pn; m < sz(a); m <<= 1) {
pn = m << 1, f = res, g.rs(pn), f.rs(pn);
for(int i = 0; i < pn; i++) g[i] = (*this).v(i);
f.dif(), g.dif();
for(int i = 0; i < pn; i++) g[i] = (ll) f[i] * g[i] % mod;
g.dit();
for(int i = 0; i < m; i++) g[i] = 0;
g.dif();
for(int i = 0; i < pn; i++) g[i] = (ll) f[i] * g[i] % mod;
g.dit(), res.rs(pn);
for(int i = m; i < min(pn, sz(a)); i++) res[i] = (mod - g[i]) % mod;
}
return res.rs(sz(a)), res;
}
poly Shift(int x){
poly zm(sz(a) + x);
Fo(i, max(-x, 0ll), sz(a) - 1) zm[i + x] = a[i];
return zm;
}
friend poly operator * (poly aa, int bb) {
poly res(sz(aa));
Fo(i, 0, sz(aa) - 1) res[i] = (ll) aa[i] * bb % mod;
return res;
}
friend poly operator + (poly aa, poly bb) {
vector<int> res(max(sz(aa), sz(bb)));
Fo(i, 0, sz(res) - 1) res[i] = add(aa.v(i), bb.v(i));
returnpoly(res);
}
friend poly operator - (poly aa, poly bb) {
vector<int> res(max(sz(aa), sz(bb)));
Fo(i, 0, sz(res) - 1) res[i] = dec(aa.v(i), bb.v(i));
returnpoly(res);
}
poly & operator += (poly o) {
rs(max(sz(a), sz(o)));
Fo(i, 0, sz(a) - 1) (a[i] += o.v(i)) %= mod;
return (*this);
}
poly & operator -= (poly o) {
rs(max(sz(a), sz(o)));
Fo(i, 0, sz(a) - 1) (a[i] += mod - o.v(i)) %= mod;
return (*this);
}
poly & operator *= (poly o) {
return (*this) = (*this) * o;
}
poly Integ(){
if(!sz(a)) returnpoly();
poly res(sz(a) + 1);
Fo(i, 1, sz(a)) res[i] = (ll) a[i - 1] * inv[i] % mod;
return res;
}
poly Deriv(){
if(!sz(a)) returnpoly();
poly res(sz(a) - 1);
Fo(i, 1, sz(a) - 1) res[i - 1] = (ll) a[i] * i % mod;
return res;
}
poly Ln(){
poly g = ((*this).Inv() * (*this).Deriv()).Integ();
return g.rs(sz(a)), g;
}
poly Exp(){
poly res(1), f;
res[0] = 1;
for(int m = 1, pn; m < sz(a); m <<= 1) {
pn = min(m << 1, sz(a)), f.rs(pn), res.rs(pn);
for(int i = 0; i < pn; i++) f[i] = (*this).v(i);
f -= res.Ln(), (f[0] += 1) %= mod, res *= f, res.rs(pn);
}
return res.rs(sz(a)), res;
}
poly pow(int x, int rx = -1){ // x : the power % mod; rx : the power % (mod - 1)if(rx == -1) rx = x;
int cnt = 0;
while (a[cnt] == 0 && cnt < sz(a)) cnt += 1;
poly res = (*this);
Fo(i, cnt, sz(a) - 1) res[i - cnt] = res[i];
Fo(i, sz(a) - cnt, sz(a) - 1) res[i] = 0;
int c = res[0], w = qpow (res[0]);
Fo(i, 0, sz(res) - 1) res[i] = (ll) res[i] * w % mod;
res = res.Ln();
Fo(i, 0, sz(res) - 1) res[i] = (ll) res[i] * x % mod;
res = res.Exp();
c = qpow (c, rx);
Fo(i, 0, sz(res) - 1) res[i] = (ll) res[i] * c % mod;
if((ll) cnt * x > sz(a)) Fo(i, 0, sz(a) - 1) res[i] = 0;
elseif(cnt) {
Rep(i, sz(a) - cnt * x - 1, 0) res[i + cnt * x] = res[i];
Fo(i, 0, cnt * x - 1) res[i] = 0;
}
return res;
}
poly sqrt(int rt = 1){
poly res(1), f;
res[0] = rt;
for(int m = 1, pn; m < sz(a); m <<= 1) {
pn = min(m << 1, sz(a)), f.rs(pn);
for(int i = 0; i < pn; i++) f[i] = (*this).v(i);
f += res * res, f.rs(pn), res.rs(pn), res = f * res.Inv(), res.rs(pn);
for(int i = 0; i < pn; i++) res[i] = (ll) res[i] * inv2 % mod;
}
return res;
}
voidRev(){
reverse(a.begin(), a.end());
}
friend pair < poly, poly > div (poly f, poly g) { /* f / g = first, f % g = second */
f.rs(max(sz(f), sz(g))), f.Rev(), g.Rev();
int n = sz(f), m = sz(g);
poly A = g.Rs(n - m + 1).Inv(), t;
A *= f.Rs(n - m + 1), A.rs(n - m + 1), A.Rev(), g.Rev(), f.Rev(), t = f - A * g, t.rs(m - 1);
returnmake_pair(A, t);
}
};
动态规划
01背包模型
constint N = 100010;
int dp[N], w[N], v[N];
intmain(){
int n,m;
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
}
完全背包模型
constint N = 100010;
int dp[N], w[N], v[N];
intmain(){
int n,m;
for(int i=1;i<=n;i++){
for(int j=w[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
}
多重背包模型
int f[1010];
int a[10005],b[10005],c[10005]; //体积、价值、次数int cnt,co[1000005],v[1000005];//尽可能开大,不要把空间开爆了 二进制优化后体积,价值intmain(){
int n,m;
//输入 a,b,c;//auto pre = [&](){
for(int i=1;i<=n;i++) {
int t=1;
while(c[i]) {
co[++cnt]=t*a[i];
v[cnt]=t*b[i];
c[i]-=t; t*=2;
if(c[i]<t) {//如果剩下的不能再拆,就直接放在一起
co[++cnt]=a[i]*c[i];
v[cnt]=b[i]*c[i];
break;
}
}
}
};
pre();
//01背包板子for(int i=1;i<=cnt;i++){
for(int j=m;j>=co[i];j--){
f[j]=max(f[j],f[j-co[i]]+v[i]);
}
}
//
}
最长公共子序列
#include<bits/stdc++.h>usingnamespace std;
//最长公共子序列constint N=101000;
int a[N],ind[N],n;
intmain(){
cin>>n;
int tmp;
memset(a,0x3f,sizeof(a));
for (int i=1;i<=n;i++){
cin>>tmp;
ind[tmp]=i;
}
for (int i=1;i<=n;i++){
cin>>tmp;
int x=ind[tmp];
*lower_bound(a+1,a+n+1,x)=x;
}
cout<<(lower_bound(a+1,a+n+1,a[0])-a-1);
return0;
}
structODT {
structnode {
int l, r;
mutable ll v;
node(int l, int r = -1, ll v = 0) : l(l), r(r), v(v) {}
booloperator<(const node &o) const {
return l < o.l;
}
};
set<node> s;
int sum=0;//区间一次和(特殊)ODT() {
s.clear();
}
autosplit(int pos){
auto it = s.lower_bound(node(pos));
if (it != s.end() && it->l == pos) return it;
it--;
int l = it->l, r = it->r;
ll v = it->v;
s.erase(it);
s.insert(node(l, pos - 1, v));
return s.insert(node(pos, r, v)).first;
}
//区间赋值voidassign(int l, int r, ll x){
auto itr = split(r + 1), itl = split(l) , it=itl;
for(;itl!=itr;++itl){
sum-=itl->v*(itl->r-itl->l+1);
}
s.erase(it, itr);
s.insert(node(l, r, x));
sum+=x*(r-l+1);
}
//区间加voidadd(int l, int r, ll x){
auto itr = split(r + 1), itl = split(l);
for (auto it = itl; it != itr; it++) {
it->v += x;
}
}
//区间第k小ll kth(int l, int r, int k){
vector<pair<ll, int>> a;
auto itr = split(r + 1), itl = split(l);
for (auto it = itl; it != itr; it++) {
a.push_back(pair<ll, int>(it->v, it->r - it->l + 1));
}
sort(a.begin(), a.end());
for (auto x : a) {
auto val = x.first;
auto len = x.second;
k -= len;
if (k <= 0) return val;
}
return0;
}
ll power(ll a, int b, int mod){
a %= mod;
ll res = 1;
for (; b; b /= 2, a = a * a % mod) {
if (b % 2) {
res = res * a % mod;
}
}
return res;
}
//区间幂次和ll powersum(int l, int r, int x, int mod){
auto itr = split(r + 1), itl = split(l);
ll ans = 0;
for (auto it = itl; it != itr; it++) {
ans = (ans + power(it->v, x, mod) * (it->r - it->l + 1) % mod) % mod;
}
return ans;
}
//区间一次和ll sum_one(int l,int r,ll mod){
ll ret=0;
auto itl=split(l),itr=split(r+1);
for(;itl!=itr;itl++){
ret=(ret+(itl->r-itl->l+1)*itl->v)%mod;
}
return ret;
}
//匹配暴力搜索(质数搭配欧拉筛)// void query(int l,int r){// auto itr=split(r+1),itl=split(l);// int res = 0;// for (; itl != itr; itl ++ ){// if (itl->v <= 1e7 && !st[itl->v])// res += itl->r - itl->l + 1;// }// cout<<res<<"\n";// }
};
ODT++
//ODT++const ll MOD = 1e9+7;
structnode {
int l, r;
mutable ll v;
node(int l=0, int r = -1, ll v = 0) : l(l), r(r), v(v) {}
booloperator<(const node &o) const {
return l < o.l;
}
};
#define MAXN 500010
node a[MAXN],b[MAXN];
structODT {
set<node> s;
ODT() {
s.clear();
}
autosplit(int pos){
auto it = s.lower_bound(node(pos));
if (it != s.end() && it->l == pos) return it;
it--;
int l = it->l, r = it->r;
ll v = it->v;
s.erase(it);
s.insert(node(l, pos - 1, v));
return s.insert(node(pos, r, v)).first;
}
//区间赋值[推平]voidassign(int l, int r, ll x){
auto itr = split(r + 1), itl = split(l) , it=itl;
s.erase(it, itr);
s.insert(node(l, r, x));
}
//区间加[l~r]每一个数加xvoidadd(int l, int r, ll x){
auto itr = split(r + 1), itl = split(l);
for (auto it = itl; it != itr; it++) {
(it->v += x)%=MOD;
}
}
//区间第k小ll kth(int l, int r, int k){
vector<pair<ll, int>> a;
auto itr = split(r + 1), itl = split(l);
for (auto it = itl; it != itr; it++) {
a.push_back(pair<ll, int>(it->v, it->r - it->l + 1));
}
sort(a.begin(), a.end());
for (auto x : a) {
auto v = x.first;
auto len = x.second;
k -= len;
if (k <= 0) return v;
}
return0;
}
ll power(ll a, int b){
a %= MOD;
ll res = 1;
for (; b; b /= 2, a = a * a % MOD) {
if (b % 2) {
res = res * a % MOD;
}
}
return res;
}
//区间幂次和ll powersum(int l, int r, int x){
auto itr = split(r + 1), itl = split(l);
ll ans = 0;
for (auto it = itl; it != itr; it++) {
ans = (ans + power(it->v, x) * (it->r - it->l + 1) % MOD) % MOD;
}
return ans;
}
//区间一次和ll sum_one(int l,int r){
ll ret=0;
auto itl=split(l),itr=split(r+1);
for(;itl!=itr;itl++){
(ret+=(ll)(itl->r-itl->l+1)*itl->v)%=MOD;
}
return ret;
}
// 匹配暴力搜索(质数搭配欧拉筛)voidquery(int l,int r){
auto itr=split(r+1),itl=split(l);
int res = 0;
for (; itl != itr; itl ++ ){
// if (itl->v <= 1e7 && !st[itl->v])// res += itl->r - itl->l + 1;
}
cout<<res<<"\n";
}
voidinsert(constint& x,vector<int>& a){
for(int i=1;i<=x;++i){
s.insert(node(i,i,a[i]));
}
}
voidinsert(int l,int r,int v){
s.insert(node{l,r,v});
}
voidcopy(int l1,int r1,int l2,int r2){
auto it1r=split(r1+1),it1l=split(l1);
int len=0;
for(auto it=it1l;it!=it1r;++it)
{
a[++len].l=it->l;
a[len].r=it->r;
a[len].v=it->v;
}
auto it2r=split(r2+1),it2l=split(l2);
s.erase(it2l,it2r);
for(int i=1;i<=len;++i)
{
s.insert(node(a[i].l - l1 + l2,a[i].r - l1 + l2,a[i].v));
}
}
voidSwap(int l1,int r1,int l2,int r2){
if(l1>l2){swap(l1,l2);swap(r1,r2);}
int len1=0,len2=0;
auto it1r=split(r1+1),it1l=split(l1);
for(auto it=it1l;it!=it1r;++it)
{
a[++len1].l=it->l;
a[len1].r=it->r;
a[len1].v=it->v;
}
auto it2r=split(r2+1),it2l=split(l2);
for(auto it=it2l;it!=it2r;++it)
{
b[++len2].l=it->l;
b[len2].r=it->r;
b[len2].v=it->v;
}
it1r=split(r1+1),it1l=split(l1);
s.erase(it1l,it1r);
it2r=split(r2+1),it2l=split(l2);
s.erase(it2l,it2r);
for(int i=1;i<=len2;++i)s.insert(node(b[i].l - l2 + l1,b[i].r - l2 + l1,b[i].v));
for(int i=1;i<=len1;++i)s.insert(node(a[i].l - l1 + l2,a[i].r - l1 + l2,a[i].v));
}
voidreverse(int l,int r){
if(l>r)swap(l,r);
auto it2=split(r+1),it1=split(l);
int len=0;
for(auto it=it1;it!=it2;++it)
{
a[++len].l=it->l;
a[len].r=it->r;
a[len].v=it->v;
}
s.erase(it1,it2);
for(int i=1;i<=len;++i)
{
s.insert(node(r-a[i].r+l, r-a[i].l+l, a[i].v));
}
}
voidprint(int n){
for(auto it=s.begin();it!=s.end()&&it->r<=n;++it){
for(int i=it->l;i<=it->r;++i) cout<<it->v<<" ";
}
cout<<"\n";
}
};
树状数组
template <typename T>
structFenwick {
int n;
vector<T> w;
Fenwick(int n) {
this->n = n;
w.resize(n + 1);
}
voidadd(int x, T k){
for (; x <= n; x += x & -x) {
w[x] += k;
}
}
voidadd(int x, int y, T k){ // 区间修改add(x, k), add(y + 1, -k);
}
T ask(int x){ //单点查询auto ans = T();
for (; x; x -= x & -x) {
ans += w[x];
}
return ans;
}
T ask(int x, int y){ // 区间查询(区间和)returnask(y) - ask(x - 1);
}
intkth(T k){ //查找第k大的值int ans = 0;
for (int i = __lg(n); i >= 0; i--) {
int val = ans + (1 << i);
if (val < n && w[val] < k) {
k -= w[val];
ans = val;
}
}
return ans + 1;
}
};
//逆序对封装template <typename T>
structBIT {
int n;
vector<int> w;
BIT() {}
voidadd(int x, int k){
for (; x <= n; x += x & -x) {
w[x] += k;
}
}
intask(int x){
int ans = 0;
for (; x; x -= x & -x) {
ans += w[x];
}
return ans;
}
intask(int x, int y){
returnask(y) - ask(x - 1);
}
intget(auto val){ // 获取逆序对数量this->n = val.size() - 1; // 注意 n 不能 +1
w.resize(n + 1);
vector<pair<int, int>> alls;
for (int i = 1; i <= n; i++) {
alls.emplace_back(val[i], i);
}
sort(alls.begin(), alls.end());
int ans = 0;
for (auto [val, idx] : alls) {
ans += ask(idx + 1, n);
add(idx, 1);
}
return ans;
}
};
二维树状数组
//基础封装template<typename T>
structFenwick2D {
int n, m;
vector<vector<T>> w;
Fenwick2D(int n, int m) : n(n), m(m) {
w.resize(n + 1, vector<T>(m + 1));
}
voidadd(int x, int y, T k){
for (int i = x; i <= n; i += i & -i) {
for (int j = y; j <= m; j += j & -j) {
w[i][j] += k;
}
}
}
voidadd(int x, int y, int X, int Y, T k){ // 区块修改:二维差分
X++, Y++;
add(x, y, k), add(X, y, -k);
add(X, Y, k), add(x, Y, -k);
}
T ask(int x, int y){ // 单点查询
T ans = 0;
for (int i = x; i; i -= i & -i) {
for (int j = y; j; j -= j & -j) {
ans += w[i][j];
}
}
return ans;
}
T ask(int x, int y, int X, int Y){ // 区块查询:二维前缀和
x--, y--;
returnask(X, Y) - ask(x, Y) - ask(X, y) + ask(x, y);
}
};
//操作全支持,时间复杂度*4template<typename T>
structFenwick2D {
int n, m;
vector<vector<T>> b1, b2, b3, b4;
Fenwick2D(int n, int m) : n(n), m(m) {
b1.resize(n + 1, vector<T>(m + 1));
b2.resize(n + 1, vector<T>(m + 1));
b3.resize(n + 1, vector<T>(m + 1));
b4.resize(n + 1, vector<T>(m + 1));
}
voidadd(auto &w, int x, int y, T k){ // 单点修改for (int i = x; i <= n; i += i & -i) {
for (int j = y; j <= m; j += j & -j) {
w[i][j] += k;
}
}
}
voidadd(int x, int y, T k){ // 多了一步计算add(b1, x, y, k);
add(b2, x, y, k * (x - 1));
add(b3, x, y, k * (y - 1));
add(b4, x, y, k * (x - 1) * (y - 1));
}
voidadd(int x, int y, int X, int Y, T k){ // 区块修改:二维差分
X++, Y++;
add(x, y, k), add(X, y, -k);
add(X, Y, k), add(x, Y, -k);
}
T ask(auto &w, int x, int y){ // 单点查询
T ans = 0;
for (int i = x; i; i -= i & -i) {
for (int j = y; j; j -= j & -j) {
ans += w[i][j];
}
}
return ans;
}
T ask(int x, int y){ // 多了一步计算
T ans = 0;
ans += x * y * ask(b1, x, y);
ans -= y * ask(b2, x, y);
ans -= x * ask(b3, x, y);
ans += ask(b4, x, y);
return ans;
}
T ask(int x, int y, int X, int Y){ // 区块查询:二维前缀和
x--, y--;
returnask(X, Y) - ask(x, Y) - ask(X, y) + ask(x, y);
}
};
constexprint N = 1000010;
int son[N][26],idx,cnt[N];
voidinsert(string str){
int p=0;
for(int i=0;i<str.size();i++){
int u=str[i]-'a';
if(!son[p][u]){
son[p][u]=++idx;
}
p=son[p][u];
}
cnt[p]++;
}
intquery(string str){
int p=0;
for(int i=0;i<str.size();i++){
int u=str[i]-'a';
if(!son[p][u]){
return0;
}
p=son[p][u];
}
// cnt[p]++;return cnt[p];
}
01trie
constint N = 100010;
int ch[31*N][2];
structTrie {
int n, idx;
Trie(int n) {
this->n = n;
idx = 0;
}
voidinsert(int x){
int u = 0;
for (int i = 30; ~i; i--) {
int &v = ch[u][x >> i & 1];
if (!v) v = ++idx;
u = v;
}
}
intquery(int x){
int u = 0, res = 0;
for (int i = 30; ~i; i--) {
int v = x >> i & 1;
if (ch[u][!v]) {
res += (1 << i);
u = ch[u][!v];
} else {
u = ch[u][v];
}
}
return res;
}
};
AC automaton
structAhoCorasick {
staticconstexprint ALPHABET = 26;
structNode {
int len;
int link;
std::array<int, ALPHABET> next;
Node() : link{}, next{} {}
};
std::vector<Node> t;
AhoCorasick() {
init();
}
voidinit(){
t.assign(2, Node());
t[0].next.fill(1);
t[0].len = -1;
}
intnewNode(){
t.emplace_back();
return t.size() - 1;
}
intadd(const std::vector<int> &a){
int p = 1;
for (auto x : a) {
if (t[p].next[x] == 0) {
t[p].next[x] = newNode();
t[t[p].next[x]].len = t[p].len + 1;
}
p = t[p].next[x];
}
return p;
}
intadd(const std::string &a, char offset = 'a'){
std::vector<int> b(a.size());
for (int i = 0; i < a.size(); i++) {
b[i] = a[i] - offset;
}
returnadd(b);
}
voidwork(){
std::queue<int> q;
q.push(1);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < ALPHABET; i++) {
if (t[x].next[i] == 0) {
t[x].next[i] = t[t[x].link].next[i];
} else {
t[t[x].next[i]].link = t[t[x].link].next[i];
q.push(t[x].next[i]);
}
}
}
}
intnext(int p, int x){
return t[p].next[x];
}
intnext(int p, char c, char offset = 'a'){
returnnext(p, c - 'a');
}
intlink(int p){
return t[p].link;
}
intlen(int p){
return t[p].len;
}
intsize(){
return t.size();
}
};
Manacher
structManacher{
string s;
Manacher(string str):s(str){}
vector<int> work(){
int n = s.length();
string t = "-#";
for (int i = 0; i < n; i++) {
t += s[i];
t += '#';
}
int m = t.length();
t += '+';
int mid = 0, r = 0;
vector<int> p(m);
for (int i = 1; i < m; i++) {
p[i] = i < r ? min(p[2 * mid - i], r - i) : 1;
while (t[i - p[i]] == t[i + p[i]]) p[i]++;
if (i + p[i] > r) {
r = i + p[i];
mid = i;
}
}
return p;
}
intgetMax(){
int maxn=-INF;
auto res=work();
for(auto &v:res){
maxn=max(maxn,v-1);
}
return maxn;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具