一开始看到题就果断跳到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. 使用pandas把mysql的数据导入MongoDB。

    使用pandas把mysql的数据导入MongoDB. 首先说下我的需求,我需要把mysql的70万条数据导入到mongodb并去重, 同时在第二列加入一个url字段,字段的值和第三列的值一样,代码如 ...

  2. javascript多投事件的处理 (转)

    出处 http://blog.csdn.net/dead_of_winter/article/details/1646367 尽管ecma标准指定了addEventListener这样的方法来实现事件 ...

  3. JQuery中DOM事件合成用法

    jQuery有两个合成事件——hover()方法和toggle()方法 类似前面讲过的ready()方法,hover()方法和toggle()方法都属于jQuery自定义的方法. hover()方法: ...

  4. UFLDL(五)自编码算法与稀疏性

    新教程内容太繁复,有空再看看,这节看的还是老教程: http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE ...

  5. python软件依赖关系

    caffe:numpy,scikit-image opencv:numpy

  6. Centos简介

    Centos作为主流的一种Linux操作系统,以后项目中,比如后期Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍, ...

  7. CodeIgniter典型的表单提交验证代码

    view内容: <?php echo form_open('user/reg'); ?> <h5>用户名</h5> <input type="tex ...

  8. hdu 5112 (2014北京现场赛 A题)

    给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.0 ...

  9. HP 打印机监控

    http://www.ttlsa.com/zabbix/zabbix-monitor-hp-printer/ https://www.cnblogs.com/losbyday/articles/583 ...

  10. mongo oplog 整理

    首先需要介绍一下mongodb local库的作用 local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 test:PRIMARY> use local switched to ...