首页 > 其他分享 >2023/11/16 NOIP 模拟赛

2023/11/16 NOIP 模拟赛

时间:2023-11-16 14:56:45浏览次数:29  
标签:11 NOIP 16 int ll dfs abs tot find

T1 基于1的算术

标签

暴力枚举

思路1

赛时想了个假的 DP,只拿了 77 分,,,

小于 \(10^{15}\) 的仅由 \(1\) 组成的数只有 \(15\) 个,直接枚举即可。

想了一个做法,就是直接枚举第 \(i\) 位作为最高位的 \(1\) 串取了几个,分解每位,设从高到低 \(i\) 位为 \(a_i\),\(a_i - 3\sim a_i + 3\) 全部枚举即可,加个剪枝,就是答案大于当前答案时退出,然后改变一下枚举顺序即可,跑的飞快。

代码

好像这份代码多枚举几种反而更快,只枚举 \([-2, +2]\) 的不仅会 WA 还会 TLE。玄学复杂度。

code
void dfs(ll i, ll f, ll tot, ll res) {
    if (f >= ans)
        return;
    if (i == 1)
        return cmin(ans, abs(a[1] + tot + res) + f);

    a[i] = a[i] + res + tot;
    ll t;

    t = -a[i];
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] - 1;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] + 1;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] - 2;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] + 2;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] - 3;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    t = -a[i] + 3;
    dfs(i - 1, f + abs(t) * i, tot + t, (t + a[i]) * 10);

    a[i] = a[i] - res - tot;
}

思路二

题解里说,从高到低枚举,每位只会取当前的 \(\lfloor\frac{n}{x_i}\rfloor\) 或 \(\lfloor\frac{n}{x_i}\rfloor + 1\),其中 \(x_i\) 是长为 \(1\) 的全 \(1\) 串。复杂度 \(O(2^{\lg n})\)。

代码

code
ll n, x[20], ans;

void dfs(int i, ll n, ll res) {
	if(res >= ans) return;
	if(i == 1) return cmin(ans, res + abs(n));
	dfs(i - 1, n % x[i], res + abs (n / x[i]) * i);
	if(n % x[i] == 0) return;
	dfs(i - 1, x[i] - n % x[i], res + (abs (n / x[i]) + 1) * i);
}

int main() {
	freopen("add.in", "r", stdin);
	freopen("add.out", "w", stdout);
	rd(n); ans = n;
	rep(i, 1, 16) x[i] = x[i - 1] * 10 + 1;
	dfs(16, n, 0);
	printf("%lld\n", ans);
	return 0;
}

T2 逃离

标签

二分,贪心

思路

二分结束时间,对每辆车特殊设置终点,即 \(t\) 时必须给后面的车留足空位。

小数二分,别忘了加 \(eps\)。

代码

好写,就是卡了下精度。

code
bool _st;

ci N = 3e5 + 9;
const db INF = 1e18;
constexpr db eps = 1e-7;

struct car {
    ll l, r, v;
    void input() { rd(l, r, v); }
    bool operator<(const car &rhs) { return l < rhs.l; }
} c[N];

int n, m, k;
ll t;
ll sum[N];

bool _ed;

int check(db dl) {
    ll tot = 0;
    rep(i, 1, n) {
        db nv = (t + sum[i - 1] - c[i].l) / dl;
        if (nv <= c[i].v)
            continue;
        tot = tot + ceil((nv - c[i].v) / k);
    }
    return tot <= m;
}

int main() {
    //	cerr << -(&_ed - &_st) / 1048576.0 << "MB" << endl;
    freopen("car.in", "r", stdin);
    freopen("car.out", "w", stdout);
    rd(n, t, m, k);
    rep(i, 1, n) c[i].input();
    sort(c + 1, c + n + 1);
    rep(i, 1, n) sum[i] = sum[i - 1] + (c[i].r - c[i].l);
    db L = 0, R = INF;
    while ((R - L) > eps) {
        db mid = (L + R) / 2;
        if (check(mid))
            R = mid;
        else
            L = mid + eps * 10;
    }
    printf("%.3lf\n", L);
    return 0;
}

T3 南斯拉夫

标签

小清新
构造
乱搞

思路

好像其他人有些乱搞的过了,SPJ 也出了好几次锅,后来我提供了一个 SPJ,发现如果读入的是无法识别(非可操作种类)则不会修改,然后就 AC 了,,,貌似这题很容易出解,随便搞个情况就好了。

我是转换思路,首先可以对有解的情况构造方案使其永远在 \(\{0, 1\}\) 中改变,相当于异或,每条边即令其一个端点的点值异或 \(1\)。

这样不太好搞,考虑相异转相同。对每条边,选择任意一个端点(代码中选的是较小的)将点权异或上 \(1\),对每条边的操作就变成了不变或将两个端点同时异或上 \(1\),因为异或和不变,若一个连通块内异或和不为 \(0\) 则无解,发现等价于边数为奇数。

然后对每一个连通块考虑,因为异或的可消除性,这个连通块内必有偶数个黑点(即点权不为 \(0\) 的点),任选两个黑点,考虑选取任一路径上的所有边,将是否操作的状态反转,这个可以求任一生成树,树上差分即可。

代码

代码难度不高。

code
ci N = 1e6 + 9;

int T;
int n, m;
int l[N], r[N], id[N], lz[N], x[N], swp[N];
vector<int> A[N];

int pa[N], sz[N];
int find(int i) { return pa[i] == i ? i : pa[i] = find(pa[i]); }
void init() {
    rd(T, n, m);
    rep(i, 1, n) pa[i] = i;
    rep(i, 1, m) {
        int u, v;
        rd(u);
        rd(v);
        l[i] = u;
        r[i] = v;
        if (find(u) == find(v)) {
            ++sz[find(u)];
        } else {
            sz[find(v)] += sz[find(u)];
            pa[find(u)] = find(v);
            ++sz[find(v)];
        }
    }
    rep(i, 1, n) {
        if (find(i) == i) {
            if (sz[i] % 2 != 0) {
                puts("Yugoslavia is unstable!");
                exit(0);
            }
        }
    }
}

queue<int> q;

int vis[N];
vector<int> B[N];

void dfs(int u, int la) {
    if (x[u] == 1)
        q.push(u);
    vis[u] = 1;
    for (int i : A[u]) {
        int v = l[i] ^ r[i] ^ u;
        if (v == la || vis[v])
            continue;
        dfs(v, u);
        B[u].eb(i);
    }
}

void dfs1(int u) {
    for (int i : B[u]) {
        int v = l[i] ^ r[i] ^ u;
        dfs1(v);
        swp[i] = lz[v];
        lz[u] ^= lz[v];
    }
}

bool _ed;

int ret[N];

int main() {
    //	cerr << -(&_ed - &_st) / 1048576.0 << "MB" << endl;
    freopen("yugo.in", "r", stdin);
    freopen("yugo.out", "w", stdout);
    init();

    rep(i, 1, m) {
        x[l[i]] ^= 1;
        A[l[i]].eb(i);
        A[r[i]].eb(i);
    }
    rep(i, 1, n) {
        if (find(i) == i) {
            dfs(i, 0);
            while (q.size()) {
                lz[q.front()] ^= 1;
                q.pop();
                lz[q.front()] ^= 1;
                q.pop();
            }
            dfs1(i);
        }
    }

    rep(i, 1, n) x[i] = 0;

    rep(i, 1, m) {
        if (swp[i] == 0) {
            // l[i]
            if (x[l[i]]) {
                printf("3 ");
                --ret[l[i]];
            } else {
                printf("1 ");
                ++ret[l[i]];
            }
            x[l[i]] ^= 1;
        } else {
            // r[i]
            if (x[r[i]]) {
                printf("4 ");
                --ret[r[i]];
            } else {
                printf("2 ");
                ++ret[r[i]];
            }
            x[r[i]] ^= 1;
        }
    }

    //	puts(""); rep(i, 1, n) printf("%d ", ret[i]);
    return 0;
}

T4 数数

标签

喵喵题
Hash 表
高中数学-换元

思路

T4 出这种题?有点奇怪,,,但是妙妙题。

首先看这个式子,发现可以换元。

\(a_i^2 + a_i + a_j^2\equiv a_i\times a_j\pmod p\)

令 \(x = a_i + 1, y = a_j\)

\((x - 1)^2 + x - 1 + y^2\equiv (x - 1)\times y\pmod p\)

\(x^2 - x + y^2 - xy + y\equiv 0\pmod p\)

\(x^2 - xy + y^2 \equiv x - y\pmod p\)

两边同乘 \(x + y\)(啊这)。

得到 \(x^3 + y^3\equiv x^2 - y^2\pmod p\)

即 \(x^3 - x^2 \equiv - y^3 - y^2\pmod p\)

然后拿 \(map\) 什么的维护一下即可。

我就知道,,,

代码

code
ci N = 5e5 + 9;

int n, p;
ll ans;
ll x[N], y[N];
int a[N], b[N];

map<int, int> H;

int inmod(int x) {
	x %= p;
	return x < 0 ? x + p : x;
}

int main() {
	// freopen("count.in", "r", stdin);
	// freopen("count.out", "w", stdout);
	rd(n, p);
	rep(i, 1, n) rd(y[i]), y[i] %= p;
	rep(i, 1, n) {
		x[i] = (y[i] + 1) % p;
		a[i] = inmod(x[i] * x[i] % p * x[i] % p - x[i] * x[i] % p);
		b[i] = inmod(- y[i] * y[i] % p * y[i] % p - y[i] * y[i] % p);
		if(a[i] == b[i]) -- ans;
		++ H[b[i]];
	}
	rep(i, 1, n) {
		if(H.find(a[i]) != H.end()) {
			ans += H[a[i]];
		}
	}
	printf("%lld\n", ans);
	return 0;
}

标签:11,NOIP,16,int,ll,dfs,abs,tot,find
From: https://www.cnblogs.com/SkyMaths/p/17835984.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题
    二、用go语言,假设将一个长度为r的字符串散列到m个槽中,并将其视为一个以128为基数的数,要求应用除法散列法。我们可以很容易地把数m表示为一个32位的机器字,但对长度为r的字符串,由于它被当做以128为基数的数来处理,就要占用若干个机器字。假设应用除法散列法来计算一个字符串......
  • 【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合......
  • 阿里云11月12日官方故障报告来了
    影响范围OSS、OTS、SLS、MNS等产品的部分服务受到影响,大部分产品如ECS、RDS、网络等运行不受影响。云产品控制台、管控API等功能受到影响。时间2023年11月12日17:39~19.20,故障时间为1小时41分。问题概况2023年11月12日17:39起,阿里云云产品控制台访问及管控A......
  • 1116打卡
    1.柱状图中最大的矩形(84)给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。classSolution{publicintlargestRectangleArea(int[]heights){intlen=heights.length;if......
  • 点阵LED数码管显示驱动IC VK16K33 A/B/C/BA/AA 驱动电流大 质量稳定 适用于计量插座,数
    概述VK16K33是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED显示面板。最大支持13×3的按键。内置上电复位电路,整体闪烁频......
  • 装机不再无聊了:Win11首次开机添加“冲浪”小游戏
    为了让大家装机过程不再无聊,微软居然在Win11的开机中加入了一个小游戏。据TheVerge报道,微软SurfaceLaptopStudio2首次开机配置时,如果有需要用户等待的流程,就弹出一个游戏窗口,点击就能直接玩小游戏。这个小游戏很多人并不陌生,早在2020年,微软便向基于Chromium内核的Edge浏览器......
  • 14代i5-14600K现身:多核性能提升多达11%
    14代酷睿桌面端还未发售,就陆续在跑分平台上露出。平台规格为Z790主板、32GBDDR5-5200内存,酷睿i5-14600K的单核成绩为2819,多核成绩为16666,对比酷睿i5-13600K,提升幅度分别是5.7%、11.2%。从页面来看,酷睿i5-14600K的基础频率在3.5GHz,最大睿频尚未得知,预测可能高达5.7GHz-5.9GHz。该......
  • 【2023-11-06】家庭团聚
    20:00我们也不能忽视一个事实,对爱的需要既包括给予爱,也包括接受爱。                                                 ——马斯洛周五下班前,小姨子带着小外甥过来广州......
  • 【2023-11-07】超级奶爸
    20:00 我决定做一个幸福的人,因为幸福有益健康。                                                 ——伏尔泰今天中午,奶奶带着大宝回老家了。因为老家有一位很友好的......
  • 11.16每日总结
       ......