24.5.26(树链剖分板子,二分+线段树)

星期一:

补重庆科技 C 二分                                               牛客传送门

思路:二维前缀和表示到第 i个人第 j个弹巢开了多少发,和st【i】表示第 i个人开的是第几个弹巢

对于 l和r的查询,使用前缀和二分找出第一个中枪的人,但因为题意第 l个人开的是1号弹巢,所以弹巢编号会有一个偏移,例如st【l】==5,那么偏移量就为4

这个偏移量在check中的使用也卡了我好一会儿,但感觉是我的问题,其实挺简单。例如py==4,查询 1号弹巢时,实际上应该看sum中的 5号弹巢有无射击,因为预处理中 l开的是 5号弹巢,实际开的是 1号,从 l到 r的所有人都会存在这个偏移

代码如下:

const int N=2e6+10,M=210;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
ll n;
int m;
int b[N],a[N];
int sum[N][22],st[N];
int py,tl;
bool mp[22];
bool check(int x){for(int i=1;i<=m;i++){int j=(i+py-1)%m+1;                           //偏移量的处理if(mp[i] && sum[x][j]-sum[tl][j]) return 1;    //有人出子弹了}return 0;
}
void solve(){int q; cin >> m >> n >> q;for(int i=1;i<=m;i++){cin >> b[i];mp[i]=b[i];}for(int i=1;i<=n;i++){cin >> a[i];a[i]%=m;}int box=1;sum[1][1]=1,st[1]=1;for(int i=2;i<=n;i++){box=(box+a[i-1]-1)%m+1;st[i]=box;for(int j=1;j<=m;j++) sum[i][j]=sum[i-1][j];sum[i][box]++;}while(q--){int l,r; cin >> l >> r;py=st[l]-1;                    //弹匣偏移量int res=0; tl=l-1;while(l<=r){int mid=l+r>>1;if(check(mid)) res=mid,r=mid-1;else l=mid+1;}if(!res) cout << "No one died\n";else cout << res << "\n";}
}

武汉纺织 A                                                           牛客传送门

赛时没出我的,第一重循环优化了下加了个continue,把自己坑了,不加continue两重循环足够了,加了continue后还得第三重循环枚举公约数,但当时光想着continue能剪枝

思路:第一重循环从m开始枚举公约数,第二重循环算 k,算出来的数的gcd不一定就是 i,开个变量gc去维护一下其gcd

代码如下:

const int N=2e6+10,M=210;
ll n;
int b[N];
bool cmp1(PII a,PII b){if(a.first!=b.first) return a.first>b.first;else return a.second<b.second;
}
void solve(){int m; cin >> n >> m;int ma=0;for(int i=1;i<=n;i++){int x; cin >> x;b[x]++;ma=max(x,ma);}vector<PII>ve;for(int i=m;i<=ma;i++){int t=0,gc=0;for(int j=i;j<=ma;j+=i){if(b[j]){t+=b[j];gc=__gcd(j,gc);}}if(t>1) ve.push_back({t,gc});}sort(ve.begin(),ve.end(),cmp1);if(!ve.empty()) cout << ve[0].first << " " << ve[0].second << "\n";else cout << "0 0\n";
}

补cf 945 div2 C 构造                                                 cf传送门

题意:给一个排列p,输出一个排列q,设a【i】= p【i】+ q【i】,使存在最多 a【i】大于两侧值

思路:可看出峰值的数量是固定的,为 n/2-1,头尾不可为峰,连续俩数不能都为峰,假如我们让奇数位置的值为峰( 除了头,发现如果p的 n值在偶数位,且挨着1,是无法实现的,但其实也不难解决,将p翻转后 n下标的奇偶性就会改变( 最后输出前记得翻转 q

解决了n的问题后就很好操作了,我们把 1 - n/2的值给偶数位,n/2+1 - n的给奇数位,越小的p加上越大的q,这样偶数位最高为 n,奇数位最少为 n+1,即满足题意

代码如下:

const int N=2e6+10,M=210;
ll n;
int p[N],pos[N],q[N];
void solve(){cin >> n;for(int i=1;i<=n;i++){cin >> p[i];pos[p[i]]=i;}bool ifr=0;if(!(pos[n]&1)){                      //n在偶数位,将其翻转ifr=1;reverse(p+1,p+n+1);for(int i=1;i<=n;i++) pos[p[i]]=i;}vector<int>od,ev;for(int i=n;i;i--)i<=n/2?ev.push_back(i):od.push_back(i);int ido=0,ide=0;for(int i=1;i<=n;i++){if(pos[i]&1) q[pos[i]]=od[ido++];else q[pos[i]]=ev[ide++];}if(ifr) reverse(q+1,q+n+1);               //记得判断是否翻转过pfor(int i=1;i<=n;i++) cout << q[i] << " \n"[i==n];
}

dp题单 换根dp第三题                                             cf传送门

换根板子题,10min出了,不多讲

代码如下:

const int N=2e6+10,M=210;
ll n;
ll a[N],sum[N],dp[N],tot;
int dep[N];
vector<int>ve[N];
void dfs1(int x,int fa){if(fa) dep[x]=dep[fa]+1;sum[x]=a[x];for(int i:ve[x]){if(i==fa) continue;dfs1(i,x);sum[x]+=sum[i];}
}
void dfs2(int x,int fa){for(int i:ve[x]){if(i==fa) continue;dp[i]=dp[x]-sum[i]+tot-sum[i];      //i为根子树距离减一,其余所有节点距离加一dfs2(i,x);}
}
void solve(){cin >> n;for(int i=1;i<=n;i++){cin >> a[i];tot+=a[i];}for(int i=1;i<n;i++){int u,v; cin >> u >> v;ve[u].push_back(v);ve[v].push_back(u);}dfs1(1,0);for(int i=1;i<=n;i++) dp[1]+=1ll*dep[i]*a[i];dfs2(1,0);ll ans=0;for(int i=1;i<=n;i++) ans=max(dp[i],ans);cout << ans;
}

星期二:

下午19届黑龙江,止步5题

补 F                                                                         cf传送门

题意:在图上找一条包含点数不超过5的简单路径,输出点集最大权值和

思路:路径长度不超过5,可以把长度为3的路径存下来,然后遍历两头的点往两边延伸,遍历只需要遍历权值前四的点,因为极端情况下,端点找出去最多三个点可能重复,为中间点,另一端点,另一端点延伸的点,所以前四一定可以覆盖最优情况

代码如下:

ll n;
ll a[5050];
vector<int>ve[5050];
struct nod{int p1,p2,p;
};
vector<nod>tri;
bool cmp1(int x,int y){return a[x]>a[y];
}
void solve(){int m; cin >> n >> m;for(int i=1;i<=n;i++) cin >> a[i];ll ans=0;for(int i=1;i<=m;i++){int u,v; cin >> u >> v;ve[u].push_back(v);ve[v].push_back(u);ans=max(a[u]+a[v],ans);}for(int i=1;i<=n;i++){for(auto p1:ve[i]){for(auto p2:ve[i])if(p1!=p2) tri.push_back({p1,p2,i});}}for(int i=1;i<=n;i++) sort(ve[i].begin(),ve[i].end(),cmp1);for(auto t:tri){int p1=t.p1,p2=t.p2,p=t.p;if(p1==p2 || p1==p || p2==p) continue;ll sum=a[p1]+a[p2]+a[p];ans=max(sum,ans);for(int i=0,sz1=ve[p1].size();i<min(sz1,4);i++){for(int j=0,sz2=ve[p2].size();j<min(sz2,4);j++){int to1=ve[p1][i],to2=ve[p2][j];if(to1==p2 || to2==p1) continue;if(to1==p || to2==p || to1==to2) continue;ans=max(sum+a[to1]+a[to2],ans);}}for(int i=0,sz=ve[p1].size();i<min(sz,4);i++){int to=ve[p1][i];if(to==p || to==p2) continue;ans=max(sum+a[to],ans);}for(int i=0,sz=ve[p2].size();i<min(sz,4);i++){int to=ve[p2][i];if(to==p || to==p1) continue;ans=max(sum+a[to],ans);}}cout << ans;
}

星期三:

补19届黑龙江 C   树链剖分

补题失败,先记着

星期四:

早上和os vp了24江苏,4题298,铜首,少wa两发就是银尾,总结下经验

24江苏 G(吃了3发罚时                                             cf传送门

大量的大整数输入尽量不要用double存,会很慢,因此 t了两发

整数没有确定不会爆 int就开 ll,double改成 int后 wa了一发

os写二分check的细节失误,wa了一发

后两发是完全可以避免的

       !!!!!!!!!!!!!!!!警钟长鸣!!!!!!!!!!!!!!!!!!

24江苏  K  博弈                                                        cf传送门

思路:首先能想到如果只有1,那么1的奇偶性决定胜负,但如果存在2,那么最后一个删2的人就能决定1的奇偶性,即决定谁胜。那如果存在3呢,那么最后一个删3的人就能决定2的奇偶性,即决定谁能最后删2,即决定谁胜。   推导到此即可大胆猜出结论,胜负由最大数的奇偶性决定

银牌题就是主席树,线段树也写了,确实倒腾不出来

树链剖分板子题(附线段树区修,区查板子                    洛谷传送门

思路:树链剖分+线段树维护                            推荐教学视频( 阿b传送门

代码如下:

const int N=2e6+10,M=210;
const int mod=1e9+7;
ll n;
int fa[N],dep[N],top[N],sz[N],son[N],dfn[N],tim;
ll v[N];
int m,r,p;
vector<int>ve[N];
struct seg_Tree{
#define lc p<<1
#define rc p<<1|1struct nod{int l,r;ll sum,add;}t[N];ll ql,qr,a[N];nod merge(nod a,nod b){nod res;res.l=a.l,res.r=b.r;res.sum=a.sum+b.sum;res.add=0;return res;}void pushup(int p){t[p]=merge(t[lc],t[rc]);}void pushdn(int p){if(!t[p].add) return ;t[lc].sum+=(t[lc].r-t[lc].l+1)*t[p].add;t[rc].sum+=(t[rc].r-t[rc].l+1)*t[p].add;t[lc].add+=t[p].add;t[rc].add+=t[p].add;t[p].add=0;}void bd(int p,int l,int r){t[p]={l,r,0,0};if(l==r){t[p].sum=a[l];return ;}int m=l+r>>1;bd(lc,l,m);bd(rc,m+1,r);pushup(p);}void update(int p,int v){if(ql<=t[p].l && qr>=t[p].r){t[p].sum+=1ll*(t[p].r-t[p].l+1)*v;t[p].add+=v;return ;}int m=t[p].l+t[p].r>>1;pushdn(p);if(ql<=m) update(lc,v);if(qr>m) update(rc,v);pushup(p);}nod query(int p){if(ql<=t[p].l && qr>=t[p].r) return t[p];int m=t[p].l+t[p].r>>1;pushdn(p);if(ql>m) return query(rc);if(qr<=m) return query(lc);return merge(query(lc),query(rc));}void updt(int l,int r,int v){ql=l;qr=r;
//		qop=op;update(1,v);}ll ask(int l,int r){ql=l,qr=r;return query(1).sum;}
#undef lc
#undef rc
}tr;
void dfs1(int x,int f){fa[x]=f;dep[x]=dep[f]+1;sz[x]=1;int ts=0;for(int i:ve[x]){if(i==f) continue;dfs1(i,x);sz[x]+=sz[i];if(sz[i]>ts) ts=sz[i],son[x]=i;}
}
void dfs2(int x,int t){dfn[x]=++tim;tr.a[tim]=v[x];top[x]=t;if(!son[x]) return ;dfs2(son[x],t);for(int i:ve[x]){if(i==son[x] || i==fa[x]) continue;dfs2(i,i);                              //注意dfs2的第二个参数也是i}
}
void update(int x,int y,int z){z%=p;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);tr.updt(dfn[top[x]],dfn[x],z);x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);tr.updt(dfn[x],dfn[y],z);
}
ll query(int x,int y){ll res=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);res+=tr.ask(dfn[top[x]],dfn[x]),res%=p;x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);res+=tr.ask(dfn[x],dfn[y]);return res%p;
}
void solve(){cin >> n >> m >> r >> p;for(int i=1;i<=n;i++) cin >> v[i];for(int i=1;i<n;i++){int u,v; cin >> u >> v;ve[u].push_back(v);ve[v].push_back(u);}dfs1(r,r);dfs2(r,r);tr.bd(1,1,n);while(m--){int op,x; cin >> op >> x;if(op==1){int y,z; cin >> y >> z;update(x,y,z);}else if(op==2){int y; cin >> y;cout << query(x,y) << "\n";}else if(op==3){int z; cin >> z;tr.updt(dfn[x],dfn[x]+sz[x]-1,z);}else cout << tr.ask(dfn[x],dfn[x]+sz[x]-1)%p << "\n";  //记得取模}
}

晚上vp了下24长春邀请赛,出了3题就做不动了,很累。。

补ABC292   Ex                                                          atc传送门

思路:线段树维护最大前缀和,然后二分,这是 O(n*(logn)^2)的做法

如果没有B这个条件,那么我们只需要知道得分总和,rating即为sum/n

但存在B的条件后,我们需要知道第一个rating>=B的点,对式子进行如下演化

我们可以对于 pi-B的值做一个前缀和,然后找到第一个前缀和>=0的点即可

但是问题是,前缀和并不具有单调性,如何才能快速找到第一个点呢?

这里要引进线段树的一个新功能,维护最大前缀和,which具有单调性,即可进行二分查询

代码如下:

const int N=2e6+10,M=210;
ll n;
ll b;
struct seg_Tree{
#define lc p<<1
#define rc p<<1|1struct nod{int l,r;ll sum,pre;}t[N];int ql,qr;                              //查询区间nod merge(nod a,nod b){nod res;res.l=a.l,res.r=b.r;res.sum=a.sum+b.sum;;res.pre=max(a.sum+b.pre,a.pre);return res;}void pushup(int p){t[p]=merge(t[lc],t[rc]);}      //向上更新void bd(int p,int l,int r){                       //bd里处理输入if(l==r){t[p]={l,r,0,0};cin >> t[p].sum;t[p].sum-=b;t[p].pre=t[p].sum;return ;}int m=l+r>>1;bd(lc,l,m);bd(rc,m+1,r);pushup(p);}void update(int p,int v){if(ql<=t[p].l && qr>=t[p].r){t[p].sum=v-b;    //叶子节点的所有信息都要改t[p].pre=t[p].sum;return ;}int m=t[p].l+t[p].r>>1;if(ql<=m) update(lc,v);if(qr>m) update(rc,v);pushup(p);                        //向上更新}nod query(int p){if(ql<=t[p].l && qr>=t[p].r) return t[p];int m=t[p].l+t[p].r>>1;if(ql>m) return query(rc);if(qr<=m) return query(lc);return merge(query(lc),query(rc));}void updt(int l,int r,int v){ql=l;qr=r;
//		qop=op;update(1,v);}ll ask_pre(int l,int r){ql=l,qr=r;return query(1).pre;}ll ask_sum(int l,int r){ql=l,qr=r;return query(1).sum;}
#undef lc
#undef rc
}tr;
void solve(){cout << fixed << setprecision(13);int q; cin >> n >> b >> q;tr.bd(1,1,n);while(q--){int c,x; cin >> c >> x;tr.updt(c,c,x);int l=1,r=n,res=n;while(l<=r){          //二分找到第一个pre>=0的点int mid=l+r>>1;if(tr.ask_pre(1,mid)>=0) res=mid,r=mid-1;else l=mid+1;}cout << 1.0*(tr.ask_sum(1,res)+1ll*res*b)/res << "\n";}
}

星期五:

补24长春邀请赛 B 树形dp                                   cf传送门

题意:找出一种dfs的方式,使得dfs序中偶数下标节点的权值和最大

思路:很明显的树形dp,但赛时因脑力不足只定了个状态,没有更细想如何转移

dp【i】【0/1】表示以偶数/奇数顺序进入 i节点的最大答案,dp【1】【1】为答案

偶数sz的子节点,不会影响奇偶顺序,一个奇子节点会影响一次

如果只有偶数子节点,那么0/1的选择是固定的,如果存在奇节点,所有偶节点可以取更大值,对于奇节点的选择,如果偶数个奇节点,0/1各一半,如果奇数个,多的那个取父节点的反,将奇点的 0/1 差值排个序,贪心即可

代码如下:

const int N=2e6+10,M=210;
ll n;
ll dp[N][2],a[N];
int sz[N];
vector<int>ve[N];
bool cmp1(int a,int b){return dp[a][0]-dp[a][1]>dp[b][0]-dp[b][1];
}
void dfs(int x,int f){dp[x][0]=a[x];dp[x][1]=0;sz[x]=1;bool if1=0;for(int i:ve[x]){if(i==f) continue;dfs(i,x);sz[x]+=sz[i];if(sz[i]&1) if1=1;}if(!if1){for(int i:ve[x]){if(i==f) continue;dp[x][1]+=dp[i][0];dp[x][0]+=dp[i][1];}}else{vector<int>son;for(int i:ve[x]){if(i==f) continue;if(sz[i]&1) son.push_back(i);else{dp[x][1]+=max(dp[i][0],dp[i][1]);dp[x][0]+=max(dp[i][0],dp[i][1]);}}sort(son.begin(),son.end(),cmp1);if(son.size()&1){for(int i=0,ssz=son.size();i<ssz;i++){if(i<ssz/2) dp[x][0]+=dp[son[i]][0],dp[x][1]+=dp[son[i]][0];else if(i==ssz/2) dp[x][0]+=dp[son[i]][1],dp[x][1]+=dp[son[i]][0];else dp[x][0]+=dp[son[i]][1],dp[x][1]+=dp[son[i]][1];}}else{for(int i=0,ssz=son.size();i<ssz;i++){if(i<ssz/2) dp[x][0]+=dp[son[i]][0],dp[x][1]+=dp[son[i]][0];else dp[x][0]+=dp[son[i]][1],dp[x][1]+=dp[son[i]][1];}}}
}
void solve(){cin >> n;for(int i=1;i<=n;i++) ve[i].clear();for(int i=1;i<=n;i++) cin >> a[i];for(int i=1;i<n;i++){int u,v; cin >> u >> v;ve[u].push_back(v);ve[v].push_back(u);}dfs(1,0);cout << dp[1][1] << "\n";
}

easy线段树题 建平台                                               洛谷传送门

思路:线段树维护区间高度,需支持区间修改和单点查询

代码如下:

const int N=2e6+10,M=210;
ll n;
struct seg_Tree{
#define lc p<<1
#define rc p<<1|1struct nod{int l,r;int hei,add;}t[N];int ql,qr,qv;nod merge(nod a,nod b){nod res;res.l=a.l,res.r=b.r;res.hei=max(a.hei,b.hei);  // useless,因为查询高度只会是单点res.add=0;return res;}void pushup(int p){t[p]=merge(t[lc],t[rc]);}void pushdn(int p){if(!t[p].add) return ;t[lc].hei=t[p].add;t[rc].hei=t[p].add;t[lc].add=t[p].add;t[rc].add=t[p].add;t[p].add=0;}void bd(int p,int l,int r){t[p]={l,r,0,0};if(l==r) return ;int m=l+r>>1;bd(lc,l,m);bd(rc,m+1,r);pushup(p);}void update(int p){if(ql<=t[p].l && qr>=t[p].r){t[p].hei=qv;t[p].add=qv;return ;}int m=t[p].l+t[p].r>>1;pushdn(p);if(ql<=m) update(lc);if(qr>m) update(rc);pushup(p);}nod query(int p){if(ql<=t[p].l && qr>=t[p].r) return t[p];int m=t[p].l+t[p].r>>1;pushdn(p);if(qr<=m) return query(lc);if(ql>m) return query(rc);return merge(query(lc),query(rc));}void updt(int l,int r,int v){ql=l,qr=r;qv=v;update(1);}int ask_hei(int l,int r){ql=l,qr=r;return query(1).hei;}
#undef lc
#undef rc
}tr;
struct nod{int l,r,y;
}bo[110];
void solve(){cin >> n;int ma=0;for(int i=1;i<=n;i++){cin >> bo[i].y >> bo[i].l >> bo[i].r;bo[i].l++;ma=max(bo[i].r,ma);}tr.bd(1,1,ma);sort(bo+1,bo+n+1,[](nod a,nod b){return a.y<b.y;});     //按高度排序ll ans=0;for(int i=1;i<=n;i++){int h=bo[i].y;ans+=h-tr.ask_hei(bo[i].l,bo[i].l)+h-tr.ask_hei(bo[i].r,bo[i].r);tr.updt(bo[i].l,bo[i].r,h);}cout << ans;
}

dp题单 状压dp第五题 鱼吃鱼                              cf传送门

题意:n条鱼,每次两条鱼相遇且有一条被对方吃掉,n*n矩阵 aij为 i鱼吃掉 j鱼概率,问每条鱼活到最后的期望是多少

思路:dp【mask】表示状态为mask的期望,先设定全1期望为1,然后倒着枚举状态,对于每一个状态,先枚举被吃掉的0,再枚举吃掉它的1

dp【mask】+= 原状态期望*两鱼相遇概率* j吃掉 i的概率

代码如下:

ll n;
double dp[1<<19];
double a[19][19];
ll c(int n,int m){ll res=1;for(int i=1;i<=m;i++)res=res*(i+n-m)/i;return res;
}
void solve(){cout << fixed << setprecision(8);cin >> n;for(int i=0;i<n;i++){for(int j=0;j<n;j++) cin >> a[i][j];}dp[(1<<n)-1]=1;for(int mask=(1<<n)-1;mask;mask--){          //状态倒着枚举for(int i=0;i<n;i++){if(mask>>i&1) continue;for(int j=0;j<n;j++){if(!(mask>>j&1)) continue;int nmask=mask|(1<<i);           //i被吃掉前的状态dp[mask]+=dp[nmask]*1.0/c(__builtin_popcount(nmask),2)*a[j][i];}}}for(int i=0;i<n;i++) cout << dp[1<<i] << " ";
}

星期六:

线段树区间乘区间加区间查询 模板                                       洛谷传送门

思路:需要两个懒标记,一个负责区间加,一个负责区间乘,注意mul对add的影响

对于存在add的区间再进行乘操作后,区间应是(sum+len*add)*k,分配后为sum*k+len*add*k,所以不仅mul*=k,add也需*=k,pushdn时先处理mul再add(因为add已经乘过了

代码如下:

const int N=2e6+10,M=210;
ll n;
int m;
struct seg_Tree{
#define lc p<<1
#define rc p<<1|1struct nod{int l,r;ll sum,add,mul;            //区间和,加法懒标记,乘法懒标记}t[N];ll ql,qr,qv,qop;nod merge(nod a,nod b){nod res;res.l=a.l,res.r=b.r;res.sum=a.sum+b.sum;res.add=0;res.mul=1;return res;}void pushup(int p){t[p]=merge(t[lc],t[rc]);}void pushdn(int p){                               //注意先乘再加t[lc].sum*=t[p].mul,t[lc].sum+=(t[lc].r-t[lc].l+1)*t[p].add,t[lc].sum%=m;t[rc].sum*=t[p].mul,t[rc].sum+=(t[rc].r-t[rc].l+1)*t[p].add,t[rc].sum%=m;t[lc].add*=t[p].mul,t[lc].add+=t[p].add,t[lc].add%=m;t[rc].add*=t[p].mul,t[rc].add+=t[p].add,t[rc].add%=m;t[lc].mul*=t[p].mul,t[lc].mul%=m;t[rc].mul*=t[p].mul,t[rc].mul%=m;t[p].add=0,t[p].mul=1;}void bd(int p,int l,int r){t[p]={l,r,0,0,1};if(l==r){cin >> t[p].sum;return ;}int m=l+r>>1;bd(lc,l,m);bd(rc,m+1,r);pushup(p);}void update(int p){if(ql<=t[p].l && qr>=t[p].r){if(qop==1){t[p].sum*=qv,t[p].sum%=m; t[p].mul*=qv,t[p].mul%=m;t[p].add*=qv,t[p].add%=m;}else{t[p].sum+=1ll*(t[p].r-t[p].l+1)*qv,t[p].sum%=m;t[p].add+=qv,t[p].add%=m;}return ;}int mid=t[p].l+t[p].r>>1;pushdn(p);if(ql<=mid) update(lc);if(qr>mid) update(rc);pushup(p);}nod query(int p){if(ql<=t[p].l && qr>=t[p].r) return t[p];int m=t[p].l+t[p].r>>1;pushdn(p);if(ql>m) return query(rc);if(qr<=m) return query(lc);return merge(query(lc),query(rc));}void updt(int l,int r,int op,int v){ql=l;qr=r;qv=v;qop=op;update(1);}ll ask(int l,int r){ql=l,qr=r;return query(1).sum;}
#undef lc
#undef rc
}tr;

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

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

相关文章

【UE5.1 角色练习】06-角色发射火球-part1

前言 在上一篇&#xff08;【UE5.1 角色练习】05-火球发射物-CSDN博客&#xff09;基础上实现角色可以发射火球的技能 效果 步骤 一、准备 1. 打开角色蓝图&#xff0c;添加两个浮点型变量&#xff0c;分别表示当前的MP值和满状态的MP值 添加一个函数&#xff0c;这里命名…

解密 Alpha 勒索软件

Alpha 勒索软件很容易与 ALPHV 勒索软件混淆&#xff0c;但其实这是两个不同的勒索软件团伙。近期&#xff0c;Alpha 勒索软件团伙在暗网上建立了数据披露网站&#xff0c;并且对外公开了6个受害者。 通常来说&#xff0c;勒索软件运营者在启动数据披露网站前会保持攻击态势。一…

c++ 实现 梯度下降线性回归模型

理论与python实现部分 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation c代码 没能力实现反向传播求梯度&#xff0c;只能自己手动算导数了 #include <bits/stdc.h> #include <time.h> using namespace std;//y_hat X * W b // linreg 函数&#xff1a…

无经验求职者的福音:AI生成简历的便捷之道

第一步你需要先给自己写个简历&#xff0c;简历就是你求职时的一张脸&#xff0c;“漂亮”程度与否那可大了去了。一份漂亮的简历不仅内容满满当当突出重点&#xff0c;而且排版清晰亮眼&#xff0c;能让hr一下子捕捉到重点。 来看看一份漂亮的简历长啥样↓ 工作经历、个人能力…

Go语言

Go语言 Go语言全称Golanguage&#xff0c;Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。于2009年首次发布 官网 特点 简单易学&#xff1a;Go语言语法简洁明了&#x…

【C++】Vector的简易模拟与探索

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

04Django项目基本运行逻辑及模板资源套用

对应视频链接点击直达 Django项目用户管理及模板资源 对应视频链接点击直达1.基本运行逻辑Django的基本运行路线&#xff1a;视图views.py中的 纯操作、数据返回、页面渲染 2.模版套用1.寻找一个好的模版2.模板部署--修改适配联动 OVER&#xff0c;不会有人不会吧不会的加Q1394…

Java 类加载过程和双亲委派模型

Java 类加载过程概述 在 Java 中&#xff0c;类装载器把一个类装入 Java 虚拟机中&#xff0c;要经过三个步骤来完成&#xff1a;装载、链接和初始化&#xff0c;其中链接又可以分成校验、准备、解析 Java类加载过程分为如下步骤&#xff1a; 1.装载&#xff08; 加载&#xf…

Python编程-后端开发之Django5应用请求处理与模板基础

Python编程-后端开发之Django5应用请求处理与模板基础 最近写项目&#xff0c;刚好用到了Django&#xff0c;现在差不多闲下来&#xff0c;个人觉得单体项目来讲django确实舒服&#xff0c;故写此总结 模板语法了解即可&#xff0c;用到了再看&#xff0c;毕竟分离已经是主流操…

LeetCode300:最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列 代码…

react 函数组件 开发模式默认被渲染两次

这是 React 刻意为之&#xff0c;函数式组件应当遵从函数式编程风格&#xff0c;每次执行应该是无副作用的(no sideEffect)&#xff0c;在 dev 下多次渲染组件&#xff0c;是为了防止开发者写出有问题的代码。 用 React 写函数组件&#xff0c;如何避免重复渲染&#xff1f; -…

Java学习【面向对象综合练习——实现图书管理系统】

Java学习【面向对象综合练习——实现图书管理系统】 前期效果图书的创建用户的创建操作的实现完善操作显示图书查找图书新增图书借阅图书归还图书删除图书 前期效果 用户分为普通用户和管理员&#xff0c;登录进系统之后可以对图书进行一系列操作&#xff0c;此时我们要明白&am…

斐讯N1刷OpenWRT并安装内网穿透服务实现远程管理旁路由

文章目录 前言1. 制作刷机固件U盘1.1 制作刷机U盘需要准备以下软件&#xff1a;1.2 制作步骤 2. N1盒子降级与U盘启动2.1 N1盒子降级2.2 N1盒子U盘启动设置2.3 使用U盘刷入OpenWRT2.4 OpenWRT后台IP地址修改2.5 设置旁路由&无线上网 3. 安装cpolar内网穿透3.1 下载公钥3.2 …

时空数据治理白皮书(2024)

来源&#xff1a;泰伯智库&#xff1a; 近期历史回顾&#xff1a;

企业微信修改主体花了大几千的踩坑经验,家人们避雷

企业微信变更主体有什么作用&#xff1f;如果原有的公司注销了&#xff0c;或者要更换一家公司主体来运营企业微信&#xff0c;那么就可以进行变更主体&#xff0c;变更主体后才可以保留原来企业微信上的所有用户&#xff0c;否则就只能重新申请重新积累用户了。企业微信变更主…

运维专题.Docker功能权限(Capabilities)管理和查看

运维专题 Docker功能权限&#xff08;Capabilities&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 论文总结

题目&#xff1a;MedSegDiff: Medical Image Segmentation&#xff08;图像分割&#xff09;with Diffusion Probabilistic Model&#xff08;扩散概率模型&#xff09; 论文&#xff08;MIDL会议&#xff09;&#xff1a;MedSegDiff: Medical Image Segmentation with Diffusi…

勇于创新,勤于探索 —— 我的创作纪念日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

纯CSS丝滑边框线条动画

在这个网站&#xff08;minimal-portfolio-swart.vercel.app&#xff09;发现一个不错的交互效果&#xff0c;用户体验效果很不错。如封面图所示&#xff0c;这个卡片上有一根白色的线条围绕着卡片移动&#xff0c;且在线条的卡片内部跟随这一块模糊阴影&#xff0c;特别是在线…

关于Nginx热部署的细节分析

文章目录 前言一、环境准备二、热部署步骤总结 前言 Nginx由于其高并发、高性能、可扩展性好、高可靠性、热部署、BSD许可证等优势被广泛使用&#xff0c;本人主要针对热部署的部分展开说明热部署的具体步骤以及步骤背后发生的具体事情。 本次热部署采用的Nginx版本号为&…