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. UIControl事件---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIControl事件1.UIControlEventTouchDown单点触摸按下 ...

  2. Codeforces Round #494 (Div. 3)

    刚好在考完当天有一场div3,就开了个小号打了,打的途中被辅导员喊去帮忙,搞了二十分钟-_-||,最后就出了四题,题解如下:题目链接:http://codeforces.com/contest/100 ...

  3. windows7 能连接移动硬盘 无法显示盘符

    右键点我的电脑,管理里,点磁盘管理,看盘认到没,有时候认到了但是没给盘符,需要自己手动给一个

  4. C高级 框架开发中红黑树结构

    引言  -- 红黑树历史 红黑树是数据结构学习中一道卡. 底层库容器中必不可少的算法. 历经各种实战运用,性能有保障. 同样红黑树不好理解, 就算理解了, 代码也不好写. 就算写了, 工程库也难构建. ...

  5. .net设置浏览器的文本模式

    这段时间做个项目,做的时候因为之前习惯了Google的调试方式,所以就一直在google上面调试,今天项目成员大家的部分要整合,就放到ie8下面测试,但是遇到一个问题,就是用ie打开之后文本模式一直是 ...

  6. 学习1:python输入输出

    1. 输出 >>> print "hello world" hello world >>> print 'hello world' hello ...

  7. English——Unit 1

    meditate  v.沉思,冥想:考虑,谋划 medtiation   n.沉思,冥想:深思熟虑 medium elaborate   adj.精心制作的,详尽的,复杂的:v.精心制作:详述(计划, ...

  8. HDU 3669 Cross the Wall(斜率DP+预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...

  9. sharding-jdbc 实现分表

    Sharding-JDBC 简介 Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本: 可适用于任何基于Java的ORM框架,如:JPA.HIberna ...

  10. golang-指针,函数,map

    指针 普通类型变量存的就是值,也叫值类型.指针类型存的是地址,即指针的值是一个变量的地址.一个指针只是值所保存的位置,不是所有的值都有地址,但是所有的变量都有.使用指针可以在无需知道变量名字的情况下, ...