一开始看到题就果断跳到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. Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon')

    问题: error: Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon' ...

  2. Pytorch多进程最佳实践

    预备知识 模型并行( model parallelism ):即把模型拆分放到不同的设备进行训练,分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层 ...

  3. Access中替代case when的方法 .

    最近在做一个用Access的东东,其中用到了case when的方式,但是Access是不支持这种语法的,查询知道IIf和Swith可以作为替代,总结如下: IIf(expr, truepart, f ...

  4. tomcat运行内存溢出问题

    tomcat 运行内存配置优化 /opt/apache-tomcat-7.0.65/bin/catalina.sh:JAVA_OPTS="$JAVA_OPTS -Dfile.encoding ...

  5. git —— Feature分支

    添加新功能时,新建feature分支 分支上开发完成后,再进行合并.最后删除feature分支 $ git checkout -b feature-vulcan 开发完毕后,切换回添加的分支,进行合并 ...

  6. jersey HTTP Status 400 - Bad Request

    原因是jersey 内置的转换器,只能做简单的类型转换如: 首先客户端提交上来的一定是String; String ----> String/Long/Boolean 这些基本的 可以转换,但是 ...

  7. SQL SERVER 比较两个数据库中表和字段的差异

    在开发过程中线上的数据库表字段和本地数据库表字段是存在的,也许我们在本地数据库中所增加的表字段都会有记录到SQL文件中,但当增加的表及字段名称较多时总会出现漏网之鱼,发布真是版本的时候回出现很多很多的 ...

  8. SQL SERVER2008 镜像全攻略

    --在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像. 大致的步骤包括: --在为数据库镜像配置的每个服务器实例上执行下列步骤: --在 master 数据库中,创建数据库主密钥. - ...

  9. MySQL学习笔记:concat、concat_ws、group_concat —— 字符串连接

    在MySQL中,实现字符串拼接主要有以下3种函数: concat(x,y,...) concat_ws(分隔符,x,y,...) group_concat(distinct xxx order by ...

  10. CVE-2013-2729 Adobe Reader和Acrobat 数字错误漏洞

    这个洞是在论坛里看到的,感觉很有意思,来学习一下.个人感觉IE或者说是浏览器的洞和Adobe洞都是比较难调的,主要是有大量的类难以摸清之间的关系. 这个洞是一个整数溢出的洞,这个不是重点.重点是利用的 ...