首页 > 其他分享 >12.10 CW 模拟赛 T3. 循环

12.10 CW 模拟赛 T3. 循环

时间:2024-12-11 19:21:39浏览次数:4  
标签:rt cnt ch return int mid T3 12.10 CW

算法

很容易想到枚举短边断环之后 \(\mathcal{O} (P)\) 的求答案

那么这个算法还有前途吗?

可以发现, 对于每次枚举断边, 断 \((i, i + 1)\) 和 \((i - 1, i)\) 这两条边, 变化量并不大, 严格来说, 均摊复杂度 \(\mathcal{O} (P)\)

具体实现上怎么处理呢?

将断第 \(x\) 条边作为横轴, 满足每一个点对需要的边放在 \(y\) 轴, 显然的, 这就变成了一些由矩阵组合而成的图形, 注意到可以用扫描线来处理

对于每一条边, 我们预处理出其需要被使用的起始点 / 终结点, 具体的, 对于每一个要求点对 \((a,b)\) , \([1,a),[b,n]\) 中的边不选时其覆盖区间为 \([a,b)\) , 否则为 \([1,a),[b,n]\)

然后, 扫描 \(x\) 轴, 对于 \(y\) 轴, 线段树区间查询

代码

放一个 \(\rm{ZCY}\) 大佬的代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
#define int long long
int n, P, M, S, c[N], l[N], r[N], f[N], cnt;
struct seg
{
    int cnt, sum;
} s[N << 2];
struct scan
{
    int y_up, y_down, x, w;
} a[N << 3];
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
void pushup(int l, int r, int rt)
{
    if (s[rt].cnt)
        s[rt].sum = f[r] - f[l - 1];
    else
        s[rt].sum = s[rt << 1].sum + s[rt << 1 | 1].sum;
}
void update(int l, int r, int rt, int L, int R, int w)
{
    if (L > R)
        return;
    if (L <= l && R >= r)
    {
        s[rt].cnt += w;
        pushup(l, r, rt);
        return;
    }
    int mid = (l + r) >> 1;
    if (L <= mid)
        update(l, mid, rt << 1, L, R, w);
    if (R > mid)
        update(mid + 1, r, rt << 1 | 1, L, R, w);
    pushup(l, r, rt);
}
int query(int l, int r, int rt, int L, int R)
{
    if (L <= l && R >= r)
        return s[rt].sum;
    int mid = (l + r) >> 1, res = 0;
    if (L <= mid)
        res += query(l, mid, rt << 1, L, R);
    if (R > mid)
        res += query(mid + 1, r, rt << 1 | 1, L, R);
    return res;
}
bool cmp(scan aa, scan bb)
{
    return aa.x < bb.x;
}
signed main()
{
    cin >> n >> P >> M >> S;
    for (int i = 1; i <= n; i++)
    {
        S = (S * 1103515245 + 12345) % (1LL << 31);
        c[i] = 1 + ((S / 10) % M);
        f[i] = f[i - 1] + c[i];
    }
    for (int i = 1; i <= P; i++)
    {
        S = (S * 1103515245 + 12345) % (1LL << 31);
        l[i] = ((S / 10) % n) + 1;
        S = (S * 1103515245 + 12345) % (1LL << 31);
        r[i] = ((S / 10) % n) + 1;
        if (l[i] > r[i])
            swap(l[i], r[i]);
    }
    for (int i = 1; i <= P; i++)
    {
        if (l[i] != 1)
        {
            update(1, n, 1, l[i], r[i] - 1, 1);
            a[++cnt].x = l[i];
            a[cnt].y_down = l[i], a[cnt].y_up = r[i] - 1, a[cnt].w = -1;

            a[++cnt].x = l[i];
            a[cnt].y_down = 1, a[cnt].y_up = l[i] - 1, a[cnt].w = 1;

            a[++cnt].x = r[i];
            a[cnt].y_down = 1, a[cnt].y_up = l[i] - 1, a[cnt].w = -1;
        }
        a[++cnt].x = l[i];
        a[cnt].y_down = r[i], a[cnt].y_up = n, a[cnt].w = 1;

        a[++cnt].x = r[i];
        a[cnt].y_down = r[i], a[cnt].y_up = n, a[cnt].w = -1;

        a[++cnt].x = r[i];
        a[cnt].y_down = l[i], a[cnt].y_up = r[i] - 1, a[cnt].w = 1;
    }
    sort(a + 1, a + cnt + 1, cmp);
    int ans = 1e18;
    a[0].x = 1;
    for (int i = 1; i <= cnt; i++)
    {
        if (a[i].x != a[i - 1].x)
            ans = min(ans, s[1].sum);
        update(1, n, 1, a[i].y_down, a[i].y_up, a[i].w);
    }
    ans = min(ans, s[1].sum);
    cout << ans;
    return 0;
}

总结

善于找到暴力算法为什么劣

扫描线可以处理一些均摊复杂度问题

标签:rt,cnt,ch,return,int,mid,T3,12.10,CW
From: https://www.cnblogs.com/YzaCsp/p/18600531

相关文章

  • 12.10 CW 模拟赛 T2. 乘法
    算法剪枝怎么都过不去\(50\%\),红温了不管了容易想到的是,枚举最终\(B\)进制数的位数,然后进行一个搜索来确定答案这样不够优秀,考虑折半搜索,我们将\(B\)进制数分为两个部分,然后分别判断两个部分对\(n\)取余的值,若可以,考虑归并具体怎么操作呢?对于左......
  • 2024.12.10 周二
    2024.12.10周二Q1.1100给你一个序列,你可以对这个序列中的每个数(0<=ai<100)进行拆分,使得最后整个序列单调不递减,询问是否有解。Q2.1200给定一数组,可任意改变顺序,问是否可使a1%a2%a3%...%an!=0。Q3.1300给定数组a,数字x,y。问<i,j>的对数使(ai+aj)%x==0,(ai-aj)%y==0。......
  • 在Windows下为CodeBlocks20.3安装、配置wxWidget3.2.6
    0.前言CodeBlocks是使用C++编写程序的一个很好的开发环境,最大的好处是它是开源的、免费的,而不仅仅是因为它具有跨平台的能力。还有一个很重要的原因是在CodeBlocks中可以使用wxWidget,wxWidget也是开源的、免费的。尽管Qt和MFC也很优秀,QtCreator和VisualStudio都是很优秀的开发......
  • 12.10随笔
    这里是12.10随笔。题目留档:实现线性探测法的查找函数。函数接口定义:PositionFind(HashTableH,ElementTypeKey);其中HashTable是开放地址散列表,定义如下:defineMAXTABLESIZE100000/*允许开辟的最大散列表长度*/typedefintElementType;/*关键词类型用整型......
  • 【Python】【练习】24.12.10
    一、题目描述二、题目解答importrandomdefredEnv(k,rest):m=random.random()*restreturnmtotal=float(input("请输入红包金额:"))num=int(input("请输入红包个数:"))remain=totalforiinrange(num-1):money=redEnv(i,remain......
  • Diary - 2024.12.10
    AtcoderARC189EStraightPath。怎么都觉得很简单,我是不是废了???只是记录一下可能比较合理的思考过程。首先发现的是\(n=2,3\)必定无解。然后手玩一下\(n=4\),能找到一个\(\max=3\)的构造。于是大胆猜测下界就是\(3\)。对应构造:横的为\(1\),竖的为\(2\),对角线......
  • 部署pinpoint3.0.0
    pinpoint3.0的完整部署,跟2.5版本差距较大,2.5版本直接运行collector和web的jar包即可达成最快使用,但是3.0这样启动会报错按照pinpoint官网的文档,虽然可以成功部署,但是其中的弯路也比较多,现在整理一下免得后来人踩坑,也给自己留个小抄jdk本文档所使用的jdk版本为21.0.4,理论上1......
  • 12.10 CW 模拟赛 赛时记录
    前言最近发现只要每分钟都在做有意义的事就不算颓,同理的,这场考试只要每分钟都在想些事情,也就不算短期的主要目标就是利用好时间,其他的问题我基本上已经解决了,就是时间分配利用上的问题所以就只抓时间分配,这段时间先不去想别的,就好好把时间利用起来,不死磕,不畏......
  • WebLogic T3反序列化漏洞(CVE-2018-2628)--vulhub
    WebLogicT3反序列化漏洞(CVE-2018-2628)WebLogic在通信过程中使用T3协议传输数据,涉及到了序列化和反序列化操作。T3协议概述T3协议是Oracle的私有协议,所以公开的相关资料比较少,这里结合其他师傅的博客简单对T3协议进行一个简要分析。T3协议是WebLogic的一种专有通信协......
  • 解决升级SpringBoot3 JPA报Could not locate TableGroup问题
    产品技术架构从SpringBoot2.x升级到SpringBoot3.x后,对原有代码进行单元测试时发现,之前通过CriteriaQuery查询对象实现的分页查询功能,在进行记录数count查询时,会抛出SqlTreeCreationException:CouldnotlocateTableGroup异常。通过排查发现,SpringBoot2.x依赖的是Hibernate5.x,S......