『模拟赛』多校A层冲刺NOIP2024模拟赛16
Rank
依托,给我烂完了(
A. 四舍五入
唐题,赛时被硬控 3h。
发现枚举
正难则反,我们换个角度考虑枚举
ps:发现用逗号会比用分号慢 100ms 左右,望周知。
点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch = getchar(); lx x = 0, f = 1;
for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
return x * f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define pii pair<int, int>
#define P_B(x) push_back(x)
#define M_P(x, y) make_pair(x, y)
const int Ratio = 0;
const int N = 2e6 + 5;
const int mod = 1e9 + 7;
int n, tot;
int a[N << 1];
namespace Wisadel
{
short main()
{
freopen("count.in", "r", stdin), freopen("count.out", "w", stdout);
n = qr;
fo(i, 1, n) for(int l = 0; l <= n; l += i)
{
a[l]++;
a[l + i / 2 + (i & 1)]--;
}
int now = 1, res = a[0];
fo(i, 1, n)
{
res += a[i];
printf("%d ", res);
}
return Ratio;
}
}
signed main(){return Wisadel::main();}
B. 填算符
人类智慧思维题。
发现这
发现我们做了巨大多次无用计算,考虑用 st 表优化。依旧是倒序考虑,考虑当前位
感性理解下,就是我们现在需要满足一些条件,其中一些条件已经确定可以满足,那么前面只需满足其他的条件即可。
理解了这道题就做完了,复杂度主要是 st 表预处理的
点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch = getchar(); lx x = 0, f = 1;
for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
return x * f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define pii pair<int, int>
#define P_B(x) push_back(x)
#define M_P(x, y) make_pair(x, y)
const int Ratio = 0;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n, k;
int lg[N];
ll a[N], sta[30][N], sto[30][N];
bool yz[N];
stack<int> ans;
namespace Wisadel
{
inline ll Wgta(int l, int r)
{
if(l > r) return 0;
int d = lg[r - l + 1];
return sta[d][l] & sta[d][r - (1 << d) + 1];
}
inline ll Wgto(int l, int r)
{
if(l > r) return 0;
int d = lg[r - l + 1];
return sto[d][l] | sto[d][r - (1 << d) + 1];
}
inline ll W(int l, int mi, int r)
{
if(mi + 2 > r) return 0;
return Wgta(1, mi + 1) | Wgto(mi + 2, r);
}
short main()
{
freopen("bitop.in", "r", stdin), freopen("bitop.out", "w", stdout);
n = qr, k = qr;
fo(i, 1, n) sta[0][i] = sto[0][i] = a[i] = qr;
fo(i, 2, n) lg[i] = lg[i >> 1] + 1;
fo(i, 1, lg[n]) fo(j, 1, n - (1 << i) + 1)
sta[i][j] = sta[i - 1][j] & sta[i - 1][j + (1 << (i - 1))],
sto[i][j] = sto[i - 1][j] | sto[i - 1][j + (1 << (i - 1))];
ll tot = W(1, k, n);
int j = k;
fu(i, n - 1, 1)
{
if(i <= j || !j) break;
if(((W(1, j - 1, i) & a[i + 1]) & tot) == tot)
ans.push(i), j--;
else tot ^= (a[i + 1] & tot);
}
while(j) ans.push(j--);
while(ans.size()) printf("%d ", ans.top()), ans.pop();
puts("");
return Ratio;
}
}
signed main(){return Wisadel::main();}
C. 道路修建
比较困难的数据结构题。硬暴力有 10pts。
D. 逆序图
神秘题,暴力都不会打。
末
好烂的一场,开场切不出 T1 会无形带来巨大的压力,然后整场思维感觉都被冻住了,T1 T2 感觉都不算很难,但都只打了最低一档暴力分。
下午体育课,挥洒汗水后思维确实活跃了不少,鉴定为早上没跑操 + 没早读导致的(?)
出题人说上 100 没有 CSP-S 难(
完结撒花~
想什么呢