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. JS练习题(左侧菜单下拉+好友选中)

    题一.左侧菜单下拉 做题思路:先做菜单和子菜单,把子菜单默认隐藏.再用JS调样式. <style type="text/css"> *{ margin:0px auto ...

  2. HDU 1284 钱币兑换问题 (dp)

    题目链接 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于327 ...

  3. HDU 2577 How to Type (字符串处理)

    题目链接 Problem Description Pirates have finished developing the typing software. He called Cathy to te ...

  4. winform Textbox像百度一下实现下拉显示

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 一个无线通信类投稿的期刊list

    转载一个,但是有些期刊的影响因子不是很对,要投的时候还是再到期刊主页上面看一看吧~ 期刊缩写 期刊全名 近年影响因子 P IEEE Proceedings Of The IEEE 3.686 IEEE ...

  6. device tree source file position

    android/kernel/msm-4.9/arch/arm64/boot/dts/qcom/

  7. java===java基础学习(4)---字符串操作

    java中的字符串操作和python中的大致相同,需要熟悉的就是具体操作形式. 关于具体api的使用,详见:java===字符串常用API介绍(转) package testbotoo; public ...

  8. OGRECave [www]

    OGRECave https://github.com/OGRECave

  9. apache加入chkconfig

    #First Step: cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd #Second Step: vim /etc/init.d/htt ...

  10. Leetcode 之Length of Last Word(38)

    做法很巧妙.分成左右两个对应的部分,遇到左半部分则入栈,遇到右半部分则判断对应的左半部分是否在栈顶.注意最后要判断堆栈是否为空. bool isValid(const string& s) { ...