【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到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+线段树维护覆盖序列】的更多相关文章
- [CSP-S模拟测试]:God Knows(线段树维护单调栈)
题目描述 小$w$来到天堂的门口,对着天堂的大门发呆.大门上有一个二分图,左边第$i$个点连到右边第$p_i$个点.(保证$p_i$是一个排列).小$w$每次可以找左边某个对应连线尚未被移除的点$i$ ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...
- BZOJ1095: [ZJOI2007]Hide 捉迷藏【线段树维护括号序列】【思维好题】
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- BZOJ 1095 捉迷藏(线段树维护括号序列)
对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iost ...
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
- 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】
题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...
- [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)
题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...
- [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)
题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...
随机推荐
- 系统架构之负载均衡【F5\nginx\LVS\DNS轮询\】
在做系统架构规划的时候,负载均衡,HA(高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点,当活动节点出现故障的时候,由备用节点接管)都是经常需要考虑的 ...
- JavaScript新手学习笔记(一)
1.JavaScript 对大小写敏感. JavaScript 对大小写是敏感的. 当编写 JavaScript 语句时,请留意是否关闭大小写切换键. 函数 getElementById 与 getE ...
- Django-模板继承、包含和静态文件配置
一.模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板 ...
- 转载:Github项目解析(七)-->防止按钮重复点击
不错的东西,记录下... http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_23547831/article/deta ...
- handlermethodargumentresolver
http://www.cnblogs.com/fangjian0423/p/springMVC-request-param-analysis.html http://www.cnblogs.com/f ...
- ASP.NET Web Api OwinSelfHost Restful 使用
一.前言 总结一下什么是RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现&q ...
- 利用vw+rem实现移动web适配布局
基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...
- 用js面向对象思想封装插件
js是基于原型的面向对象语言,如果你学过java,c#等正统面向对象语言,你会难以理解js的面向对象,他和普通的面向对象不太一样,今天,我们通过封装一个toast插件,来看看js面向对象是如何运行的. ...
- 虚拟机 CentOS7 64
下载地址:https://www.centos.org/download/ 下载完后以后使用虚拟机安装即可
- 入门ROS教程与视频汇总(kinetic)
参考网址: Richard Wang 3 Shawn Chen 部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg http://i.you ...