合集-xcpc训练

摘要:A 题意: 给定一个01串,可以选择一个开头和结尾字符不同的子串,并将其删去,求通过删除操作能产生的字典序最小的字符串为什么?(可以为空) 思路: 如果头尾不同,直接为空 若首尾相同且为1,那么中间如果有子串00则可以删成空。否则不能,此时字符串的形式:101110101101 发现连续的1段肯定大 阅读全文
posted @ 2025-05-22 21:33 Marinaco 阅读(135) 评论(0) 推荐(0)
摘要:题意: 给定一个长度为n的字符串s,要求选定一个区间,可以重排字符。求出最长的可以回文的子串 思路: 考虑每个字符的奇偶性。显然当区间长度为偶数时,每种字符的数量为偶。区间长度为奇数时,只有一种字符的数量为奇 将[1,x]中26个字符的数量,奇数为1,偶数为0,则可以压缩成范围在[1,1<<26)的 阅读全文
posted @ 2025-05-28 22:28 Marinaco 阅读(49) 评论(0) 推荐(0)
摘要:题意: 给定一个矩阵,求以从四个拐角处开始画满螺旋矩阵的顺序构成的数组的子数组最大和 思路: N=1000,暴力模拟,将八个数组全部打出 再通过经典的子数组最大和dp求出 int g[1005][1005]; int ans=0; int f[maxn]; void dp(vector<int>&x 阅读全文
posted @ 2025-05-29 08:46 Marinaco 阅读(34) 评论(0) 推荐(0)
摘要:10 题意:给定一个排列,对于每一个1<=i<=j<=n,当(j-i+1)为奇数时,求和ixjxmid(a[i]~a[i]) 思路: 注意到n<=2000,可以使用暴力枚举加主席树维护区间第k小解决 struct PT{ static constexpr int N=2e5+5; int cntNo 阅读全文
posted @ 2025-07-19 11:52 Marinaco 阅读(160) 评论(0) 推荐(0)
摘要:这场才做出来三个,艰难依旧坚持 09 苹果树 依然树剖 题意: 给定一棵树,q次查询 查询1:查找x,y路径上的最大值 查询2:使结点x邻接的结点+z 思路: 树剖+线段树板子容易维护查询1 重点在于查询2 与x的邻接结点:x的父亲结点(若有) + x的儿子结点(若有) 显然如果暴力维护查询2,最坏 阅读全文
posted @ 2025-07-21 19:54 Marinaco 阅读(67) 评论(0) 推荐(0)
摘要:E 题意: 给定数组。每次可以挑两个除它们的约数,或者同时乘以某个数。求是否能让全变为某个数 思路: 发现n为奇数时一定可以 n=2时特判 n为偶数时,只要有一个质因子出现次数为奇数就不可以 普通质因数分解O(nsqrt(V))不行 使用异或哈希,为每一个质因子分配一个哈希值。通过欧拉筛法把合数的哈 阅读全文
posted @ 2025-07-22 18:03 Marinaco 阅读(110) 评论(0) 推荐(0)
摘要:A void solve(){ int a,b,c;cin>>a>>b>>c; if(b>c){ if(a>=b&&a<24||a>=0&&a<c)cout<<"No"<<endl;else cout<<"Yes"<<endl; }else{ if(0<=a&&a<b||a>=c)cout<<"Ye 阅读全文
posted @ 2025-07-24 23:02 Marinaco 阅读(27) 评论(0) 推荐(0)
摘要:1007 题意:划分n个区间。一个数属于某个区间则获得其区间的性质。问一共有多少个不同性质的点 思路: 很快想到了哈希,但是离散化出了问题 显然将区间端点离散化,并为每个区间赋哈希值。再通过差分,统计不同大小的数即可 要注意:1.差分是对l,r+1进行操作的,因此差分时要对r+1进行额外的离散化 2 阅读全文
posted @ 2025-07-25 19:32 Marinaco 阅读(51) 评论(0) 推荐(0)
摘要:bitset可以开到1e6左右 int n; pii a[505]; void solve(){ cin>>n; rep(i,1,n)cin>>a[i].fi>>a[i].se; int cnt=0; vector<bitset<1000001>>f(n+1); f[0][0]=1; rep(i,1 阅读全文
posted @ 2025-07-26 16:24 Marinaco 阅读(46) 评论(0) 推荐(0)
摘要:A void solve(){ int n;cin>>n; int l,r;cin>>l>>r; string s;cin>>s; s=" "+s; for(int i=l;i<=r;i++){ if(s[i]=='x'){ cout<<"No"<<endl; return; } } cout<<" 阅读全文
posted @ 2025-07-26 22:39 Marinaco 阅读(38) 评论(0) 推荐(1)
摘要:1008 狗日的被这题卡了:( 题意:给定一个长度为n的数组a。以及x>=y>=z三个参数 现在要求构造排列使数组重新排序 初始权值S为0 当 a_p[i]>a_p[i-1] , S+=x 当 a_p[i]=a_p[i-1] , S+=y 当 a_p[i]<a_p[i-1] , S+=z 求能构造的 阅读全文
posted @ 2025-07-28 18:53 Marinaco 阅读(36) 评论(0) 推荐(0)
摘要:L 题意:构造一个长度为2n的括号序列,满足字典序最小且在给出的q个区间内都至少有一个左括号 思路: 为了满足字典序尽量小,一定想把左括号放在靠左的位置 为了满足区间至少有一个左括号,需要贪心地按左端点从大到小排序,将左括号依次放在区间的左端点。如果区间已经有左括号,直接跳过 -1的情况是左括号数量 阅读全文
posted @ 2025-07-31 18:07 Marinaco 阅读(240) 评论(0) 推荐(0)
摘要:F 题意:给出一个数组a,每次可以选择一个数字v,使得所有ai:=|ai-v|。 求不超过n次操作下,sigma(1<=i<j<=n)|ai-aj|的最小值 思路: 对于两个奇偶性相同的数字,可以令v等于这两个数的平均值,并进行一次操作。发现这可以使两个数相等 因此你可以进行 n/2 次操作,使数组 阅读全文
posted @ 2025-08-05 21:29 Marinaco 阅读(100) 评论(0) 推荐(0)
摘要:B 题意:给定一些参数。和初始排列P={0,1,2,3...}.计算(n-1)次区间循环左移后的逆序对数量奇偶性 思路: 考虑对于一个排列而言,交换两个位置不同的数会对总体逆序对数量产生的影响 不妨设i<j,Pi<Pj 显然对于[0,i-1],[j,n-1]来说,交换Pi,Pj不会改变这两个区间对于 阅读全文
posted @ 2025-08-07 19:44 Marinaco 阅读(46) 评论(0) 推荐(0)
摘要:1006 题意:给出若干参数,请求出x([L,R]范围内),使得表达式值最大 思路: 设题目所给的N/K为m 那么f(x)=x/(m/x)(向下取整)+x 如果x>m,那么f(x)=x,此时x越大越好,若R>m,那么一个答案为f(R)=R 如果x=m,那么f(x)=2x=2m 如果x<m,那么由于向 阅读全文
posted @ 2025-08-09 23:09 Marinaco 阅读(65) 评论(0) 推荐(0)
摘要:优先队列+贪心 题意:现有n个电池,每个电池容量为ai。有m个充电桩,充电桩位置为pi,能为ti电池充满电。可以任意选择电池进行消耗,一电池能行一公里,问最远路程 思路: 显然,消耗电池的顺序是按充电桩位置顺序排列的。因为不能回头,每个充电桩都要尽可能利用到 不妨使用优先队列,按充电桩优先级排列每个 阅读全文
posted @ 2025-08-19 19:37 Marinaco 阅读(40) 评论(0) 推荐(0)
摘要:按位贪心+分讨+答案差分 题意:给定一个序列a以及一个k,构造一个x使(ai ^ x ) <=k的ai数量最多 思路:枚举每一个a,从高位到低位分类讨论 设该位为j , 那么有四种情况 aj=1,k=1 aj=1,k=0 aj=0,k=1 aj=0,k=0 前面的位a与x异或后与k相同,判断该位然后 阅读全文
posted @ 2025-08-22 19:17 Marinaco 阅读(28) 评论(0) 推荐(0)
摘要:哎出大锅了 贪心,先求出封榜前通过题数最多且罚时最少的队伍,假定某个队伍封榜后所有的题目都是第一发交了就过 先按时间排个序 需要注意: 1.去重 2.计算罚时:显示accepted还要计算之前没过导致题目罚时,而如果这个题目没通过的话就不计算罚时 3.对于封榜后的提交也要正确计算罚时,即之前reje 阅读全文
posted @ 2025-09-07 22:33 Marinaco 阅读(30) 评论(0) 推荐(0)
摘要:链接 题意: 有n个带权的点以及参数k,要求生成一个最小生成树,每个点之间的边权为两个点权之和模k的结果 思路: 对所有权值模k后 发现对于一个权值为val的结点u,链接它的最优结点是 现在还没进入生成树的 (权值最小)或者(最小的 权值大于等于k-val) 的节点 因此贪心去选择这些边,然而有可能 阅读全文
posted @ 2025-09-24 13:36 Marinaco 阅读(56) 评论(0) 推荐(0)
摘要:rt 做法: 先枚举\(mex\),说明\(mex\)不会在答案区间中存在 那么答案区间就是一个不包含\(mex\)的极长区间,可能有\(n\)个 一个区间中不同数的个数可以用树状数组求:维护以下标为权值的桶,每次更新last数组 const int M=5e5+5; int sum[M]; int 阅读全文
posted @ 2025-10-29 21:00 Marinaco 阅读(20) 评论(0) 推荐(0)
摘要:[https://qoj.ac/contest/2567/problem/14709] 题意: 斯诺克台球,给出最后的选手A和选手B的得分,以及最后到谁打了,构造一个合法操作序列使得最后结果为给出结果 思路: 记忆化搜索:f[i][j][lft][k][op] 表示 选手A得分为i,选手B得分为j, 阅读全文
posted @ 2025-11-10 15:43 Marinaco 阅读(21) 评论(0) 推荐(0)
摘要:题意: 给定若干个点,它们有一个要追赶的点和当前位置,求最后所有点停止的时间,(一个点移动的速度为0.5) 思路: 使用set模拟优先队列 求出每个点移动的方向(一定不变了) 存一个pair<当前点和追赶点的距离 即time(相向而行时time=dis/2),当前点> 第一个停的点一定是相向而行的点 阅读全文
posted @ 2025-11-10 17:22 Marinaco 阅读(26) 评论(0) 推荐(0)
摘要:ordered_multiset 由于set和multiset不支持随机访问,所以二分查询的速度是\(O(n)\)的 (你不可以使用st.lower_bound(value) -st.begin()这样的查询方法而是需要调用distance方法) ordered_multiset提供了方法order 阅读全文
posted @ 2025-11-25 11:42 Marinaco 阅读(14) 评论(0) 推荐(0)
摘要:A int w,b; void solve(){ cin>>w>>b; w*=1000; cout<<w/b+1; } B int n,m; void solve(){ cin>>n>>m; map<int,int>mp; map<int,int>cnt; rep(i,1,n){ int a,b;c 阅读全文
posted @ 2025-11-30 09:55 Marinaco 阅读(21) 评论(0) 推荐(0)

//雪花飘落效果