当前位置: 首页 > news >正文

2025.10.5 2024CCPC郑州

施工中……
vp 5/13 (B C F L M)

简要题解

L

找规律,模拟即可

B

按题意BFS即可

F

发现如果第三天不被影响,那么后面都将重复前两天。
如果第三天被影响,那么说明单天的任务无法在一天内做完,后面都将被影响。
模拟前两天,直接计算即可。

M

列出式子,发现确定 \(p_1\) 后,后续所有结果都确定。
又发现 \(\sigma_{i}{p_i}\)\(p_1\) 的增大而单增,二分 \(p_1\) 即可。
注意精度!

C

发现\(x,y\)相对独立,先考虑一维情况。
考虑二分的过程,发现可以轻松解决一维的情况,可以用来判断是否无解。
考虑拓展,发现\(x,y\)的二分次数不同,直接合并会出现不合法操作。
猜测手玩发现,每个可以取到的\(x,y\),都可以通过与四个顶点操作得到!
递归处理即可。

补题

G

若是存在合法方案,区间的最小值和最大值一定会取在一起。
经典套路,哈希判断值域区间的对称性。

哈希要用双哈希!!!!!!

#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int ans=0,a=getchar();while('0'>a||a>'9')a=getchar();while('0'<=a&&a<='9')ans=ans*10+a-'0',a=getchar();return ans; 
} // 双模数定义
const int mod1=1000001011;
const int mod2=1000000007;
const int h1=1000213;
const int h2=911382629;
int pw1[200005],pw2[200005];    // 两个基的幂次数组
int inv1[200005],inv2[200005];  // 两个基逆元的幂次数组
int invp1,invp2;                // 两个基的逆元
int a[200005];// 线段树节点:维护最大值、最小值和两个模数的正逆哈希和
int tree1[800005],tree2[800005];// 最大值、最小值
int sum_a1[800005],sum_b1[800005];// 模数1的正哈希和、逆哈希和
int sum_a2[800005],sum_b2[800005];// 模数2的正哈希和、逆哈希和
int tag[800005];                // 加法懒标记// 快速幂(带模数参数)
inline int pw(int x,int y,int mod){int ans=1;x%=mod;while(y){if(y&1)ans=1ll*ans*x%mod;x=1ll*x*x%mod;y>>=1;}return ans;
}// 线段树上传操作
inline void up(int now){tree1[now]=max(tree1[now<<1],tree1[now<<1|1]);tree2[now]=min(tree2[now<<1],tree2[now<<1|1]);sum_a1[now]=(sum_a1[now<<1]+sum_a1[now<<1|1])%mod1;sum_b1[now]=(sum_b1[now<<1]+sum_b1[now<<1|1])%mod1;sum_a2[now]=(sum_a2[now<<1]+sum_a2[now<<1|1])%mod2;sum_b2[now]=(sum_b2[now<<1]+sum_b2[now<<1|1])%mod2;
}// 线段树下推操作
inline void push_down(int now){if(tag[now]){int v=tag[now];// 左子树更新tag[now<<1]+=v;tree1[now<<1]+=v;tree2[now<<1]+=v;// 模数1处理sum_a1[now<<1]=1ll*sum_a1[now<<1]*pw(h1,v,mod1)%mod1;sum_b1[now<<1]=1ll*sum_b1[now<<1]*pw(invp1,v,mod1)%mod1;// 模数2处理sum_a2[now<<1]=1ll*sum_a2[now<<1]*pw(h2,v,mod2)%mod2;sum_b2[now<<1]=1ll*sum_b2[now<<1]*pw(invp2,v,mod2)%mod2;// 右子树更新tag[now<<1|1]+=v;tree1[now<<1|1]+=v;tree2[now<<1|1]+=v;// 模数1处理sum_a1[now<<1|1]=1ll*sum_a1[now<<1|1]*pw(h1,v,mod1)%mod1;sum_b1[now<<1|1]=1ll*sum_b1[now<<1|1]*pw(invp1,v,mod1)%mod1;// 模数2处理sum_a2[now<<1|1]=1ll*sum_a2[now<<1|1]*pw(h2,v,mod2)%mod2;sum_b2[now<<1|1]=1ll*sum_b2[now<<1|1]*pw(invp2,v,mod2)%mod2;tag[now]=0;}
}// 构建线段树
void build(int now,int l,int r){if(l==r){tree2[now]=tree1[now]=a[l];// 初始化两个模数的哈希值sum_a1[now]=pw1[a[l]]%mod1;sum_b1[now]=inv1[a[l]]%mod1;sum_a2[now]=pw2[a[l]]%mod2;sum_b2[now]=inv2[a[l]]%mod2;return ;}int mid=l+r>>1;build(now<<1,l,mid);build(now<<1|1,mid+1,r);up(now);
}// 查询区间最小值
int find1(int now,int l,int r,int l1,int r1){if(l>=l1&&r<=r1)return tree2[now];int mid=l+r>>1,ans=1e18;push_down(now);if(mid>=l1)ans=min(ans,find1(now<<1,l,mid,l1,r1));if(mid+1<=r1)ans=min(ans,find1(now<<1|1,mid+1,r,l1,r1));return ans;
}// 查询区间最大值
int find2(int now,int l,int r,int l1,int r1){if(l>=l1&&r<=r1)return tree1[now];int mid=l+r>>1,ans=0;push_down(now); if(mid>=l1)ans=max(ans,find2(now<<1,l,mid,l1,r1));if(mid+1<=r1)ans=max(ans,find2(now<<1|1,mid+1,r,l1,r1));return ans;
}// 区间修改(加法)
void modify(int now,int l,int r,int l1,int r1,int v){if(l>=l1&&r<=r1){tag[now]+=v;tree1[now]+=v;tree2[now]+=v;// 同步更新两个模数的哈希值sum_a1[now]=1ll*sum_a1[now]*pw1[v]%mod1;sum_b1[now]=1ll*sum_b1[now]*inv1[v]%mod1;sum_a2[now]=1ll*sum_a2[now]*pw2[v]%mod2;sum_b2[now]=1ll*sum_b2[now]*inv2[v]%mod2;return ;}int mid=l+r>>1;push_down(now);if(mid>=l1)modify(now<<1,l,mid,l1,r1,v);if(mid+1<=r1)modify(now<<1|1,mid+1,r,l1,r1,v);up(now);
}// 哈希查询结果结构体
struct HashRes{int a1,b1,a2,b2; // 分别对应mod1正和、mod1逆和、mod2正和、mod2逆和
};// 查询区间哈希和
HashRes find(int now,int l,int r,int l1,int r1){if(l>=l1&&r<=r1){return {sum_a1[now],sum_b1[now],sum_a2[now],sum_b2[now]};}int mid=l+r>>1;push_down(now);HashRes res={0,0,0,0};if(mid>=l1){HashRes tmp=find(now<<1,l,mid,l1,r1);res.a1=(res.a1+tmp.a1)%mod1;res.b1=(res.b1+tmp.b1)%mod1;res.a2=(res.a2+tmp.a2)%mod2;res.b2=(res.b2+tmp.b2)%mod2;}if(mid+1<=r1){HashRes tmp=find(now<<1|1,mid+1,r,l1,r1);res.a1=(res.a1+tmp.a1)%mod1;res.b1=(res.b1+tmp.b1)%mod1;res.a2=(res.a2+tmp.a2)%mod2;res.b2=(res.b2+tmp.b2)%mod2;}return res;
}signed main(){freopen("test.in","r",stdin); int n=read(),q=read();// 初始化幂次数组和逆元数组pw1[0]=1,pw2[0]=1;inv1[0]=1,inv2[0]=1;invp1=pw(h1,mod1-2,mod1);invp2=pw(h2,mod2-2,mod2);for(int i=1;i<=200000;i++){pw1[i]=1ll*pw1[i-1]*h1%mod1;pw2[i]=1ll*pw2[i-1]*h2%mod2;inv1[i]=1ll*inv1[i-1]*invp1%mod1;inv2[i]=1ll*inv2[i-1]*invp2%mod2;}for(int i=1;i<=n;i++){a[i]=read();} build(1,1,n); while(q--){int op=read(),l=read(),r=read();if(op==2){if((r-l+1)&1){ // 长度为奇数直接不符合puts("NO");continue;} int mn=find1(1,1,n,l,r);int mx=find2(1,1,n,l,r);HashRes tmp=find(1,1,n,l,r);// 验证两个模数的哈希条件bool ok1=(1ll*tmp.a1*pw(invp1,mn,mod1)%mod1 == 1ll*tmp.b1*pw(h1,mx,mod1)%mod1);bool ok2=(1ll*tmp.a2*pw(invp2,mn,mod2)%mod2 == 1ll*tmp.b2*pw(h2,mx,mod2)%mod2);if(ok1&&ok2)puts("YES");else puts("NO");}else {int v=read();modify(1,1,n,l,r,v);}}return 0;
}

K

A

http://www.hskmm.com/?act=detail&tid=24970

相关文章:

  • 20250531MATLAB三维绘图 - 教程
  • 概率期望dp 复习笔记
  • 2025.10
  • PCIe扫盲——物理层逻辑部分基础(一)
  • 仅需3%训练数据的文本归一化技术
  • 价值原语博弈协议:价值原语共识锚定原则
  • 实用指南:工作流引擎-16-开源审批流项目之 整合Flowable官方的Rest包
  • 25fall做题记录-October - Amy
  • 嗯嗯
  • PCIe扫盲——AckNak 机制详解(二)
  • ASP.NET Core SignalR 身份认证集成指南(Identity + JWT) - 详解
  • utorrent 2.2.1
  • 2025热缩管厂家 TOP 企业品牌推荐排行榜,氟橡胶,双壁,线缆标识,防滑花纹,DR 耐油橡胶,PVDF,标识,航插用,军用热缩管公司推荐!
  • 市场交易反心理特征之八:劣仓驱逐良仓
  • 做题笔记18
  • 2025桩基检测机构最新企业咨询服务推荐排行榜,海上桩基检测,水上桩基检测服务推荐这十家公司!
  • 算法坑点
  • [省选联考 2025] 图排列 题解
  • Windows下安装并采用kubectl查看K8S日志
  • 实用指南:UV 包管理工具:替代 pip 的现代化解决方案
  • C/C++与Java、Python、Go在各个阶段的区别
  • 古典密码之凯撒密码
  • vi/vim文本编辑器
  • AI一周资讯 250926-251005
  • B3869 [GESP202309 四级] 进制转换-题解
  • 物理
  • springcloud gateway Error creating bean with name bootstrapImportSelectorConfiguration:
  • 完整教程:PyCharm接入DeepSeek,实现高效AI编程
  • Nginx的核心功能及实现
  • 2025焚烧炉厂家权威推荐,技术实力与市场口碑深度解析