题目链接  Problem J
这道题思路还是很直观的,但是有两个难点:

1、题目中说$1<=NM<=10^{6}$,但没具体说明$N$和$M$的值,也就是可能出现:

$N = 1, M = 1000000$ 这样的数据。

2、对每个查询的分类讨论。

#include <bits/stdc++.h>

using namespace std;

#define REP(i,n)                for(int i(0); i <  (n); ++i)
#define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define dec(i,a,b) for(int i(a); i >= (b); --i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i]) const int N = 1000000 + 10;
const int Q = 1000 + 10; struct node{
int num, x, y, id;
} c[N], f[N]; int ret[Q], nc[Q], nd[Q], ne[Q], ccc[Q]; int ct[N];
int n, m, q;
int cnt;
char st[N];
int T;
int v[N], t[N];
int l, r;
int color;
int col[N];
int x, y; struct nnnn{
int x, y;
} nf[6]; inline bool check(int nu, int pos){
if (nu < 1 || nu > cnt) return false;
if (v[nu]) return false;
int xx1 = c[nu].x, yy1 = c[nu].y, xx2 = c[pos].x, yy2 = c[pos].y;
if (xx1 < 1 || xx1 > n || yy1 < 1 || yy1 > m) return false;
if (abs(xx1 - xx2) + abs(yy1 - yy2) != 1) return false;
if (c[nu].num != c[pos].num) return false;
return true;
} inline bool cc(int nu, int pos){
if (nu < 1 || nu > cnt) return false;
int xx1 = c[nu].x, yy1 = c[nu].y, xx2 = c[pos].x, yy2 = c[pos].y;
if (xx1 < 1 || xx1 > n || yy1 < 1 || yy1 > m) return false;
if (abs(xx1 - xx2) + abs(yy1 - yy2) != 1) return false;
return true;
} inline int pos(int x, int y){ return (x - 1) * m + y;} inline void work(int nu){
t[nu] = color;
f[++r].x = c[nu].x,
f[r].y = c[nu].y,
f[r].id = nu;
v[nu] = 1;
} int main(){ scanf("%d", &T);
while (T--){
scanf("%d%d%d", &n, &m, &q);
cnt = 0;
rep(i, 1, n){
scanf("%s", st + 1);
rep(j, 1, m) ++cnt,
c[cnt].num = (int)st[j] - 48,
c[cnt].x = i, c[cnt].y = j;
} color = 0;
rep(i, 1, cnt) v[i] = 0, t[i] = 0;
rep(i, 1, cnt) if (v[i] == 0){
++color;
t[i] = color;
ct[color] = c[i].num;
f[1].x = c[i].x,
f[1].y = c[i].y,
f[1].id = i;
for (l = r = 1; l <= r; ++l){
int now = f[l].id;
if (check(now - 1, now)) work(now - 1);
if (check(now + 1, now)) work(now + 1);
if (check(now - m, now)) work(now - m);
if (check(now + m, now)) work(now + m);
}
} int maxcol = 0;
rep(i, 1, cnt) col[i] = 0;
int ta = 0;
rep(i, 1, n){
rep(j, 1, m){
++ta;
++col[t[ta]];
maxcol = max(maxcol, t[ta]);
}
} while (q--){
scanf("%d%d", &x, &y);
int df = 0, np = pos(x, y);
if (cc(np - 1, np)) ret[++df] = np - 1;
if (cc(np + 1, np)) ret[++df] = np + 1;
if (cc(np - m, np)) ret[++df] = np - m;
if (cc(np + m, np)) ret[++df] = np + m; rep(i, 1, df) nc[i] = t[ret[i]];
sort(nc + 1, nc + df + 1);
nd[1] = nc[1];
int dx = 1;
rep(i, 2, df) if (nc[i] != nc[i - 1]) nd[++dx] = nc[i];
bool fl = false;
rep(i, 1, dx) if (nd[i] == t[np]){ fl = true; break;} if (!fl){
rep(i, 1, dx) ne[i] = ct[nd[i]];
rep(i, 0, 9) ccc[i] = 0;
rep(i, 1, dx) ccc[ne[i]] += col[nd[i]];
int lk = 0; rep(i, 0, 9) lk = max(lk, ccc[i]);
printf("%d\n", lk + 1);
} else
{
int spj = 0; rep(i, 1, dx) if (nd[i] == t[np]) spj += col[nd[i]];
int dd = 0; rep(i, 1, dx) if (nd[i] != t[np]) nf[++dd].x = ct[nd[i]], nf[dd].y = nd[i];
rep(i, 0, 9) ccc[i] = 0; rep(i, 1, dd) ccc[nf[i].x] += col[nf[i].y];
int lk = 0; rep(i, 0, 9) lk = max(lk, ccc[i]);
printf("%d\n", max(lk + 1, spj));
}
}
} return 0;
}

第十二届北航程序设计竞赛决赛网络同步赛 J题 两点之间的更多相关文章

  1. 第十二届北航程序设计竞赛决赛网络同步赛 B题 前前前世(数论推导 + DP)

    题目链接  2016 BUAA-Final Problem B 考虑一对可行的点$(x, y)$ 根据题意,设$x = ak + 1,y = bk + 1$ 又因为$x$是$y$的祖先的祖先的祖先,所 ...

  2. 第十三届北航程序设计竞赛决赛网络同步赛 B题 校赛签到(建树 + 打标记)

    题目链接  校赛签到 对每个操作之间建立关系. 比较正常的是前$3$种操作,若第$i$个操作属于前$3$种,那么就从操作$i-1$向$i$连一条有向边. 比较特殊的是第$4$种操作,若第$i$个操作属 ...

  3. A. Srdce and Triangle--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    如下图这是“今日头条杯”首届湖北省大学程序设计竞赛的第一题,作为赛后补题 题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 Let  be a regualr tr ...

  4. “今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛 )--E. DoveCCL and Resistance

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/D来源:牛客网 题目描述 ...

  5. I. Five Day Couple--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/H来源:牛客网 题目描述 ...

  6. D. Who killed Cock Robin--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 题目描述 由于系统限制,C题无法在此评测,此题为现场赛的D题 Who killed Cock Robin? I, ...

  7. H. GSS and Simple Math Problem--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 题目描述 Given n positive integers , your task is to calculat ...

  8. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

  9. 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛

    链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

随机推荐

  1. [BZOJ1010]玩具装箱toy(斜率优化)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  2. [BZOJ1503]郁闷的出纳员(Splay)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  3. poj 3273 分期问题 最大化最小值

    题意:将N个账款分给城M个财务期,使得每个分期账款和的值最大? 思路: 每次mid为分期账款 如果分期次数小于m说明mid太大,减上限  反正 增下限 开始下限设为 最大值 上限设为和 解决问题的代码 ...

  4. js 监听后退事件及跳转页面

    //直接跳转 window.location.href="b.html"; //返回上一级页面 window.history.back(-1); //返回下一级页面 window. ...

  5. Python-S9-Day101 Vue-cli

    01 昨天内容回顾 02 音乐播放器计算属性方法和组件创建 03 Vue-cli项目生成 04 模板中组件的使用 01 昨天内容回顾 1.1 {{xxx}}模板语法,插值,简单的运算: 1.2 指令系 ...

  6. 【转】MapReduce:默认Counter的含义

    MapReduce Counter为提供我们一个窗口:观察MapReduce job运行期的各种细节数据.今年三月份期间,我曾经专注于MapReduce性能调优工作,是否优化的绝大多评估都是基于这些C ...

  7. sqlserver不能创建数据库关系图

    use [你的数据库名]EXEC sp_changedbowner 'sa'

  8. RESTful-rest_framework应用第一篇

    一:了解RESTful 主要是做前后端分离用的,RESTful只做后台数据和接口,供外面去调用. REST是Representational State Transfer的简称,中文翻译为“表征状态转 ...

  9. 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治

    题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...

  10. Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

    写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...