写在前面的反思

该拿的部分分还是得拿完啊,因为懒+动作慢没有写最后一道题的菊花图和链的情况,其实这两个点并不难。。

虽然只有\(10pts\),但是已经足够往上爬一截了啊,额外的\(10pts\)在今天大众分\(210pts\)的背景下显得好重要

另外\(T2\)下来发现最后判断的地方假了,所幸好像它能跑得动的数据范围内都没出问题,但要卡还是很好卡,只是这次运气好没被卡而已,下次写的时候还是要注意,正式比赛不一定就不卡了

T1

\(sb\)题

对于\(b==1\),判断所有总数的\(gcd\)能不能整除\(a\)

对于\(b == 2\),判断总数中最小的一个开方是不是严格大于\(a\)

\(sqrt()\)的返回值是浮点数救我一命,差点想乘起来了,发现会爆\(long\ long\)

T2

思路

桶套桶

记录标本串每个字母出现的次数(第一层),设每个字母出现的次数为\(cnt_i\),那么第二层以\(cnt_i\)为下标,统计每个字母出现次数的次数,记为\(cnt1_i\)

举个例子

原标本串

\(aabbbcccd\)

第一层桶,下标对应字母:\(2\ 3\ 3\ 1\)

第二层桶,下标对应第一层桶中的值:\(1\ 1\ 2\)

考虑记录一个\(tot\)总和,当我们当前枚举到的子串标本串的第二层桶的各项差的绝对值之和为\(0\)时,这两者第二层桶中的每个值一一对应,即可以通过变换得到

因为每次挪动区间类似滑动窗口,所以我们只需要处理最开始的区间,之后的区间减去左边挪掉的端点,加入右端新进入的端点即可继续统计答案

代码:

#include<bits/stdc++.h>
#define N (2000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int T, n, Q, cnt[30], cnt1[30], g[N], f[N], q[N][30], l, r, ans, tmp, len, tot;
bool vis[N];
char ch; int s[N];
void add(int x, int sig) {
/*
因为挪动不关标本串的事,所以一切处理都在cnt1和f数组上,g只拿来比较
*/
if (f[cnt1[x]] > g[cnt1[x]]) --tot; else ++tot; //因为要减去字母x原来出现次数的影响,所以同样影响到tot,把tot被影响的部分减掉
--f[cnt1[x]]; //外层桶减去字母x原来出现次数的影响
cnt1[x] += sig; //+1或-1,看是删除还是添加,更新内层桶
if (f[cnt1[x]] >= g[cnt1[x]]) ++tot; else --tot; //更新外层桶,和上面减的地方类似
++f[cnt1[x]]; //外层桶加上字母x新出现次数的影响
}
int main() {
T = read();
while (T--) {
n = read(), Q = read();
tmp = 0;
for (; !isalpha(ch); ch = getchar());
for (; isalpha(ch); ch = getchar()) s[++tmp] = ch - 'a' + 1;
for (register int i = 1; i <= n; ++i) { //整个串,每个字母出现次数的前缀和统计
for (register int j = 1; j <= 26; ++j) q[i][j] = q[i - 1][j]; //把前一个的答案继承过来,每个字母都要继承
++q[i][s[i]]; //把这个字母的答案统计进去
} while (Q--) {
/*
cnt: 标本串的内层桶 cnt2:枚举区间的内层桶
g:标本串的外层桶 f:枚举区间的外层桶
*/
for (register int i = 1; i <= 26; ++i) cnt[i] = cnt1[i] = 0; //内层桶初始化
l = read(), r = read();
len = r - l + 1;
//当前在处理区间[1, len]这个子串(当前枚举的区间),即对于每个询问枚举的第一个区间
for (register int i = 1; i <= 26; ++i) {
cnt[i] = q[r][i] - q[l - 1][i]; //处理标本串的每个字母的出现次数,前缀和减一下
cnt1[i] = q[len][i]; //处理当前子串的每个字母的出现次数
++g[cnt[i]]; //对标本串字母出现次数的出现次数(外层桶)进行统计
++f[cnt1[i]]; //对当前子串...............进行统计(中间同上)
}
tot = 0; //总和,初始化为0
for (register int i = 1; i <= 26; ++i)
if (!vis[cnt[i]]) vis[cnt[i]] = true, tot += g[cnt[i]];
/*
这里先把所有标本串的外层桶的值累加到tot上是为了防止包含的情况,如下例子
g(标本串): 1 1 2 3
f(当前区间) : 1 1 2
这实际上是一个不合法情况,不能统计进答案,但如果我们直接枚举在子串中出现的每个字母的出现次数就会出现这样的问题,所以先在前面加好
其实和处理完之后把剩下没有被枚举到的在标本串的内层桶中出现的元素累加上tot是一个效果,但这样需要多维护一个vis数组
*/
for (register int i = 1; i <= 26; ++i) vis[cnt[i]] = false;
for (register int i = 1; i <= 26; ++i)
if (!vis[cnt1[i]]) {
vis[cnt1[i]] = true;
tot -= g[cnt1[i]]; //如果遇到在标本串和子串中同时出现的元素,先把这个减掉,防止影响后面统计答案
if (f[cnt1[i]] > g[cnt1[i]]) tot += (f[cnt1[i]] - g[cnt1[i]]);
else tot += (g[cnt1[i]] - f[cnt1[i]]);
//上面两行就是取绝对值
}
for (register int i = 1; i <= 26; ++i) vis[cnt1[i]] = false;
ans = 0;
if (!tot) ++ans; //如果总和是0,增量答案
//处理完第一个区间,开始向后挪动,下面i枚举的是右端点
for (register int i = len + 1; i <= n; ++i) {
add(s[i], 1); //加入新右端点
add(s[i - len], -1); //删除原左端点
if (!tot) ++ans; //统计答案
} printf("%d\n", ans);
for (register int i = 1; i <= 26; ++i) --g[cnt[i]], --f[cnt1[i]]; //初始化,相当于前面统计g和f的过程反过来
}
}
return 0;
}

T3

待补档,博主正在写

2019/11/1 CSP模拟的更多相关文章

  1. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  2. 2019/11/8 CSP模拟

    T1 药品实验 内网#4803 由概率定义,有\[a + b + c = 0\] 变形得到\[1 - b = a + c\] 根据题意有\[p_i = a p _{i - 1} + b p_i + c ...

  3. 2019/10/17 CSP模拟 总结

    T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ...

  4. 2019.11.9 csp-s 考前模拟

    2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...

  5. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  6. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  7. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  8. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  9. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

随机推荐

  1. Dubbo管理端工具

    要得到dubbo的管理端工具其实很简单,只需要下面几步: 1.下载源码:我下载的是dubbo-dubbo-2.5.7.zip . 2.使用maven命令编译源码,得到war包: 将下载的dubbo-d ...

  2. vue 学习一 组件生命周期

    先上一张vue组件生命周期的流程图 以上就是一个组件完整的生命周期,而在组件处于每个阶段时又会提供一些周期钩子函数以便我们进行一些逻辑操作,而总体来讲 vue的组件共有8个生命周期钩子 beforeC ...

  3. Ubuntu's Software

    (1)indicator-sysmonitor & acpi (2)nvidia-prime (3)sogou (4)wps (5)ubuntu-tweak

  4. bzoj_auto_submiter(辣鸡Py毁我青春系列)

    听说你们的bzoj小号都很厉害? 不如试试bzoj金坷垃——bzoj_auto_submiter! 把所有的代码拖进解压后的文件夹,然后双击run.cmd. 看到有chrome浏览器窗口弹出来不要慌, ...

  5. kafka集群安装和使用

    kafka(1)kafka是一个分布式的消息缓存系统(2)kafka集群中的服务器都叫做broker(3)kafka有两类客户端,一个叫做producer(消息生产者),一类叫做consumer(消息 ...

  6. [DataContract]引用

    项目->右键->添加引用->找到System.Runtime.Serialization 添加之

  7. spring其他配置 (3)

    目录 一.自动装配 Autowired 二.bean的作用于singleton,prototype 三.引入外部资源properties文件 四.SpEL表达式 (可以为属性进行动态的赋值) 五.通过 ...

  8. Python 爬虫-抓取小说《盗墓笔记-怒海潜沙》

    最近想看盗墓笔记,看了一下网页代码,竟然不是js防爬虫,那就用简单的代码爬下了一节: """ 爬取盗墓笔记小说-七星鲁王宫 """ from ...

  9. Delph i2010

    我在习惯Delphi2010 转载   一直留着一个txt文件,不晓得是干嘛的(忘记了),偶然打开一看.乖乖~ 2010 还可以这样玩. 1.循环有了新用法 procedure TForm1.Butt ...

  10. WebStorm+Node.js开发环境的配置

    1 下载地址:  webstorm:http://www.jetbrains.com/webstorm node.js:https://nodejs.org/download/ 2 安装node.js ...