T1 [JZOJ3403] 数列变换

题目描述

  小X看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他。考虑数列A=[A1,A2,...,An],定义变换f(A,k)=[A2,A3,...,Ak,A1,Ak+2,Ak+3,...,A2k,Ak+1,...],也就是把A分段,每段k个(最后如果不足k个,就全部分到新的一段里),然后将每段的第一个移动到该段的最后一个。

  现在,小X想知道f(f(f(f([1,2,3,...,n],2),3),...),n)的结果。

数据范围

  对于 $60 \%$ 的数据,$1 \leq n \leq 10^3$

  对于 $100 \%$ 的数据,$1 \leq n \leq 10^6$

分析

  如果我们在原数组中暴力移动数字,那么时间复杂度为 $O(n^2)$

  但手推一下会发现,每次移动时大部分项的位置是不变的,只有每段第一个数的位置发生改变

  所以每次只需要将每段的第一项向后移动,这时数组会整体向后移动一项,因此要开一个两倍长的数组

  时间复杂度为 $O(n \sum\limits_{i=2}^{n} \frac{n}{i}) \doteq O(n \; ln \; n)$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000005 int n;
int a[ * N]; int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++) a[i + ] = i;
for (int i = ; i <= n; i++) {
int j = i + n / i * i;
a[i + n] = a[j];
for (j -= i; j >= i; j -= i) a[j + i] = a[j];
}
for (int i = n + ; i <= * n; i++)
printf("%d ", a[i]); return ;
}

T2 [JZOJ3404] 卡牌游戏

题目描述

  小X为了展示自己高超的游戏技巧,在某一天兴致勃勃地找小Y玩起了一种卡牌游戏。每张卡牌有类型(攻击或防御)和力量值两个信息。

  小Y有n张卡牌,小X有m张卡牌。已知小X的卡牌全是攻击型的。

  游戏的每一轮都由小X进行操作,首先从自己手上选择一张没有使用过的卡牌X。如果小Y手上没有卡牌,受到的伤害为X的力量值,否则小X要从小Y的手上选择一张卡牌Y。若Y是攻击型(当X的力量值不小于Y 的力量值时才可选择),此轮结束后Y消失,小Y受到的伤害为X的力量值与Y的力量值的差;若Y是防御型(当X的力量值大于Y的力量值时才可选择),此轮结束后Y消失,小Y不受到伤害。

  小X可以随时结束自己的操作(卡牌不一定要用完)。希望聪明的你帮助他进行操作,使得小Y受到的总伤害最大。

数据范围

  对于 $30 \%$ 的数据,$1 \leq n,m \leq 6$

  对于 $60 \%$ 的数据,$1 \leq n,m \leq 10^3$

  对于 $100 \%$ 的数据,$1 \leq n,m \leq 10^5$,力量值均为不超过 $10^6$ 的非负整数

分析

  第一眼看到题目,这不是个二分图最大权匹配??!

  结果看完数据范围,发现这个显然不是正解,而且B组题显然也不会考这个算法

  看了许久以后,我还是没有想到什么复杂度更优秀的做法,于是决定试一试二分图最大权匹配

  然而过了一个多小时,我发现我在考场上根本码不出这种东西

  然后我把代码全删了,重新开始思考,感觉这种决策性的东西似乎可以贪心

  最后写了个玄学贪心,结果得了 $60 \, pts$

  后来发现那 $40 \, pts$ 是因为没有开 $long \, long$,很惨...

  不过那个贪心显然是错误的,很快就被大佬 $hack$ 了,只是测试数据比较水...

  实际上在这个游戏中,有两种方式可能达到最优

  一种是不打对方的防御牌,只用自己最大的攻击牌打对方最小的攻击牌

  一种是打完对方的所有牌,然后就可以用剩下的牌疯狂打对方的脸

  第一种方式很容易实现,第二种因为消耗对方攻击牌的力量值之和是固定的,而且可以用完自己所有的牌,所以应该尽量选用力量值接近(即力量值最小)的牌去打对方的牌,但是这种方式的前提是能够消耗完对方所有的牌,不然打对方的防御牌是无意义的,不可能最优

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100005 int n, m, cnt, cnt1, cnt2;
int x1[N], x2[N], y1[N], y2[N], used[N];
char s[];
ll ans; ll Max(ll a, ll b) {
if (a > b) return a;
return b;
} bool ATK_DEF() {
int now = ;
for (int i = ; i <= cnt2; i++) {
while (now <= m && x1[now] <= y2[i]) now++;
if (now > m) return false;
used[now] = ; now++;
}
return true;
} ll ATK_ATK() {
ll sum = ;
int xl = , xr = m, yl = , yr = cnt1;
while (xl <= xr && yl <= yr && x1[xr] >= y1[yl])
sum += x1[xr] - y1[yl], xr--, yl++;
return sum;
} ll ATK_FACE() {
memset(used, , sizeof used);
int now = ; ll sum = ;
for (int i = ; i <= cnt1; i++) {
while (now <= cnt && x2[now] < y1[i]) now++;
if (now > cnt) return sum;
sum += x2[now] - y1[i];
used[now] = ; now++;
}
for (int i = ; i <= cnt; i++)
if (!used[i]) sum += x2[i];
return sum;
} int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
scanf("%s", s);
if (s[] == 'A') scanf("%d", y1 + (++cnt1));
else scanf("%d", y2 + (++cnt2));
}
for (int i = ; i <= m; i++)
scanf("%d", x1 + i);
sort(x1 + , x1 + m + );
sort(y1 + , y1 + cnt1 + );
sort(y2 + , y2 + cnt2 + );
ans = ATK_ATK();
if (ATK_DEF()) {
for (int i = ; i <= m; i++)
if (!used[i]) x2[++cnt] = x1[i];
ans = Max(ans, ATK_FACE());
}
printf("%lld\n", ans); return ;
}

T3 [JZOJ3405] 舞台表演

题目描述

  小X终于找到了自己的舞台,希望进行一次尽兴的表演。

  不妨认为舞台是一个n行m列的矩阵,矩阵中的某些方格上堆放了一些装饰物,其他的则是空地。小X可以在空地上滑动,但不能撞上装饰物或滑出舞台,否则表演就失败了。

  小Y为了让小X表演得尽量顺畅,提前为小X写好了每一段时间的移动方向。每个时刻,听话的小X都会依据小Y写好的所在时间段的方向(东、西、南、北)向相邻的方格滑动一格。由于小Y之前没有探查过舞台的情况,如果小X直接按照小Y写好的来移动,很容易表演失败。

  不过,小Y是个天使,拥有让小X停在原地的魔法,也就是某一时刻,小X以为自己移动了实际上没有移动。为了让小X表演得尽量完美,小Y想使小X在舞台上滑行的路程尽量长(当然不能中途表演失败)。可惜小Y的智商不足以完成这么复杂的计算,希望你来帮助她决定哪些时刻该使用魔法。当然,她关心的首先是最长的路程是多少。

数据范围

  保证输入的时间段是连续的,即 $s_1=1$,$s_i=e_{i-1}+1$,$e_k=t$(第 $k$ 段时间为 $[s_k,e_k]$)

  对于 $30 \%$ 的数据,$1 \leq t \leq 20$

  对于 $60 \%$ 的数据,$1 \leq t \leq 200$

  对于 $100 \%$ 的数据,$1 \leq n,m,k \leq 200$,$1 \leq t \leq 10^5$

分析

  开始的时候看了下题,看这个数据范围应该是个DP

  但由于上一题的某种不可控因素,最后所剩无几的时间里我三分钟打了个暴力就放弃推DP了

  不过这题确实是个DP,并且其中 $60 \, pts$ 是非常可做的

  设 $f[k][i][j]$ 表示过了 $k$ 段时间在位置 $(i,j)$ 上时经过的最长路程

  因为已知这一段时间中的移动方向,所以通过枚举第 $k$ 段时间中的所有可能的位置,就很容易得到状态转移方程

  这个做法的时间复杂度为 $O(nmt)$(实际上及时排除一些不合法状态,在这样水的数据下是可以 $AC$ 的)

  这时候我们就需要用单调队列优化了

  因为在一段时间中移动方向是一定的,所以在可以这一行/列上维护一个前缀状态中最优决策的单调队列,如果遇到了装饰物,就需要把单调队列清空,这样枚举前缀位置的操作就优化为了 $O(1)$,总的时间复杂度也就是 $O(nmk)$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 205 int n, m, k, ex, ey, t1, t2, d, ans;
int g[N][N], f[N][N][N], q[N], p[N];
int nxt[][] = {, , -, , , , , -, , };
char s[N]; void dp(int t, int x, int y, int len, int dir) {
int l = , r = , s = ;
while (x >= && x <= n && y >= && y <= m) {
if (g[x][y]) l = , r = ;
else {
while (l <= r && f[t - ][x][y] - s >= q[r]) r--;
q[++r] = f[t - ][x][y] - s; p[r] = s;
while (l <= r && s - p[l] > len) l++;
if (l <= r) f[t][x][y] = q[l] + s;
ans = max(ans, f[t][x][y]);
}
x += nxt[dir][]; y += nxt[dir][]; s++;
}
} int main() {
scanf("%d%d%d%d%d", &n, &m, &ex, &ey, &k);
for (int i = ; i <= n; i++) {
scanf("%s", s + );
for (int j = ; j <= m; j++)
if (s[j] == 'x') g[i][j] = ;
}
memset(f, 0x80, sizeof f);
f[][ex][ey] = ;
for (int i = ; i <= k; i++) {
scanf("%d%d%d", &t1, &t2, &d);
if (d == ) for (int j = ; j <= m; j++) dp(i, n, j, t2 - t1 + , d);
if (d == ) for (int j = ; j <= m; j++) dp(i, , j, t2 - t1 + , d);
if (d == ) for (int j = ; j <= n; j++) dp(i, j, m, t2 - t1 + , d);
if (d == ) for (int j = ; j <= n; j++) dp(i, j, , t2 - t1 + , d);
}
printf("%d\n", ans); return ;
}

2019-08-04 纪中NOIP模拟B组的更多相关文章

  1. 2019-08-21 纪中NOIP模拟A组

    T1 [JZOJ6315] 数字 题目描述

  2. 2019-08-18 纪中NOIP模拟A组

    T1 [JZOJ6309] 完全背包 题目描述

  3. 2019-08-15 纪中NOIP模拟B组

    T1 [JZOJ3455] 库特的向量 题目描述 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃 ...

  4. 2019-08-01 纪中NOIP模拟B组

    T1 [JZOJ2642] 游戏 题目描述 Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有一个正整数.当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并 ...

  5. 2019-08-25 纪中NOIP模拟A组

    T1 [JZOJ6314] Balancing Inversions 题目描述 Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏. Bessie 的分数为 A 的前一半的逆序对 ...

  6. 2019-08-23 纪中NOIP模拟A组

    T1 [JZOJ2908] 矩阵乘法 题目描述 给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数. 数据范围 对于 $20\%$ 的数据,$N \leq 100$,$Q ...

  7. 2019-08-20 纪中NOIP模拟B组

    T1 [JZOJ3490] 旅游(travel) 题目描述 ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼.终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历. ...

  8. 2019-08-20 纪中NOIP模拟A组

    T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...

  9. 2019-08-09 纪中NOIP模拟B组

    T1 [JZOJ1035] 粉刷匠 题目描述 windy有N条木板需要被粉刷. 每条木板被分为M个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一 ...

  10. 2019-08-17 纪中NOIP模拟B组

    T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...

随机推荐

  1. 史上最深入浅出的IT术语解读

    假设你是个妹子,你有一位男朋友,与此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以甩了现任男友,另外一位马上就能补上.这是冷备份. 假设你是个妹子,同时和两位男性在交往,两位都是你男朋 ...

  2. Ubuntu在当前用户目录下安装python 包

    对于tar.gz文件: tar -zxvf setuptools-19.6.tar.gz cd setuptools-19.6.tar.gz python3 setup.py build python ...

  3. 安全 - CORS(脚本请求等)

    功能概述 出于安全原因,浏览器限制从脚本内发起的跨域HTTP请求 或 拦截了跨域请求的结果. 例如,XMLHttpRequest和Fetch API遵循同源策略. 这意味着使用这些API的Web应用程 ...

  4. DFS-C - N皇后问题

    C - N皇后问题 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放 ...

  5. Django上传excel表格并将数据写入数据库

    前言: 最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 jira 当前的 Tempo 插件只能统计个人工时.于是就写了个报表工具,将 jira 中导出的个人工时excel表格 导入数据库 ...

  6. tcolorbox 宏包简明教程

    嗯,我消失好几天了.那么,我都在做什么呢?没错,就是写这篇文章了.这篇文章写起来着实有些费神了.于是,如果你觉得这篇文章对你有帮助,不妨扫描文末的二维码,适量赞助一下哦~! tcolorbox 宏包是 ...

  7. C++——浅拷贝

    10.深拷贝与浅拷贝 浅拷贝: 实现对象间数据元素的一一对应赋值:(默认构造函数) 深拷贝: 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制. //浅拷贝 # ...

  8. js集合

    var list = {};//声明 List[0] = 52;//赋值 List[1] = 57;//赋值

  9. 回形数字矩阵(Java)

    将矩阵从里到外分为多层,每一层都是一个口字型数字序列,方向都是顺时针/逆时针,由此我们可以将问题分解为相同的子问题来解决 回形矩阵概述 ☃ 回形矩阵有n行n列 ☃ 数字按顺时针或者逆时针递增 **使用 ...

  10. 关于 RMAN 控制文件自动备份路径中指定的 %F 说明

    默认情况下,RMAN备份的属性配置一共 14 行( show all; )来自博客园AskScuti CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVIC ...