2018.11.04 NOIP训练 小水塘(并查集)
传送门
这是复习普及组的时候做过的题了。
之前一直觉得很难码没有去做。
现在发现可以用并查集直接水过去。
其实就是把题目中说的连通的部分的面积用带权并查集维护一下就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=105;
const double Big=1.214601836602552,Small=0.785398163397;
int n,m,stat[N][N],fa[N*N*4+5],id[N<<1][N<<1];
double siz[N*N*4+N];
char s[N];
inline int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
inline int idx(int a,int b,int c){return ((a-1)*m+b)*4+c;}
inline void merge(int a1,int b1,int c1,int a2,int b2,int c2){
if(!a1||!b1||!a2||!b2||a1>n||a2>n||b1>m||b2>m)return;
int fx=find(idx(a1,b1,c1)),fy=find(idx(a2,b2,c2));
if(fx^fy)fa[fx]=fy,siz[fy]+=siz[fx];
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i){
scanf("%s",s+1);
for(int j=1;j<=m;++j){
stat[i][j]=s[j]^48;
for(int k=1;k<=4;++k)fa[idx(i,j,k)]=idx(i,j,k);
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(!stat[i][j]){
siz[idx(i,j,1)]=siz[idx(i,j,4)]=Small;
siz[idx(i,j,2)]=siz[idx(i,j,3)]=Big;
merge(i,j,2,i,j,3);
}
else{
siz[idx(i,j,1)]=siz[idx(i,j,4)]=Big;
siz[idx(i,j,2)]=siz[idx(i,j,3)]=Small;
merge(i,j,1,i,j,4);
}
merge(i,j,1,i-1,j,3),merge(i,j,2,i-1,j,4);
merge(i,j,1,i,j-1,2),merge(i,j,3,i,j-1,4);
id[(i-1)<<1][(j-1)<<1]=idx(i,j,1);
id[(i-1)<<1][j<<1]=idx(i,j,2);
id[i<<1][(j-1)<<1]=idx(i,j,3);
id[i<<1][j<<1]=idx(i,j,4);
id[(i<<1)-1][(j<<1)-1]=idx(i,j,stat[i][j]+3);
}
}
for(int i=read(),x,y;i;--i)x=read(),y=read(),printf("%.4lf\n",(x+y)&1?0.000:siz[find(id[x][y])]);
return 0;
}
2018.11.04 NOIP训练 小水塘(并查集)的更多相关文章
- 2018.11.02 NOIP训练 停车场(线段树)
传送门 这是一道困饶了我一年的题. 其实就是去年去NOIP提高组试水的时候考的模拟题 但当时我水平不够,跟ykykyk一起杠了一个下午都没调出来. 今天终于AAA了. 其实就是一个维护最长连续0101 ...
- 2018.11.01 NOIP训练 树的排列(树形dp)
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码
- 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)
传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...
- 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)
传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...
- 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码
- 2018.11.07 NOIP训练 lzy的游戏(01背包)
传送门 考虑对于每次最后全部选完之后剩下的牌的集合都对应着一种构造方法. 一个更接地气的说法: 设消耗的牌数为ttt,如果使用的牌的lll值之和也为ttt,则对应着一种构造方式让这种情形成立. 于是做 ...
- 2018.11.06 NOIP训练 简单的计数问题(计数dp)
传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码
- 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)
传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<jpi,j ...
- 2018.11.01 NOIP训练 梭哈(模拟)
传送门 这题貌似不考智商啊. 直接按题意写就可以了. 事实上把牌从小到大排序之后写起来很舒服的. 然后就是有些地方可以人脑减代码量和判断次数. (提示:满堂红和某几种同类型的牌的大小判断) 然后注意A ...
随机推荐
- 有关Oracle统计信息的知识点[z]
https://www.cnblogs.com/sunmengbbm/p/5775211.html 一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如, ...
- ef linq 中判断实体中是否包含某集合
我有一个需求,问题有很多标签,在查询时,需要筛选包含查询标签的一个集合(List<int>),以前的做法是先查询出来符合查询标签条件的标签id的结果集A,再查询问题时,加上判断是否包含该标 ...
- 10.16JS日记
1.parseint() 2.parsefloat() 这两个单词运行的时候遇到第一个非数字就结束了 3.var a="hello word" a这个变量为字符串,每一个字母为字 ...
- laravel中不使用 remember_token时退出报错,如何解决?
Route::get('auth/logout','Auth\AuthController@getLogout'); 这是laravel自带的退出功能只需要写这一条路由就行了,但是很可能爆出以下错误: ...
- Gulp应用场景
转自:Gulp教程之:Gulp能做什么,前端装逼为何要用它 我们先说说 平时web开发遇到的一些场景 和 苦恼无奈的情况: JavaScript和CSS的版本问题 我们都知道 JavaScript ...
- 函数调用的四种方式 和 相关的 --- this指向
this:表示被调用函数的上下文对象. arguments:表示函数调用过程中传递的所有参数. 这两个参数都是隐式的函数参数.会静默传递给函数,并且和函数体内显式声明的参数一样可正常访问. argum ...
- 改变dos的编码方式
chcp 936 改变成 gbk chcp 65001 改成 utf-8 删除MySqlite文件 generic_x86:/data/data/com.example.lifen.sqlite/da ...
- [转载]RPM中SPEC常用路径以及宏变量
转自:http://blog.csdn.net/txgc1009/article/details/6833764 通过命令rpm --showrc查看实现代码.另外直接通过 rpm --eval &q ...
- POJ1236或洛谷2746或洛谷2812 Network of Schools
POJ原题链接 洛谷2746原题链接 洛谷2812(加强版)原题链接 显然在强连通分量里的所有学校都能通过网络得到软件,所以我们可以用\(tarjan\)求出强连通分量并缩点,统计缩点后每个点的入度和 ...
- vs2015 npm list 更新问题
在更新npm list时候,经常会非常的慢,今天试了一个诡异的方法,就是在文件夹下面直接把所有缓存全部删除,全部重新下,结果感觉反而速度快很多. 原来的更新包80M竟然1个小时没有下载完. C:\Us ...