20201104gryz模拟赛解题报告
写在前面
\(Luckyblock\) 良心出题人,
题面好评
T1还是蛮简单的,用一个栈来维护就能过(某天听说 \(Luckyblock\) 出了套题,T1是个考栈的,看来就是这道了
注:栈的清空只需要把 \(top\) 置为 \(0\) 即可,没必要用 \(memset\)
T2一开始打算单调栈+前缀和求惊喜度,但小数模法并不会,因此没写,暴力也不会打,看到正解后考虑到我的解法可能会被卡
T3暴力不知道为啥写挂了
T4输入的时候没读题,输入的 \(x\) 和 \(y\) 多打了一组,所以 \(10\) 也没骗到,后面 \(2h\) 一直在推DP式
T1 大空魔术
简述题意:
给你一串由 \(A\) 和 \(B\) 组成序列, \(AB\) 和 \(BB\) 形式可以发生对毁,问剩下的序列最短多长
\(Solution\):
发现 \(?B\) 是可以对毁的,考虑开一个栈,每读到一个元素,和栈顶元素比较,如果栈顶元素是 \(A\) 或 \(B\) 且读到元素是 \(B\) ,就弹出栈顶元素,否则放入栈中,最后输出栈内元素个数
正确性:发现 \(B\) 与谁都能对毁,因此在前面对毁的越多,对结果越有利
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
=============================Luckyblock AK IOI===========================================
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int MAXN = 2e6+6;
int T, n;
char stc[MAXN];
int top = 0;
string s;
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
scanf("%d", &T);
while(T--){
top = 0;
cin>>s;
int len = s.size();
for(int i = 0; i < len; ++i){
if((stc[top] == 'A' && s[i] == 'B') || (stc[top] == 'B' && s[i] == 'B')){
top--;
}
else{
stc[++top] = s[i];
}
}
printf("%d\n", top);
}
return 0;
}
T2夜桜街道
简述题意:求给定的 \(f(l,r)\) 即为区间 \([l,r]\) 内的顺序对个数。(顺序对定义与逆序对定义相反)
求:
\]
Solution:
考虑如何通过 \(\sum_{i=1}^{n-1} f(1,i)\) 得到 \(\sum_{i=1}^{n} f(1,i)\)。
发现新增的贡献即为较大的数为 \(a_n\) 的顺序对。
先离散化方便统计,然后枚举整个序列,用树状数组进行维护,统计答案是乘上逆元即可
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 1e6+5;
const int mod = 998244353;
int n, d_num, ans, f;
int a[MAXN];
int date[MAXN];
int inv[MAXN];
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
}
namespace Bit{
#define lowbit(i) i & (-i)
int lim, tree[MAXN];
void init(int lim_) { lim = lim_; }
void add(int x){
for(int i = x; i <= lim; i += lowbit(i)){
tree[i]++;
}
}
int get_sum(int x){
int ret = 0;
for(int i = x; i > 0; i -= lowbit(i)){
ret += tree[i];
}
return ret;
}
}
signed main()
{
n = read();
inv[1] = 1;
for(int i = 1; i <= n; ++i){
date[i] = a[i] = read();
if(i > 1) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
sort(date + 1, date + n + 1);
d_num = 1;
for(int i = 2; i <= n; ++i) {
if(date[i] != date[i - 1]) ++d_num;
date[d_num] = date[i];//驱虫
}
for(int i = 1; i <= n; ++i){
a[i] = lower_bound(date + 1, date + d_num + 1, a[i]) - date;
}
Bit::init(d_num);
for(int i = 1; i <= n; ++i){
f = (f + 1 * Bit::get_sum(a[i] - 1)) % mod;
ans = (ans + f * inv[i] % mod) % mod;
Bit::add(a[i]);
}
printf("%lld\n", ans);
return 0;
}
T4 萃香抱西瓜
简述题意:简化不动
\(Solution\):
稍有点细节的状压 DP。
读入时对所有时刻所有位置进行标记,记录是否有大小西瓜。
发现小西瓜个数较小,考虑状压一下获得的小西瓜状态。
设 \(s_{t,x,y}\) 表示 \(t\) 时刻,位置 \((x,y)\) 的小西瓜的存在状态。
设 \(f(t,x,y,S)\) 表示,在时间 \(t\),萃香的位置在 \((x,y)\),获得的小西瓜状态为 \(S\) 时,需要移动的最小步数。
初始化 \(f(1,sx,sy,s1,sx,sy)=0\),所有不可到达状态的 \(f=Inf\)。
转移时枚举每个时刻每个位置,从能到达该位置的上个时刻的位置 \((x′,y′)\) 转移过来,还需要枚举上个位置的小西瓜状态,有:
\(f(t,x,y,S|s_{t,x,y})=min{f(t−1,x′,y′,S)}+1\)
统计答案时枚举最后一个时刻的所有取完所有小西瓜的状态,取最小值即可。
复杂度 \(O(Thw2^m)\),数据范围小可以随便过。
不是很懂,所以直接搬的题解(逃
(Luckyblock变量名好评
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXALL = 0x3f3f3f3f;
const int kMAX = (1 << 10) + 1;
int dx[5] = {0, 0, 0, 1, -1};
int dy[5] = {0, 1, -1, 0, 0};
int h, w, T, sx, sy;
int n, m, sum = 0;
int a[6][6][110];
int f[6][6][110][kMAX];
int read(){
int w = 1, s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
}
int main()
{
// freopen("d.in","r",stdin);
// freopen("d.out","w",stdout);
h = read(), w = read(), T = read(), sx = read(), sy = read();
n = read(), m = read();
for(int i = 1, t1_ = 0, t2_ = 0, a_ = 0; i <= n; ++i){
t1_ = read(), t2_ = read(), a_ = read();
if(a_) sum++;
for(int j = t1_, x, y; j < t2_; ++j){
x = read(), y = read();
if(a_ == 0){ a[x][y][j] = -1; }
else{ a[x][y][j] = (1 << (sum - 1)); }
}
}
if(a[sx][sy][1] == -1) {
printf("-1"); return 0;
}
int all = (1 << m) - 1;
memset(f, 0x3f, sizeof(f));
f[sx][sy][1][a[sx][sy][1]] = 0;//初始化
for(int i = 2; i <= T; ++i){
for(int x = 1; x <= w; ++x){
for(int y = 1; y <= h; ++y){
if(a[x][y][i] == -1) continue;
for(int fx = 0; fx <= 4; ++fx){
int x_ = x + dx[fx], y_ = y + dy[fx];
if(x_ < 1 || x_ > w || y_ < 1 || y_ > h) continue;
if(a[x_][y_][i - 1] == -1) continue;
for(int k = 0; k <= all; ++k){
f[x][y][i][k | a[x][y][i]] = min(f[x][y][i][k | a[x][y][i]], f[x_][y_][i -1][k] + (fx > 0));
}
}
}
}
}
int ans = f[0][0][0][0];
for(int x = 1; x <= w; ++x){
for(int y = 1; y <= h; ++y){
ans = min(ans, f[x][y][T][all]);
}
}
printf("%d\n", ans < MAXALL ? ans : -1);
return 0;
}
20201104gryz模拟赛解题报告的更多相关文章
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 2018.10.26NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 70\) 实际得分:\(40 + 100 + 70\) 妈妈我又挂分了qwq..T1过了大样例就没管,直到临考试结束前\(10min\)才发现大样例是假 ...
- 2018.10.17NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 20201101gryz模拟赛解题报告
写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
- 11.1NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 50\) 实际得分:\(100 + 100 + 50\) 感觉老师找的题有点水呀. 上来看T1,woc?裸的等比数列求和?然而我不会公式呀..感觉要凉 ...
- 20201115gryz模拟赛解题报告
写在前面 T1:期望100pts,实际0pts(7:50 ~ 8:50 T2:期望0pts,实际0pts(10:00 ~ 10:35 T3:期望20pts,实际40pts( 9:10 ~ 10:00, ...
- 20201102gryz模拟赛解题报告
简述我的苦逼做题经历 考的是NOIP2017day1原题, 开始看到小凯的疑惑时感觉特水,因为这题初中老师讲过, 很nice的秒切 T2发现是个大模拟,虽然字符串不太会用,但起码题意很好理解 边打代码 ...
- 20161022 NOIP模拟赛 解题报告
好元素 [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i <= N , m,n ...
随机推荐
- CentOS Linux SVN服务器 配置用户目录访问 权限 Authorization failed
SVN 修改 aurhz 文件设置用户目录访问权限格式: [/code] user=rw user 用户对code目录拥有读和写的权限. 但是访问 svn://192.168.1.59 的时候却提示A ...
- Linux服务器上搭建测试环境(war包+tomcat)
悟空CRM项目环境部署(Java war项目) 在/root目录下创建一个文件夹(名字自取). ls命令查看一下是否创建成功,看到了新建的文件夹说明创建成功. tomcat和war包的准备:可以使用X ...
- 关于if-else代码的优化
if-else分支代码在我们日常开发中基本上是最常用的逻辑,但是,经常在if-else代码过多的情况下,代码会变得特别臃肿,并且代码的可扩展性会变得不好,所以,优化if-else代码逻辑是很有必要的. ...
- Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)
1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...
- Pytest测试框架(五):pytest + allure生成测试报告
Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...
- 对接口报错404 发现url多了一些不可描述的代码%E2%80%8B
接口url出现了空格,复制的url可能出现空格肉眼看不出来,手动输入一遍URL
- Linux命令整理,用户管理,用户组管理,系统管理,目录管理常用命令
知识点梳理 Linux课堂笔记 学习目标 能够知道什么是Linux系统以及它的应用场景 能够独立完成安装VMware虚拟机和网络配置 能够独立完成安装CentOS以及远程终端SecureCRT 能够熟 ...
- LeetCode703 流中第k大的元素
前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...
- dubbo配置启动时检查
启动检查设置 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用会抛出异常,阻止Spring初始化完成,默认check="true":是开启检查. 比如测试的时候,有些服务并不 ...
- LeetCode589. N叉树的前序遍历
题目 法一.递归 1 class Solution { 2 public: 3 vector<int>ans; 4 void dfs(Node* root){ 5 if(root!=NUL ...