Link:

Codeforces #192 传送门

前两天由于食物中毒现在还要每天挂一天的水

只好晚上回来随便找套题做做找找感觉了o(╯□╰)o

A:

看到直接大力模拟了

但有一个更简便的方法,复杂度为$O(被禁止的格子数)$

如果将每个黑格子上下左右四条线都染上色

可以发现一个格子最终无法被“净化”当且仅当其被左右/上下来向都染过色,所以将最终无法净化的格子合并是一个矩形

这样最终答案为:黑格子出现的行的个数*黑格子出现的列的个数

此时复杂度就变成与黑格子个数相关了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
int n,m,cnt,vis[][];char dat[][]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",dat[i]+);
for(int i=;i<=n;i++)
{
bool f=;
for(int j=;j<=m;j++)
if(dat[i][j]=='S'){f=;break;}
if(f) continue;
for(int j=;j<=m;j++) vis[i][j]=;
}
for(int i=;i<=m;i++)
{
bool f=;
for(int j=;j<=n;j++)
if(dat[j][i]=='S'){f=;break;}
if(f) continue;
for(int j=;j<=n;j++) vis[j][i]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cnt+=vis[i][j];
printf("%d",cnt);
return ;
}

Problem A

B:

发现菊花树满足任意两点之间距离不超过2

因此只要找到中心点就好了

又发现禁止的对数少于n/2,这样肯定有点没有禁止的点

这样找到没有限制的点作为中心构造菊花树即可

其实这是个结论:

保证任意两点间距离不超过2,只有菊花树满足条件

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
int n,m,x,y,cnt[]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&x,&y),cnt[x]++,cnt[y]++;
for(int i=;i<=n;i++)
if(!cnt[i])
{
printf("%d\n",n-);
for(int j=;j<=n;j++)
if(i!=j) printf("%d %d\n",i,j);
return ;
}
return ;
}

Problem B

C:

挺好想的,发现有解必为n个

这样先排除无解情况再以行/列为基准顺次找到n个即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
int n,posr[],posc[];
char dat[][]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%s",dat[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(dat[i][j]=='.') posr[i]=j,posc[j]=i;
bool f1=,f2=;
for(int i=;i<=n;i++)
{
if(!posr[i]) f1=;
if(!posc[i]) f2=;
}
if(!f1&&!f2) return puts("-1"),;
if(f1)
for(int i=;i<=n;i++)
printf("%d %d\n",i,posr[i]);
else
for(int i=;i<=n;i++)
printf("%d %d\n",posc[i],i);
return ;
}

Problem C

D:

可以将所有中途相遇都转化为终点相遇

这样并不会使得是否相遇收到影响

此时就能推出走最短路必定最优的结论了

将终点设为BFS起点,将离终点比起点近的点都计入答案即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=;
P S,T;char dat[MAXN][MAXN];
int n,m,res,dist[MAXN][MAXN],mx;
int dx[]={,,,-};
int dy[]={,-,,}; int main()
{
memset(dist,-,sizeof(dist));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",dat[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(dat[i][j]=='S') S=P(i,j);
if(dat[i][j]=='E') T=P(i,j);
} queue<P> q;q.push(T);
dist[T.X][T.Y]=;
while(!q.empty())
{
P t=q.front();q.pop();
int x=t.X,y=t.Y;
for(int i=;i<;i++)
{
int fx=x+dx[i],fy=y+dy[i];
if(fx<||fx>n||fy<||fy>m) continue;
if(dist[fx][fy]!=-||dat[fx][fy]=='T') continue;
dist[fx][fy]=dist[x][y]+;
q.push(P(fx,fy));
}
} mx=dist[S.X][S.Y];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)//这里dist[i][j]!=-1不能漏
if(dat[i][j]>=''&&dat[i][j]<=''&&dist[i][j]!=-&&dist[i][j]<=mx)
res+=dat[i][j]-'';
printf("%d",res);
return ;
}

Problem D

E:

考试时构造了很久确定解都觉得实现不了

最后发现能随机艹过去……

确定解:

寻找确定解时,有一点是我也想到的:将最终解构造成一条链

但还有一个重要性质:>=7时必定有解

那么对于<=7的小数据阶乘暴力即可

找到最大的连通块,将奇数项放前面,偶数项放后面

同时将第一第二项交换位置(如ABCDEF->CAEBDF)

这样就保证即使没有其它连通块,当前情况也能满足要求

接下来将其它连通块不断间隔式插入即可

在讨论里又看到了一个方法:

将序列转换并使其保持如下性质:

对于每个连通块,每一个点原来的相邻点都在其邻近的两格之内

这样将i和i+3连边即可(待填坑……)

随机算法:

其实算一算随机一个序列正确的概率还是很高的

(1-2/n)^n约等于0.135,反正随机100次应该就够了

于是就愉快得不用构造确定解了……

所以说,有时候还是要有点梦想

算算概率说不定随机就能随便过了……

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int> P;
map<P,int> mp;
int n,m,x,y,a[]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&x,&y),mp[P(x,y)]=,mp[P(y,x)]=;
for(int i=;i<=n;i++) a[i]=i;
for(int i=;i<=;i++)
{
random_shuffle(a+,a+n+);
bool f=;a[n+]=a[];
for(int j=;j<=m;j++)
if(mp[P(a[j],a[j+])]){f=;break;}
if(!f) continue;
for(int j=;j<=m;j++)
printf("%d %d\n",a[j],a[j+]);
return ;
}
puts("-1");
return ;
}

Problem E

[Codeforces #192] Tutorial的更多相关文章

  1. codeforces 192 c

    link: http://codeforces.com/contest/330/problem/C broute force but you must be careful about some tr ...

  2. codeforces 192 D

    link: http://codeforces.com/contest/330/problem/D The discription looks so long, but the problem is ...

  3. [Codeforces #172] Tutorial

    Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...

  4. [Codeforces #514] Tutorial

    Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...

  5. [Codeforces #210] Tutorial

    Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...

  6. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  7. [Codeforces #174] Tutorial

    Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...

  8. [Codeforces #190] Tutorial

    Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...

  9. [Codeforces #211] Tutorial

    Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...

随机推荐

  1. idea ssm框架搭建

    1.分享一篇完整的ssm框架搭建连接 大牛博客:https://www.cnblogs.com/toutou/p/ssm_spring.html#_nav_0 2.我的搭建的完整项目连接,可以进入我的 ...

  2. 关于scala 集合 List Map Set

    1,数组 2,List,ListBuffer 3, Map , mutable.Map

  3. vue-awesome-swipe 基于vue使用的轮播组件 使用(改)

    npm install vue-awesome-swiper --save  //基于vue使用的轮播组件 <template> <swiper :options="swi ...

  4. python初步学习-python数据类型-字典(dict)

    字典 字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起.注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息. 注意,你只 ...

  5. yocto 离线编译

    使用yocto编译一个软件包时,一般会先在本地寻找下载好的源码包,如果不存在则根据配置从网络下载. 添加本地源码包 为了支持离线编译,添加一个包的配置文件后,需要在本地也准备好源码包. 可以先打开网络 ...

  6. android CVE 漏洞汇总

    arm exploits 技术教程: Learning Pentesting for Android Devices CVE-2015-1530 ,CVE-2015-1474 两个android整数溢 ...

  7. 安全测试===sqlmap(肆)转载

    十八.杂项 1.使用简写 参数:-z 有些参数组合是被经常用到的,如“--batch --random-agent --ignore-proxy --technique=BEU”,这样写一大串很不好看 ...

  8. 【hihocoder】sam1-基本概念

    这题有毒…… 原本只是想复习下sam,于是写…… 后来发现自己傻了不知道怎么维护endpos…… 一气之下直接kmp拉倒,mdzz UPD:现在我好像会维护endpos了…… #include< ...

  9. 如何使用vux创建vue项目

    1.安装vue-cli,通过vue-v可以查明 安装vue-cli步骤 vue init airyland/vux2 projectPath(项目名字) 2.安装依赖模块 方法1:npm instal ...

  10. android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库

    我们的程序在32位机器上没有问题,有一天公司采购了一台魅族MX5 MTK的64位处理器上我们的应用报错了 "nativeLibraryDirectories=[/data/app/com.l ...