Skip to content

泉州一中信息学Blog

信息学奥赛技术分享博客

  • 登录
  • 小学oj
  • 中学oj
  • 测试页面1
  • Toggle search form

HLOJ-DAY 9

Posted on 2024年7月11日 By 张, 高畅 HLOJ-DAY 9无评论

怎么又是模拟赛(悲

怎么每次都能炸(悲

[A]

(找不到原而复制原题面的屑ETG)

现在有一个长度为 n 的序列 a_1,a_2,…,a_n,满足 \forall i,j 且 ij \leq n 有 a_{ij}=a_i+a_j。

现在有 q 个长度为 n 的合法序列。卡密想要对这 q 个序列做一点修改,他会对每一个序列选择一个位置,修改这个位置的值。对于每个序列,我们要在不改动已经更改的元素的情况下,修改序列中的其他元素使得序列仍然合法。现在我们想要知道,对于每个序列,我们最小需要修改序列中多少个位置的元素才能使其合法。

很显然这题就是让你求最大质因子,直接 O(\sqrt n) 分解质因数就可以了。

至于质数筛这种科技,还是放在第四题用吧。

CODE

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
    freopen("log.in","r",stdin);
    freopen("log.out","w",stdout);
    scanf("%d%d",&n,&m);
    while(m--)
    {
        int x;
        scanf("%d",&x);
        if(x==1)puts("-1");
        else
        {
            int t=x,res=0;
            for(int i=2;i<=x/i;i++)
            {
                if(t%i==0)
                {
                    while(t%i==0)t/=i;
                    res=max(res,i);
                }
            }
            if(t>1)res=max(res,t);
            printf("%d\n",n/res-1);
        }
    }
    return 0;
}

[B]

(又找不到原而复制题面的ZGC)

对于一个正整数序列 a_i,若它可以被划分为两个不相交的子序列(可以不连续,每个位置恰好属于其中一个子序列),两个子序列的和相等,那么称这个序列为好序列。
对于一个正整数序列 A,若其所有长度为 k 的连续子序列都是好序列,那么称这个序列为 k-序列。
给你 T 个正整数序列,对于每个序列,求出它是 k-序列 的所有 k 的值。

显然这题我们需要考虑如何快速判断区间 [l,r] 是否合法。

考虑DP,令 f(i) 为到当前的右端点 r 时,从 a_1,a_2,…,a_r 中任意取出一些数和为 i 时左端点 l 的最大值。

这个转移写起来像一个 01背包问题,因此转移时注意内层循环倒序。

转移方程 $f_S=max(fS,f{S-ar}),每一次DP完后令f{a_r}=r$

这样子,判断 [l,r] 是否合法,其实只需要判断 [l,r] 的和是否是偶数, f_{cnt/2} 是否 \geq l(是的TJ这里写错了(应该吧))。

注意我们每一次实际只使用 f_{cnt/2} ,因此做DP的时候值域可以压缩一半。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5,M=1e5+5;
int n,a[N],s[N],f[M],st[N];
void work()
{
    memset(f,-0x3f,sizeof f);
    memset(st,0,sizeof st);
    scanf("%d",&n);
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        s[i]=s[i-1]+a[i];   
    }
    f[0]=1;
    st[1]=1;
    for(int r=1;r<=n;r++)
    {
        for(int S=s[n]/2;S>=a[r];S--)f[S]=max(f[S],f[S-a[r]]);
        f[a[r]]=r;
        for(int l=1;l<r;l++)
        {
            int cnt=s[r]-s[l-1];
            if((cnt&1)||(f[cnt/2]<l))st[r-l+1]=1;
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(!st[i])cnt++;
    }
    printf("%d ",cnt);
    for(int i=1;i<=n;i++)
    {
        if(!st[i])printf("%d ",i);
    }
}
int main()
{
    freopen("part.in","r",stdin);
    freopen("part.out","w",stdout);
    int T;
    scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
        if(i)puts("");
        work();
    }
    return 0;
}

[C]

原题
TG的题,但还是写一下吧。

首先先将行与列拆开,变成二分图的形式进行连边。

如果在二分图上出现了环,那么肯定是合法的,输出这一个环即可。

但如果没有出现环,也不代表一定不合法。

我们考虑从叶子节点开始树形DP。

(其实就是将子节点返回的结果异或起来)

如果为 0 ,代表此节点向上的那一条边是一定要选的,而此时如果这个节点为根节点,显然是不合法的。

注意偶数时找环的细节。

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int n,m,st[N],f[N];
vector<int>res;
vector<pair<int,int>>path,G[N];
void dfs(int u,int father,int id)
{
    st[u]=1;
    path.push_back({u,id});
    for(auto [j,k]:G[u])
    {
        if(j==father)continue;
        if(st[j])
        {
            puts("TAK");
            int cnt=1;
            for(int i=path.size()-1;~i&&path[i].first!=j;i--)cnt++;
            printf("%d\n",cnt);
            printf("%d ",k);
            for(int i=path.size()-1;~i&&path[i].first!=j;i--)printf("%d ",path[i].second);
            exit(0);
        }
        dfs(j,u,k);
    }
    path.pop_back();
}
int DFS(int u,int father,int id)
{
    st[u]=1;
    for(auto [j,k]:G[u])
    {
        if(j==father)continue;
        f[u]^=DFS(j,u,k);
    }
    if(!f[u])
    {
        res.push_back(f[u]=id);
        return 1;
    }
    return 0;
}
int main()
{
    freopen("trap.in","r",stdin);
    freopen("trap.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        G[a].push_back({b+n,i});
        G[b+n].push_back({a,i});
    }
    for(int i=1;i<=(n<<1);i++)
    {
        if(!st[i])dfs(i,-1,-1);
    }
    memset(st,0,sizeof st);
    for(int i=1;i<=(n<<1);i++)
    {
        if(!st[i])DFS(i,-1,-1);
    }
    for(int i=1;i<=(n<<1);i++)
    {
        if(f[i]==-1)
        {
            puts("NIE");
            return 0;
        }
    }
    puts("TAK");
    printf("%d\n",res.size());
    for(auto i:res)printf("%d ",i);
    return 0;
}

[D][E]

前面的区域,以后再来探索吧。(

训练日志

文章导航

Previous Post: DAY!
Next Post: 这篇文章的题目是剪贴板d87hf98y的答案。

发表回复 取消回复

要发表评论,您必须先登录。

2025年 6月
一 二 三 四 五 六 日
 1
2345678
9101112131415
16171819202122
23242526272829
30  
« 2月    

2024常州 Class Classic OI Problems Contest cqr的长乐集训2023 CZYZ LOC New Game NOI NOIP Password Protected PM_PK Preview Problems Retrospect Selfmade Qusetion STL The end Training Uneasy Problem 蒟蒻 通报

  • 训练日志
  • 链表
  • 入门
  • 模拟
  • dfs序
  • 并查集
  • spfa
  • 最小割
  • 矩阵树定理
  • 仙人掌
  • BSGS
  • 凸包
  • 回文自动机
  • 递推与动归
  • 堆
  • 莫队算法
  • ST表
  • Treap
  • 树套树
  • 可持久化线段树
  • 初赛
  • 搜索
  • 贪心
  • 深度优先搜索
  • 欧拉图
  • dijkstra
  • 费用流
  • 哈夫曼树
  • kruskual
  • 置换
  • 旋转卡壳
  • KMP
  • 区间动归
  • STL
  • 链表
  • 可并堆
  • sply
  • 主席树
  • 可持久化字典树
  • 算法
  • 动态规划
  • 构造
  • 广度优先搜索
  • 最短路
  • floyd
  • 最大流
  • 虚树
  • prim
  • 筛法
  • 半平面交
  • 字典树
  • 背包动归
  • 基础数据结构
  • 分块
  • 线段树
  • 替罪羊树
  • K-DTree
  • 图论
  • 二分法
  • 迭代搜索
  • 拓扑排序
  • 有上下界网络流
  • 生成树
  • 快速幂
  • 后缀数组
  • 树形动归
  • 哈希表
  • 中级数据结构
  • 平衡树
  • 可持久化数据结构
  • 数据结构
  • 三分法
  • 启发式搜索
  • 图的连通
  • 点分治
  • 博弈论
  • AC自动机
  • 状压动归
  • 单调栈
  • 树状数组
  • 高级数据结构
  • OI资料
  • 数学
  • 高精度
  • 差分约束
  • 树上倍增
  • 素数测试
  • 后缀自动机
  • 数位动归
  • 单调队列
  • 新闻
  • 几何
  • 随机化
  • 二分图染色
  • 树链剖分
  • 欧拉函数
  • manacher
  • 斜率优化
  • 离线处理
  • 信息学奥赛学长风采
  • 字符串
  • 二分图匹配
  • prufer编码
  • 卡特兰数
  • 密码学
  • 决策单调
  • 赛后总结
  • 其他
  • 2-SAT
  • 最近公共祖先
  • 矩阵乘法
  • 记忆化搜索
  • 网络流
  • Link cut tree
  • 排列组合
  • 树
  • 高斯消元
  • 乘法逆元
  • 容斥原理
  • 调和级数
  • 概率与期望
  • 模线性方程组
  • 莫比乌斯反演
  • 快速傅里叶变换
  • 扩展欧几里德
  • 最大公约数与最小公倍数

近期文章

  • DP杂题
  • 2025年2月13日模拟赛
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 3
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 2
  • HLOJ-TEST ROUND 4-T1/T2(构造)- 1

近期评论

归档

  • 2025年2月
  • 2025年1月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月

Copyright © 2025 泉州一中信息学Blog.

Powered by PressBook WordPress theme