背包问题 DP

各种各样的基础背包

0-1 背包

非常朴素,复杂度 \(O(nV)\)

void z_o_pack(int c,int v)
{for(int i=V;i>=c;i--)dp[i]=max(dp[i],dp[i-c]+v);
}

完全背包

复杂度 \(O(nV)\)

void comp_pack(int c,int v)
{for(int i=c;i<=V;i++)dp[i]=max(dp[i],dp[i-c]+v);
}

多重背包

单调队列优化

\(dp[i][j]\) 表示前 \(i\) 个物品放入容量为 \(j\) 的背包的最大收益 。

\[dp[i][j]=\max_{k=0}^{k\le k[i]}{\{dp[i-1][j-k\times c[i]]+k\times w[i]\}} \]

考虑 \(dp\) 的转移 。

\[0\le p < c[i],0\le j \le \left\lfloor \dfrac{V-p}{c[i]}\right\rfloor,0\le k \le k[i] \]
\[dp[i][p+j\times c]=\max{\{dp[i-1][p+(j-k)\times c]+k\times w\}} \]
\[dp[i][p+j\times c]=\max{\{dp[i-1][p+(j-k)\times c]-(j-k)\times w+j\times w\}} \]
\[dp[i][p+j\times c]=\max{\{dp[i-1][p+(j-k)\times c]-(j-k)\times w\}}+j\times w \]

这样就可以进行单调队列优化了 。

复杂度可以达到 \(nV\)

int ql,qr;
struct QUE
{int num,val;
}que[Maxv];
void many_pack(int c,int w,int m)
{if(!c) { add+=m*w; return; }m=min(m,V/c);for(int pos=0,s;pos<c;pos++){ql=1,qr=0,s=(V-pos)/c;for(int j=0;j<=s;j++){while(ql<=qr && que[qr].val<=(dp[pos+j*c]-j*w)) qr--;que[++qr]=(QUE){j,dp[pos+j*c]-j*w};while(ql<=qr && (j-que[ql].num)>m) ql++;dp[pos+j*c]=max(dp[pos+j*c],que[ql].val+j*w);}}
}

二进制分组

咕咕咕

多维限制背包

只是多加几位,没有太大区别。

混合三种背包的问题

for(int i=1;i<=n;i++)
{if(/*是0-1背包*/) z_o_pack(c[i],w[i]);if(/*是完全背包*/) comp_pack(c[i],w[i]);if(/*是多重背包*/) many_pack(c[i],w[i],m[i]);
}

分组背包

同一组内只能选一个物品。

for(int i=1;i<=n;i++)for(int j=V;j>=0;j--)for(int k=1;k<=cnt[i];k++) if(j>=c[i][k])dp[j]=max(dp[j],dp[j-c[i][k]]+w[i][k]);

这样保证每一组内只会选择一个。

很多背包问题都能都转化为分组背包。

树形依赖背包

复杂度:\(O(n^2)\)

虽然有三层循环,但是内层运算总量与整棵子树内点对个数一致。

void dfs(int x,int fa)
{dp[x][1]=w[i],siz[x]=1;for(int i=hea[x];i;i=nex[i]){if(ver[i]==fa) continue;dfs(ver[i],x);siz[x]+=siz[ver[i]];for(int j=min(V+1,siz[x]);j>=2;j--) // 注意要从大到小枚举,防止后效性for(int k=1;j-k>=1;k++)dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[ver[i]][k]);}
}for(int i=1;i<=n;i++) if(!ind[i]) add(0,i); // 给出的图是一个森林
dfs(0,-1);
printf("%d\n",dp[0][V+1]);

注意:想这一类题目时只用考虑如何设置 \(dp_{i,j}\) ?初始状态是什么?如何转移?

泛化物品

即一个物品的价值与消耗都会随着加入位置、时间的改变而改变。

注意:既然物品的价值随着加入位置而改变,应该现将物品排序再加入。


不同问法的背包问题

输出方案

记录从哪一项转移过来即可

求字典序最小的方案

咕咕咕

求方案总数

\(\max\) 改为 \(sum\) ,其余不变(此时求出的方案数,包括物品总价不是最大的情况)

求最优方案总数

咕咕咕

求次优解、第K优解

咕咕咕


常见例题:

多种背包混合

P1941 飞扬的小鸟

$\texttt{solution}$

算法:\(01\) 背包 \(+\) 完全背包 。

状态:设 \(dp[i][j]\) 表示横坐标为 \(i\) 高度为 \(j\) 的最少点击次数 。

  1. 上升 :完全背包 转移方式

  2. 下降 :\(01\) 背包 转移方式

  3. 超过 \(m\) 变为 \(m\) : 特判

代码:

for(int i=1;i<=n;i++) Low[i]=1,High[i]=m;
for(int i=1;i<=k;i++) p=rd(),e[p]=1,Low[p]=rd()+1,High[p]=rd()-1;
memset(g,inf,sizeof(g));
for(int i=1;i<=m;i++) g[i]=0;
for(int i=1;i<=n;i++)
{memset(f,inf,sizeof(f));for(int j=x[i];j<=x[i]+m;j++) f[j]=min(f[j-x[i]]+1,g[j-x[i]]+1); // 完全背包for(int j=m+1;j<=m+x[i];j++) f[m]=min(f[j],f[m]); // 特判超过 mfor(int j=1;j<=m-y[i];j++) f[j]=min(f[j],g[j+y[i]]); // 01 背包for(int j=1;j<Low[i];j++) f[j]=inf;for(int j=High[i]+1;j<=m;j++) f[j]=inf; // 不可行方案if(e[i]) for(int j=Low[i];j<=High[i];j++) if(f[j]<inf) { cnt++; break; } // 统计通过的管道数memcpy(g,f,sizeof(g));
}
for(int i=1;i<=m;i++) ans=min(ans,g[i]);
if(ans!=inf) printf("1\n%d\n",ans);
else printf("0\n%d\n",cnt);

合并两个限制条件相同的背包

P4095 [HEOI2013]Eden 的新背包问题

题意:给定 \(n\) 种物品,每种有 \(m_i\) 件,每一件价值为 \(v_i\) ,重量为 \(c_i\) 。由于某些原因,在第 \(i\) 个询问中,第 \(i\) 种物品不能选择,请对于每个询问求出当前条件下的最大收益。

其中, \(n\le 1000,c_i\le 100\)

考虑从前往后、从后往前进行背包。

在第 \(i\) 个询问中合并 \(pre[i-1]\)\(suf[i+1]\) 的背包。

for(int j=0;j<=v;j++) ans=max(ans,dp[0][num-1][j]+dp[1][num+1][v-j]);

当组内重量、价值连续时分组背包的前缀和优化

CF1559E Mocha and Stars

题意:

求有多少长 \(n\) 的序列 \(a\) 满足:

  • \(l_i\le a_i\le r_i\)
  • \(\sum_{i=1}^{n}a_i\le m\)
  • \(\gcd(a_1,\dots,a_n)=1\)

答案对 \(998244353\) 取模。

\(f(a_1,a_2,a_3,\dots,a_n)\) 是否是一个满足前两个条件的序列。

\[\begin{aligned}ans & = \sum\limits_{a_1=l_1}^{r_1}\sum\limits_{a_2=l_2}^{r_2}...\sum\limits_{a_n=l_n}^{r_n}f(a_1,a_2,...,a_n)[\gcd(a_1,a_2,...,a_n)=1] \\ & = \sum\limits_{a_1=l_1}^{r_1}\sum\limits_{a_2=l_2}^{r_2}...\sum\limits_{a_n=l_n}^{r_n}f(a_1,a_2,...,a_n)\sum\limits_{d\mid \gcd(a_1,a_2,...,a_n)}\mu(d)\\ &= \sum\limits_{a_1=l_1}^{r_1}\sum\limits_{a_2=l_2}^{r_2}...\sum\limits_{a_n=l_n}^{r_n}f(a_1,a_2,...,a_n)\sum\limits_{d\mid a_1 \& d\mid a_2 \& ... \& d\mid a_n}\mu(d) \\&= \sum\limits_{d=1}^m\mu(d) \sum\limits_{a_1=\left\lceil \frac{l_1}{d}\right \rceil}^{\left\lfloor \frac{r_1}{d}\right\rfloor}\sum\limits_{a_2\left\lceil \frac{l_2}{d}\right \rceil}^{\left\lfloor \frac{r_2}{d}\right\rfloor}...\sum\limits_{a_n=\left\lceil \frac{l_n}{d}\right \rceil}^{\left\lfloor \frac{r_n}{d}\right\rfloor}f(a_1,a_2,...,a_n)\end{aligned} \]

之后相当于一个分组背包,有 \(n\) 件物品,每一件都在 \([l_i,r_i]\) 之间,去除不超过 \(m\) 的重量,求方案数。

$\texttt{code}$
#include<bits/stdc++.h>
using namespace std;
#define infll 0x7f7f7f7f7f7f7f7fll
#define inf 0x3f3f3f3f
#define Maxn 55
#define Maxm 100005
#define mod 998244353
#define int long long
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
ll maxll(ll x,ll y){ return x>y?x:y; }
ll minll(ll x,ll y){ return x<y?x:y; }
ll absll(ll x){ return x>0ll?x:-x; }
ll gcd(ll x,ll y){ return (y==0)?x:gcd(y,x%y); }
int n,m,tot;
int L[Maxn],R[Maxn],l[Maxn],r[Maxn];
int dp[Maxm],tmp[Maxm],pri[Maxm],mu[Maxm];
ll ans;
bool vis[Maxm];
signed main()
{//ios::sync_with_stdio(false); cin.tie(0);//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=rd(),m=rd();for(int i=1;i<=n;i++) L[i]=rd(),R[i]=rd();vis[1]=mu[1]=true;for(int i=2;i<Maxm;i++){if(!vis[i]) mu[i]=-1,pri[++tot]=i;for(int j=1;j<=tot && i*pri[j]<Maxm;j++){vis[i*pri[j]]=true;if(i%pri[j]==0) break;mu[i*pri[j]]=-mu[i];}}for(int d=1,MAX;d<=m;d++) if(mu[d]){MAX=m/d;for(int i=1;i<=n;i++) l[i]=(L[i]+d-1)/d,r[i]=R[i]/d;for(int i=0;i<=MAX;i++) dp[i]=1;for(int i=1;i<=n;i++){for(int j=0;j<=MAX;j++) tmp[j]=0;for(int j=l[i];j<=MAX;j++){tmp[j]=dp[j-l[i]];if(j>r[i]) tmp[j]=(tmp[j]-dp[j-r[i]-1]+mod)%mod;}dp[0]=0;for(int j=1;j<=MAX;j++) dp[j]=(dp[j-1]+tmp[j])%mod;}ans=(ans+1ll*dp[MAX]*mu[d]%mod+mod)%mod;}printf("%d\n",ans);//fclose(stdin);//fclose(stdout);return 0;
}

一分为二

P1651 塔

题意:有 \(n\) 个数,从中选出两个集合(可以有剩余),使两个数集中的数字之和相等。

!!!这不是一道背包问题,因为可以有剩余,所以更具判断 \(dp[sum]\ne -1\)\(dp[2\times sum]\ne -1\) 是错的。

选出的 \(2\times sum\)\(sum\) 不一定是包含关系。

应该用普通 \(\text{DP}\) 解决。

(当然,当 \(n\) 非常小的时候,可以直接使用 meet in the middle 解决问题) 如:P3067 [USACO12OPEN]Balanced Cow Subsets G

两种限制/收益的问题

将数组下标的一位设为 “任务一” 的值,而将数组内容设为 “任务二” 的最小 \(/\) 最大值。

输出答案的时候将下标与值取和、最小、最大……

P2224 [HNOI2001]产品加工

\(\rightarrow\) P2224 solution

\(dp[i][j]\) 表示加到 \(i\) 为止,机器 \(1\) 使用了 \(j\) 的时间,而 \(dp[i][j]\) 值表示机器 \(2\) 消耗的时间。

跑背包。

n=rd();
memset(dp,inf,sizeof(dp)),dp[0][0]=0;
for(int i=1,x,y,z,opt,pre;i<=n;i++)
{x=rd(),y=rd(),z=rd(),opt=i&1,pre=opt^1;MAX+=max(x,max(y,z));for(register int j=0;j<=MAX;j++) dp[opt][j]=inf; // 防止上一次的值影响for(register int j=0;j<=MAX;j++){if(y) dp[opt][j]=min(dp[opt][j],dp[pre][j]+y);if(j>=x && x) dp[opt][j]=min(dp[opt][j],dp[pre][j-x]);if(j>=z && z) dp[opt][j]=min(dp[opt][j],dp[pre][j-z]+z);}
}
for(int i=0;i<=MAX;i++) ans=min(ans,max(dp[n&1][i],i));
printf("%d\n",ans);

P2340 [USACO03FALL]Cow Exhibition G

题意:有 \(n\) 头奶牛,每一头奶牛有一个情商值和智商值,现在要从中选出若干头奶牛。在奶牛的情商和与智商和都不小于 \(0\) 的情况下,求出情商与智商之和的最大值。

(需要滚动数组)设 \(dp[j]\) 表示在前 \(i\) 头奶牛中选出情商为 \(j\) 时的智商最大值为 \(dp[j]\)

暴力转移。

最后在 \(i>0\) 的情况下,计算 \(i+dp[i]\) 的最大值。

比较复杂的题目

P3891 [GDOI2014]采集资源

先进行一次 \(\text{DP}\) 求出 \(dp1[i]\) 数组,表示花费 \(i\) 能够获得的最大劳动力。

之后进行第二次 \(\text{DP}\) 求出 \(dp2[i][j]\) ,表示在第 \(i\) 时间花费 \(j\) 能获得最大劳动力(单位时间内的收获最多)。转移方程:

\[dp[i+1][j-k+dp1[k]+dp2[i][j]]=\max(dp[i+1][j-k+dp1[k]+dp2[i][j]],dp[k]+dp[i][j]) \]

在求出 \(dp2\) 的同时比较此时是否能使收益 \((j-k+dp[k]+dp[i][j])\) 大于 \(t\) ,及时输出。

注意:初始化使需将数组赋值为不可能取到的值,以防错误转移。

P2481 [SDOI2010]代码拍卖会

对于任何一个猪猪举牌的方案,都可以看做 \(9\) 个以内的若干 “\(1\) 的后缀” 相加而成!

我们可以把一个数分割成若干个 \(000000\dots 11111\) 的和。

不妨记 \(cnt(i)\)\(\pmod p\) 意义下 \([\text{余数是 i 的“1 的后缀”}]\) 的数量。

之后完成一个背包就好了。

\(dp(i,j,k)\) 表示当前考虑到余数为 \(i\) 的 “\(1\) 的后缀” ,此前已经放上了 \(j\) 个 “\(1\) 的后缀” ,此时构成的数字的 \(\pmod p\) 的余数是 \(k\) 的方案数。

初始化:全部填 \(1\)\(n\) 位数对 \(p\) 取模后的状态。(注意这里的处理!!!就是这里卡了 \(4~Hours\) )

设:

  • \(put\) 表示放入 \(put\) 个余数为 \(i\) 的 “\(1\) 的后缀” 。
  • \(Left\) 表示放入前已经有了 \(Left\) 的余数。
  • \(d\) 表示在放入前已经有 \(s\) 个数了。
  • 二项式表示从所有余数为 \(i\) 的 “\(1\) 的后缀” 取出 \(put\) 个的方案数(证明见数论基础)。

转移方程:

\[dp(i,s+put,(Left+i\times put)\%p)+=\dbinom{cnt(i)+put-1}{put}\times \sum\limits dp(i-1,s,Left) \]
$\texttt{code}$
#define Maxp 505
#define mod 999911659
ll n,p,len,add;
ll cnt[Maxp],Last_pos[Maxp],inv[11];
ll f[11][Maxp],g[11][Maxp];
ll C(ll x,ll y)
{ll ret=1;for(ll i=x;i>=x-y+1;i--) ret=ret*i%mod;for(ll i=y;i>=2;i--) ret=ret*inv[i]%mod;return ret;
}
void pre_cnt()
{ll st,addn;for(ll i=1,tmp=0;i<=p+p;i++){tmp=(tmp*10+1)%p;if(Last_pos[tmp]) { st=Last_pos[tmp]-1,len=i-Last_pos[tmp]; break; }addn=tmp,Last_pos[tmp]=i; // 这里!!! }if(n<st) for(int i=1,tmp=0;i<=n;i++) tmp=(tmp*10+1)%p,cnt[tmp]++,addn=tmp;else{ll Times=(n-st)/len,ed=(n-st)%len+st;if((n-st)%len==0) ed=0; // 这里!!! for(int i=1,tmp=0;i<=st+len;i++){tmp=(tmp*10+1)%p;if(i==ed) addn=tmp; // 这里!!! if(i<=st) cnt[tmp]++;else{cnt[tmp]=(cnt[tmp]+Times)%mod;if(i<=ed) cnt[tmp]=(cnt[tmp]+1)%mod;}}}f[0][addn]=1;
}
ll Dp()
{for(int i=0;i<p;i++){memcpy(g,f,sizeof(f)),memset(f,0,sizeof(f));for(int s=0;s<9;s++) for(int Put=0;s+Put<9;Put++){ll mul=C(cnt[i]+Put-1,Put);for(int Left=0;Left<p;Left++)f[s+Put][(Left+i*Put)%p]=(f[s+Put][(Left+i*Put)%p]+mul*g[s][Left]%mod)%mod;}}ll ret=0;for(int i=0;i<9;i++) ret=(ret+f[i][0])%mod;return ret;
}
int main()
{scanf("%lld%lld",&n,&p);inv[0]=inv[1]=1; for(ll i=2;i<=10;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;pre_cnt();printf("%lld\n",Dp());return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5081 Tweetuzki爱取球(期望)(线性求逆元)

文章目录题目描述解析代码题目描述 解析 首先有一个很重要的引理&#xff1a; 若一件事做成的概率是p&#xff0c;则其做成需要次数的期望是1/p 为什么呢&#xff1f; 我们设做成这件事的期望次数是x 就可以列出方程&#xff1a; x1p∗0(1−p)∗xx1p*0(1-p)*xx1p∗0(1−p)∗x …

Matlab与线性代数

文章目录多项式求解1.2 多项式四则运算1.3 多项式的分解与合并行列式求解3、矩阵基本运算➢ 3.2 矩阵的取块和变换➢ 3.3 矩阵的基本运算4、求解线性方程组多项式求解 ➢ 1.1 多项式表达式与根 有关多项式函数表达式与根的Matlab命令&#xff1a; poly2sym 返回由多项式系数转…

【 CF1186D,E,F】Vus the Cossack and Numbers/Vus the Cossack and a Field/Vus the Cossack and a Graph

太ex了&#xff0c;哭了哭了orz 后面两道平均一道花了我一天啊&#xff01; 文章目录D&#xff1a;Vus the Cossack and Numbers题意翻译题解代码实现E&#xff1a;Vus the Cossack and a Field题意翻译题解代码实现F:Vus the Cossack and a Graph题目暴力题解代码实现官方题解…

IdentityServer4与ocelot实现认证与客户端统一入口

关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了。ocelot与IdentityServer4组合认证博客园里也有很多&#xff0c;但大多使用ocelot内置的认证&#xff0c;而且大多都是用来认证API的&#xff0c;查找了很多资料也没看到如何认证oidc&#xff0c;所以这里…

CF1556D-Take a Guess【交互】

正题 题目链接:https://codeforces.com/contest/1556/problem/D 题目大意 现在有nnn个你不知道的数字&#xff0c;你有两种询问操作 询问两个下标的数字的andandand询问两个下标的数字的ororor 要求在2n2n2n次操作以内求出第kkk小的数字 1≤n≤104,0≤ai≤1091\leq n\leq 1…

YBTOJ:彩球抽取(期望)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;可以使用dp解决本题 设fi,j,k&#xff1a;操作i轮之后编号j的小球有k个的概率 转移和统计答案就都不难了 但是还有一个问题 不难发现这个题循环下去是可以无穷无尽的 所以限定一个i的上界&#xff08;如500000&#xf…

魔改森林

题意&#xff1a; 曾经有一道叫做迷雾森林的题目&#xff0c;然而牛牛认为地图中的障碍太多&#xff0c;实在是太难了&#xff0c;所以删去了很多点&#xff0c;出了这道题。 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n1,1)&#xff0c;终点在右上角的格点…

基于IdentityServer4 实现.NET Core的认证授权

IdentityServer4是什么&#xff1f;IdentityServer4是基于ASP.NET Core实现的认证和授权框架&#xff0c;是对OpenID Connect和OAuth 2.0协议的实现。OpenID Connect 和 OAuth2.0是什么OpenID Connect:OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth …

常见存储、查找算法

存储 散列存储&#xff1a;即哈希的存储方式。 顺序存储&#xff1a;数组的存储方式 链式存储&#xff1a;链式前向星、vector<> 压缩存储 索引存储 查找 常见查找算法 顺序查找 一个一个往下找&#xff0c;复杂度 \(O(\dfrac{n1}{2})\) 。 适合顺序存储&#xff0c…

CF1556E-Equilibrium【栈,树状数组】

正题 题目连接:https://codeforces.com/contest/1556/problem/E 题目大意 两个长度为nnn的序列a,ba,ba,b&#xff0c;qqq次询问一个区间[l,r][l,r][l,r]。 在这个区间中你每次可以选择一个长度为偶数的下标递增的序列&#xff0c;让奇数位置的aaa加一&#xff0c;偶数位置的…

[COCI 2018#5]Parametriziran

这道题呢&#xff01; 算了&#xff0c;不要让这玩意儿活着祸害众生吧&#xff01;让我们来拯救苍生于苦海之中&#xff01;&#xff01; 骚话连篇ing 题目 由小写英文字母和问号组成的字符串成为参数化单词&#xff08;例如&#xff1a;??cd,bcd,??&#xff09;。如果两…

P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门 文章目录解析解析 很显然&#xff0c;让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题&#xff0c;其实第一感觉是bfs 但是状态数理论上最差可以达到815&#xff0c;&#xff08;当然基本不可能跑满&#xff09;&#xff…

AcWing 1402. 星空之夜 1月28

AcWing 1402. 星空之夜 1月28 题意&#xff1a; 一个星群是指一组非空的在水平&#xff0c;垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如果两个星群的形状、包含星星的数目相同&#xff0c;那么无论它们的朝向如何&#…

RMQ、ST表

ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构。 可重复贡献问题&#xff1a;区间按位和、区间按位或、区间 \(\gcd\) 、区间最大、区间最小等满足结合律且可重复统计的问题。 模板预处理&#xff1a;(以区间最大值为例) void pre_work() {for(int i2;i<n;i) lg…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[COCI] Zamjena

连这种模拟题都能。。。orz ex&#xff0c;太恶心了&#xff01; 驰骋坑底这么久了&#xff0c;我明白了 开始吧&#xff01;我发誓&#xff0c;这个超级兵&#xff0c;我就算用小书包平A都要A了它 题目 Vlatko喜欢使用整数数组&#xff0c;他在一张纸上写下了两个数组&…

P7470-[NOI Online 2021 提高组]岛屿探险【Trie,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P7470 题目大意 给出nnn个二元组(a,b)(a,b)(a,b)。 qqq次询问给出(l,r,c,d)(l,r,c,d)(l,r,c,d)表示询问[l,r][l,r][l,r]中有多少二元组满足cxora≤min(b,d)c\ xor\ a\leq min(b,d)c xor a≤min(b,d)。 1≤n,q≤1051\leq n,q\…

P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点&#xff0c;二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直接枚举左上方的点二分呢&#xff1f;awa 很遗憾的是… 那样答案就没有…

初赛—错题集

计算机基础知识 LAN&#xff1a;局域网&#xff0c;WAN&#xff1a;广域网&#xff0c;MAN&#xff1a;城域网 汇编语言是(依赖于具体计算机)的低级程序设计语言 计算机操作的最小时间单位是(时钟周期)。 注意所需空间需要 \(\div 8\) &#xff01;&#xff01;&#xff01;…

.NET Core 和 DevOps

关键要点无论你目前使用什么样的技术栈&#xff0c;DevOps 都是值得一试的。闭源、专有软件和构建过程与 DevOps 实践不兼容。.NET Core 是开源的&#xff0c;是基于 DevOps 构思和构建的。.NET Core CLI 和 Roslyn API 让整个交付流程变得更加开放&#xff0c;且具有更强的适应…