首页 > 其他分享 >Public NOIP Round #3(Div. 1) 题解

Public NOIP Round #3(Div. 1) 题解

时间:2022-11-23 18:56:59浏览次数:46  
标签:cnt int 题解 sum d% lt Div Public mod

T2:

先判 \(1,n\) 有连边的情况,也就是说明最短路一定是 \(1\) 直接走到 \(n\)。特判掉 \(k=1,n=2\) 的情况,这是无解的。那么如果 \(k\ge2\) 就令 \(1,n\) 都为 \(U\),其余随便分配,否则令 \(1,n\) 都为 \(P\),其余随便分配。

否则不妨假设给 \(1\) 分配 \(U\),给 \(n\) 分配 \(P\),那么一定是有解的。

因为一定可以把 \(1\) 以及它所连的点都变为 \(U\),或者把 \(n\) 以及它所连的点都变成 \(P\)。

非常诈骗。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 100005, M = 400005;
int n, m, k;
int head[N], ver[M], nxt[M], cnt;
bool vis[N];
queue <int> q;
int ans[N];

void add(int u, int v) {
	ver[++cnt] = v, nxt[cnt] = head[u], head[u] = cnt;
}


int main() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; ++i) scanf("%*d");
	for (int i = 1, u, v; i <= m; ++i) {
		scanf("%d%d", &u, &v);
		if ((u == 1 && v == n) || (u == n && v == 1)) {
			if (k == 1 && n == 2) return printf("impossible"), 0;
			if (k >= 2) {
				putchar('U');
				for (int i = 1; i <= k - 2; ++i) putchar('U');
				for (int i = 1; i <= n - k; ++i) putchar('P');
				putchar('U');
			}
			else {
				putchar('P');
				for (int i = 1; i <= n - k - 2; ++i) putchar('P');
				for (int i = 1; i <= k; ++i) putchar('U');
				putchar('P');
			}
			return 0;
		}
		add(u, v), add(v, u);
	}
	q.push(1);
	while (!q.empty()) {
		int u = q.front(); q.pop();
		if (vis[u]) continue;
                if (!k) break;
		vis[u] = 1, --k, ans[u] = 1;
		for (int i = head[u]; i; i = nxt[i]) {
			int v = ver[i];
			q.push(v);
		}
	}
	for (int i = 1; i <= n; ++i) printf("%c", ans[i] ? 'U' : 'P');
	return 0;
}

T3:

考虑 DP,设 \(f(i)\) 表示以 \(i\) 结尾的有多少种合法的序列,令 \(sum\) 表示 \(f\) 的前缀和。

那么先令 \(f(i)\gets 1+sum(i-1)\),表示序列中单独一个 \(i\),以及枚举上一个数然后接在后面的方案数。

但是这里面有不合法的,需要减去,于是枚举上一个数 \(j\),满足 \(j\lt i\) 且 \(i\oplus j\lt j\),然后 \(f(i)\gets f(i)-f(i\oplus j)\)。

暴力做是 \(\mathcal O(n^2)\) 的,但是看着就很能前缀和优化。

发现因为要 \(i\oplus j\lt j\),所以 \(i,j\) 最高位的 \(1\) 一定在相同位置。然后还要满足 \(j\lt i\),直接枚举 \(j\) 最高是在哪一位和 \(i\) 不同,然后低位就可以随便填了,不难发现分成了 \(\mathcal O(\log n)\) 段,前缀和优化即可。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1000005;
int n, mod;
int f[N], sum[N];

void sub(int &a, int b) {
	a -= b;
	if (a < 0) a += mod;
}

int main() {
	scanf("%d%d", &n, &mod);
	f[1] = sum[1] = 1;
	for (int i = 2; i <= n; ++i) {
		f[i] = sum[i - 1] + 1;
		int j = 20; while ((i >> j & 1) == 0) --j;
		for (int k = j - 1; ~k; --k) {
			if (i >> k & 1) sub(f[i], ((sum[(1 << (k + 1)) - 1] - sum[(1 << k) - 1]) + mod) % mod);
		}
		sum[i] = (sum[i - 1] + f[i]) % mod;
	}
	printf("%d", sum[n]);
	return 0;
}

标签:cnt,int,题解,sum,d%,lt,Div,Public,mod
From: https://www.cnblogs.com/Kobe303/p/16919423.html

相关文章

  • Codeforces Round #835 (Div. 4) A-G完全题解
    比赛链接A、点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intT;cin>>T;while(T--){vector<int>G;for(inti=1;......
  • 【MSSQL】SQL SERVER导入中文乱码问题解决
    公司最近承接了一个项目,甲方现使用旧版SiteServer框架(以下简称“SiteCMS”)作为门户网站,使用的数据源是SQLServer。现在需要对SiteCMS进行升级,在升级时数据库和数据库结构也......
  • Codeforces Round #831 (Div. 1 + Div. 2)
    C核心思路:这个题目其实是一个规律题,它有一个很重要的前提,那就是在分配方案最优的情况下,要不然我们直接选几个差值最大的就ok,那他这句话,其实我们结合几个样例就知道,有一个......
  • 题解 LGP7888【「MCOI-06」Distinct Subsequences】
    problem给定一个由小写字符构成的字符串\(S\)。令一个字符串的价值为该串的本质不同非空子序列个数,其中子序列可以为整体。求\(S\)所有子序列的价值和。答案对\(10^......
  • Codeforces Round #790 (Div.4) A-H2题解
    原题链接:https://codeforces.com/contest/1676A.Lucky?题意:给定长度为6由数字组成的字符串问前三个数字的和是否等后三个数字的和。题解:直接相加比较即可。#include<......
  • 题解 LGP2607【[ZJOI2008] 骑士】
    problem基环树森林带权最大独立集。\(n\leq10^6\)。solution0这里先解释一下基环树森林,它就是一个\(n\)个点\(n\)条边的森林,同时是一个荒漠。我们拿出其中一棵连......
  • Codeforces Round #835 (Div.4) A-G题解
    原题链接:https://codeforces.com/contest/1744A.MediumNumber题意:给定三个数,求中间那个数(倒数第二小or倒数第二大)。题解:直接用数组存,sort一下输出中间的数即可。#in......
  • Educational Codeforces Round 36 (Rated for Div. 2) E Physical Education Lessons
    PhysicalEducationLessons珂朵莉树模板#include<iostream>#include<cstdio>#include<set>usingnamespacestd;#defineItset<ran>::iteratorstructran{......
  • Codeforces Round #449 (Div. 1) C Willem, Chtholly and Seniorious
    Willem,ChthollyandSeniorious珂朵莉树慕名而来操作\(3\)直接排序是我没想到的,因为随机数据所以才能过吧\(split\)操作中忘了开\(longlong\),\(wa3\)#include<......
  • 题解 LGP7489【「Stoi2031」手写的从前】
    problem令\(f_0(S)=\dfrac{\sigma(S)}{\pi(S)}\),\(f_k(S)=\sum\limits_{T\subseteqS}f_{k-1}(T)\)。其中\(\sigma(S)=\sum\limits_{x\inS}x\)为\(S\)中所有元素......