【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$行,每行两个 ...
 
随机推荐
- Spring4笔记5--基于注解的DI(依赖注入)
			
基于注解的DI(依赖注入): 对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例.只需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解. < ...
 - vue中使用cookie记住用户上次选择(本次例子中为下拉框)
			
最近工作中碰到一个需求,添加一条数据时,自动记住上次选择的下拉框的数据,刚开始觉得没思路,后来请教了项目组长,组长直接一句,这不很简单吧,直接用cookie,我:....... 好吧,都王的差不多了, ...
 - C#匿名函数与Lambda表达式
			
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.在C#中的Linq中的大部分就是由扩展方法 ...
 - KVM创建虚拟机
			
一.复制现有img备份 1.ssh登陆宿主机 我的在 192.168.0.302.复制img 我的虚拟机img文件在 /home/images 我的img模板文件在 /home/tools/kvm/i ...
 - JVM性能调优监控工具——jps、jstack、jmap、jhat、jstat、hprof使用详解
			
摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...
 - Ubuntu 14.04 16.04 Linux nvidia 驱动下载与安装
			
Ubuntu 14.04 16.04 nvidia 驱动安装 最简单直观的方式是在如下的对话框中直接选择驱动安装即可 但是有时候,驱动不够新,比如14.04用的是340.98版本,如果手动安装驱动可以 ...
 - CVE-2013-3346Adobe Reader和Acrobat 内存损坏漏洞分析
			
[CNNVD]Adobe Reader和Acrobat 内存损坏漏洞(CNNVD-201308-479) Adobe Reader和Acrobat都是美国奥多比(Adobe)公司的产品.Adobe R ...
 - OA项目Ioc DI(二)
			
依赖注入:属性和构造函数的注入 一个简单的Demo: IUserInfoDal接口: public interface IUserInfoDal { void Show(); string Name ...
 - InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法
			
简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报 ...
 - information that should help you find out what is causing the crash.
			
091130 11:16:11 - mysqld got exception 0xc0000005 ; This could be because you hit a bug. It is also ...