一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!!

就是一道小模拟,它怎么说就怎么走就好了!

为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍2000*2000就炸了!!!

我爆哭QAQ再也不用stl的max叻!!(然而一定会被打脸)我的100分QAQAQAQ

#include<bits/stdc++.h>
using namespace std; int k, n;
int vis[][];
char s[]; int main() {
freopen("block.in", "r", stdin);
freopen("block.out", "w", stdout);
int T;
scanf("%d", &T);
while(T --) {
scanf("%d", &k);
scanf("%s", s);
int now = ;
memset(vis, , sizeof(vis));
vis[][] ++;
int lx = , ly = , rx = , ry = ;
int ans = ;
for(int i = ; i < strlen(s); i ++) {
char opt = s[i];
if(opt == 'N') {
if(now) {
if(rx == lx + ) {
vis[lx][ly+k] ++;
if(vis[lx][ly+k] > ans) ans = vis[lx][ly+k];
ly = ry, ry ++;
now = ;
} else {
for(int p = lx; p < rx; p ++) {
vis[p][ry] ++;
if(vis[p][ry] > ans) ans = vis[p][ry];
}
ly ++, ry ++;
}
} else {
for(int p = ly + ; p <= ly + k; p ++) {
vis[lx][p] ++;
if(vis[lx][p] > ans) ans = vis[lx][p];
}
ly ++; ry += k;
now = ;
}
} else if(opt == 'S') {
if(now) {
if(rx == lx + ) {
vis[lx][ly-] ++;
if(vis[lx][ly-] > ans) ans = vis[lx][ly-];
ly --; ry = ly + ;
now = ;
} else {
for(int p = lx; p < rx; p ++) {
vis[p][ly-] ++;
if(vis[p][ly-] > ans) ans = vis[p][ly-];
}
ly --; ry --;
}
} else {
for(int p = ly - ; p >= ly - k; p --) {
vis[lx][p] ++;
if(ans < vis[lx][p]) ans = vis[lx][p];
}
ry = ly; ly = ly - k;
now = ;
}
} else if(opt == 'W') {
if(now) {
if(rx == lx + ) {
for(int p = ly; p < ry; p ++) {
vis[lx-][p] ++;
if(vis[lx-][p] > ans) ans = vis[lx-][p];
}
lx --; rx --;
} else {
vis[lx-][ly] ++;
if(vis[lx-][ly] > ans) ans = vis[lx-][ly];
lx --; rx -= k;
now = ;
}
} else {
for(int p = lx - k; p < lx; p ++) {
vis[p][ly] ++;
if(vis[p][ly] > ans) ans = vis[p][ly];
} lx -= k; rx --;
now = ;
}
} else {
if(now) {
if(rx == lx + ) {
for(int p = ly; p < ry; p ++) {
vis[lx+][p] ++;
if(vis[lx+][p] > ans) ans = vis[lx+][p];
}
lx ++; rx ++;
} else {
vis[lx+k][ly] ++;
if(vis[lx+k][ly] > ans) ans = vis[lx+k][ly];
lx += k; rx ++;
now = ;
}
} else {
for(int p = lx + ; p < rx + k; p ++) {
vis[p][ly] ++;
if(vis[p][ly] > ans) ans = vis[p][ly];
}
lx ++; rx += k;
now = ;
}
}
}
if(rx == lx + ) {
int sum = ry - ly;
for(int i = ; i < sum; i ++)
printf("%d ", lx - );
printf("%d", lx - );
printf("\n");
for(int i = ly; i < ry-; i ++)
printf("%d ", i - );
printf("%d", ry - );
printf("\n");
} else {
int sum = rx - lx;
for(int i = lx; i < rx-; i ++)
printf("%d ", i - );
printf("%d", rx - );
printf("\n");
for(int i = ; i < sum; i ++)
printf("%d ", ly - );
printf("%d", ly - );
printf("\n");
}
printf("%d\n", ans);
}
return ;
}

这道题暴力分拿的太爽了,15分钟敲出来70分成了救命稻草QAQAQ

区间修改考虑线段树。

因为目标的覆盖序列只有一个,就是1~k。其他的序列都不合法,怎么才能在最后快速判断是否合法呢?

想到$hash$,每次覆盖相当于在$hash$序列中加一个数,在线段树上转化成了$*A+B$($A$就是$base$,$B$就是新增的数),于是就可以维护了。

最后查询$Dfs$将每个叶子节点的$hash$值存下来即可。

#include<bits/stdc++.h>
#define base 233
using namespace std; int n, k, t;
unsigned int tag1[], tag2[];
unsigned int TR[], has[]; void build(int nd, int l, int r) {
tag1[nd] = ; tag2[nd] = ;
if(l == r) return ;
int mid = (l + r) >> ;
build(nd << , l, mid);
build(nd << | , mid + , r);
} void push_down(int nd, int l, int r) {
if(tag1[nd] != || tag2[nd] != ) {
TR[nd<<] = TR[nd<<] * tag1[nd] + tag2[nd];
TR[nd<<|] = TR[nd<<|] * tag1[nd] + tag2[nd];
tag1[nd<<] = tag1[nd] * tag1[nd<<];
tag1[nd<<|] = tag1[nd] * tag1[nd<<|];
tag2[nd<<] = tag1[nd] * tag2[nd<<] + tag2[nd];
tag2[nd<<|] = tag1[nd] * tag2[nd<<|] + tag2[nd];
tag1[nd] = ; tag2[nd] = ;
}
} void modify(int nd, int l, int r, int L, int R, int d) {
if(l >= L && r <= R) {
TR[nd] = TR[nd] * base + d;
tag2[nd] = tag2[nd] * base + d;
tag1[nd] = tag1[nd] * base;
return ;
}
push_down(nd, l, r);
int mid = (l + r) >> ;
if(L <= mid) modify(nd << , l, mid, L, R, d);
if(R > mid) modify(nd << | , mid + , r, L, R, d); } void query(int nd, int l, int r) {
if(l == r) {
has[l] = TR[nd];
return ;
}
push_down(nd, l, r);
int mid = (l + r) >> ;
query(nd << , l, mid);
query(nd << | , mid + , r);
} int main() {
freopen("deco.in", "r", stdin);
freopen("deco.out", "w", stdout);
scanf("%d%d%d", &n, &k, &t);
build(, , n);
for(int i = ; i <= t; i ++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
modify(, , n, a, b, c);
}
query(, , n);
int h = ;
for(int i = ; i <= k; i ++)
h = h * base + i;
int ans = ;
for(int i = ; i <= n; i ++)
if(has[i] == h) ans ++;
printf("%d", ans);
return ;
}

【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】的更多相关文章

  1. [CSP-S模拟测试]:God Knows(线段树维护单调栈)

    题目描述 小$w$来到天堂的门口,对着天堂的大门发呆.大门上有一个二分图,左边第$i$个点连到右边第$p_i$个点.(保证$p_i$是一个排列).小$w$每次可以找左边某个对应连线尚未被移除的点$i$ ...

  2. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  3. BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  4. BZOJ 1095 捉迷藏(线段树维护括号序列)

    对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iost ...

  5. BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)

    这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...

  6. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  7. 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】

    题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...

  8. [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)

    题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...

  9. [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)

    题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...

随机推荐

  1. python(32):多进程(2) multiprocessing

    python 多线程:多线程 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要 ...

  2. 42 - 数据库-orm-SQLAlchemy

    目录 1 ORM 2 sqlalchemy 3 基本使用 3.1 创建连接 3.1.1 利用连接池执行sql 3.1.2 利用session来执行sql 3.2 创建基类 3.3 创建实体类 3.3. ...

  3. 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  4. OpenJDK,Oracle's OpenJDK,Oracle JDK的区别与选择

    OpenJDK 单纯的OpenJDK指的是JDK的源码,以GPL协议开源,由企业和社区开发者共同维护和开发. Oracle's OpenJDK Oracle started providing ope ...

  5. Python [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法

    一个搭建在SAE上的Django应用,使用新浪微博提供的Python SDK已经稳定运行一年有余,但最近开始持续出现微博认证失败的状况. 摘录微博python SDK的错误提示如下所示: ERROR: ...

  6. Nginx - 压缩模块

    1. 前言 在 Nginx 中与网页压缩相关的模块有两个:一个是 HttpGzipModule,另一个是 HttpGzipStaticModule.前者用于启用在文件传输过程中使用 gzip 压缩,而 ...

  7. Java线程的阻塞

    线程的阻塞 线程的优先级 线程总是存在优先级,优先级范围在1~10之间,线程默认优先级是5(数值越大优先级越高): JVM线程调度程序是基于优先级的抢先调度机制: 在大多数情况下,当前运行的线程优先级 ...

  8. Java线程:新特征-有返回值的线程《转》

      原始文章   在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.   现在Java终于有可返回值的任务(也可以叫做线程)了. ...

  9. Java HashCode详解

    一.为什么要有Hash算法 Java中的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素是否重复应该依据什 ...

  10. 忘记SVN密码怎么办

    1:下载TSvnPwd.exe 2:使用wireshark抓包.例如: PROPFIND /svn/dev2/!svn/vcc/default HTTP/1.1Host: 192.168.156.1: ...