Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目
A
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = + ;
int n, K;
ll sum[N][N];
ll a[N];
bool dp[N][N];
map<string, int> mp2;
map<int, string> mp;
int visit[];
int main()
{
ios_base::sync_with_stdio();
cin.tie();
mp2["purple"] = ;
mp2["green"] = ;
mp2["blue"] = ;
mp2["orange"] = ;
mp2["red"] = ;
mp2["yellow"] = ;
mp[] = "Power";
mp[] = "Time";
mp[] = "Space";
mp[] = "Soul";
mp[] = "Reality";
mp[] = "Mind";
int n;
cin >> n;
for (int i = ; i <= n; i++)
{
string now;
cin >> now;
visit[mp2[now]]++;
}
cout << - n << endl;
for (int i = ; i <= ; i++)
{
if (!visit[i])
{
cout << mp[i] << endl;
}
}
return ;
}
B
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = + ;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
ll x, y;
cin >> x >> y;
if (x == y || x == && y == || x == && y == )
{
cout << "=" << endl;
return ;
}
if (x == || y == )
{
if (x == )
{
cout << "<" << endl;
}
else
{
cout << ">" << endl;
}
return ;
}
if (max(x, y) <= )
{
ll ansx = ;
for (int i = ; i <= y; i++)
{
ansx *= x;
}
ll ansy = ;
for (int i = ; i <= x; i++)
{
ansy *= y;
}
if (ansx > ansy)
{
cout << ">" << endl;
}
else
{
cout << "<" << endl;
}
return ;
}
if (x > y)
{
cout << "<" << endl;
}
else
{
cout << ">" << endl;
}
return ;
}
C
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = + ;
int num[];
ll cost[];
ll dp[][];
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n;
cin >> n;
for (int i = ; i <= n; i++)
{
cin >> num[i];
}
for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
dp[i][j] = LLONG_MAX;
}
}
for (int i = ; i <= n; i++)
{
cin >> cost[i];
dp[i][] = cost[i];
}
for (int i = ; i <= n; i++)
{
for (int j = i - ; j >= ; j--)
{
for (int k = ; k <= ; k++)
{
if (dp[j][k - ] != LLONG_MAX&&num[i]>num[j])
{
dp[i][k] = min(cost[i] + dp[j][k - ], dp[i][k]);
}
}
}
}
ll anser = LLONG_MAX;
for (int i = ; i <= n; i++)
{
anser = min(anser, dp[i][]);
}
if (anser == LLONG_MAX)
{
cout << - << endl;
}
else
{
cout << anser << endl;
}
return ;
}
D. Fair
题意:
给你N个点M条边的连通图(100000) 和K个特殊地方(100) S个目标地(100)
每个特殊的地方有某种特产 问你从1到N每个点要拿S个特产的最少的花费
解:
给每个特产都建一个超级点 然后BFS 处理出1到N每个点到每种特产的最小距离
然后贪心取前S个即可 复杂度nklogk
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = 1e5 + ;
int p[N];
vector<int> g[N];
int ans[N];
int dist[N];
int que[N];
int dp[N][];
int getl, getr;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n, m, k, s;
cin >> n >> m >> k >> s;
for (int i = ; i <= n; i++)
{
cin >> p[i];
}
int u, v;
for (int i = ; i <= m; i++)
{
cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
for (int i = ; i <= k; i++)
{
getl = ;
getr = ;
mem(dist, );
for (int j = ; j <= n; j++)
{
if (p[j] == i)
{
dist[j] = ;
que[++getr] = j;
}
}
while (getl <= getr)
{
int len = g[que[getl]].size();
for (int w = ; w < len; w++)
{
int to = g[que[getl]][w];
if (!dist[to])
{
dist[to] = dist[que[getl]] + ;
que[++getr] = to;
}
}
getl++;
}
for (int j = ; j <= n; j++)
{
dp[j][i] = dist[j] - ;
}
}
for (int i = ; i <= n; i++)
{
sort(dp[i] + , dp[i] + + k);
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= s; j++)
{
ans[i] += dp[i][j];
}
}
for (int i = ; i <= n; i++)
{
cout << ans[i] << " ";
}
cout << endl;
return ;
}
E. Petr and Permutations
题意:
给你1到N的一种排列 A会选3n次每次随机一对位置交换 B会选7n+1次
问你给你的数列是A得到的可能性大还是B的可能性大
①:
可以猜到结论 观察可以得知3n和7n+1的奇偶性永远是不同的
所以我们计算原数列所需要的最小交换次数 当这个次数与A奇偶性相同就是A 反之则是B
(因为要与原数列相同的话在最小交换次数基础上要加偶数次)
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = 1e6 + ;
int par[N], hs[N];
int sz[N];
int num[N];
int cnt;
void init(int n)
{
for (int i = ; i <= n; i++)
{
par[i] = i, hs[i] = i, sz[i] = ;
}
}
int find(int x)
{
return par[x] == x ? x : par[x] = find(par[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
{
par[x] = y, sz[y] += sz[x];
}
}
int visit[N];
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n;
cin >> n;
init(n);
for (int i = ; i <= n; i++)
{
cin >> num[i];
}
for (int i = ; i <= n; i++)
{
if (num[i] != i)
{
unite(i, num[i]);
}
}
for (int i = ; i <= n; i++)
{
par[i] = find(i);
}
ll anser = ;
for (int i = ; i <= n; i++)
{
if (!visit[par[i]])
{
anser += sz[par[i]] - ;
visit[par[i]] = ;
}
}
//cout << anser << endl;
if (anser % == * n % )
{
cout << "Petr" << endl;
}
else
{
cout << "Um_nik" << endl;
}
return ;
}
②:
也可以用不动点+逆序对分情况处理
当n不小于20000时 考察不动点的数量 n小于20000时取逆序对的数量判断奇偶性
int main()
{
int i,j,a1,a2;
_(n);
fo(i,n)
_(a[i]);
fo(i,n)
an+=(a[i]==i);
if(n>=)
puts(an>=?"Petr":"Um_nik");
else
{
fo(i,n)
fo1(j,i+,n)
if(a[j]<a[i])
ans++;
puts((ans+n)%?"Um_nik":"Petr");
}
}
F. AND Graph
题意:
给你0 - 2n-1范围中的m个数 (n<=22)
如果两个数字Ai Aj 两个&的值为0 则这两个点之间有一条边 问你最后的连通块有几个
解:
暴力题.. 假设有X,Y两个数 X的二进制恰好是Y的基础上多出一位1 比如 101 与 001 我们称X为Y的祖先 Y是X的子孙
这样能与祖先X相连的点 肯定能和Y相连 这样X,Y其实就通过对立数间接相连
所以我们每次DFS一个数的时候 把X全部子孙找出来 也把所有对立数(包括子孙的)找出来 他们肯定就是一个连通块
因为N最大是22 所以我们可以直接暴力循环枚举 开两个bool 数组 num[i]为true表示i是被选中的数 而vis[i]为true表示i被DFS过了
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = ( << ) + ;
int n, m, now;
int anser;
bool num[N], vis[N];
void dfs(int x)
{
if (vis[x]) //如果之前已经DFS到过
{
return ;
}
vis[x] = true;
for (int i = ; i < n; i++)
if (x & ( << i)) //DFS每个二进制比X少一位1的数保证main循环中不会被循环到
{
dfs(x ^ ( << i));
}
if (num[x]) //如果X是存在的 找所有X对立面的数
{
dfs(( << n) - - x);
}
}
int main()
{
cin >> n >> m;
for (int i = ; i <= m; i++)
{
scanf("%d", &now);
num[now] = true;
}
for (int i = ( << n) - ; i >= ; i--)
if (!vis[i] && num[i]) //如果有存在的数且没有被DFS到
{
anser++; //连通块答案数+1
dfs(( << n) - - i); //DFS全部与i连通的数
}
cout << anser << endl;
return ;
}
Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目的更多相关文章
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- C. Edgy Trees Codeforces Round #548 (Div. 2) 并查集求连通块
C. Edgy Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 璐神现在有张n*m大小的地图,地图上标明了陆地(用 ...
- Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)
题目链接:http://codeforces.com/problemset/problem/377/A 题解: 有tot个空格(输入时统计),把其中k个空格变为wall,问怎么变才能使得剩下的空格依然 ...
- K - Ancient Messages(dfs求联通块)
K - Ancient Messages Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- Educational Codeforces Round 1D 【DFS求联通块】
http://blog.csdn.net/snowy_smile/article/details/49924965 D. Igor In the Museum time limit per test ...
- 求连通块个数 - BFS、DFS、并查集实现
本文基于leetcode的200.岛屿数量(题目
- 求连通块的面积 - BFS、DFS实现
本文以Leetcode中695.岛屿的最大面积题目为基础进行展开(题目
- Codeforces Round #375 (Div. 2)——D. Lakes in Berland(DFS连通块)
D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- vscode + php+ftp
首先,php网站的文件都整理到一个文件夹中: 然后,用vscode的File.Open Folder打开刚才的文件夹: 3,Ctrl+Shift+P,输入SFTP:Config,会打开一个配置文件,编 ...
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
- Nginx搭建动态静态服务器
Nginx做静态资源服务器优于Tomcat 区分静态资源,动态资源请求 使用域名区分! 如果是动态资源请求 反向代理到 Tomcat 如果 是静态资源请求 直接走本地Nginx 配置: ###静态 ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_09.RequestMapping注解的属性
看下RequestMapping下面 一共有几个属性 那么属性用处不大 value和path互相为别名 这里用value表示path也是没有问题的 只有一个属性,并且属性名称叫做value那么就可以省 ...
- Visual Studio 2017 远程调试
当你将.NET程序发布到不同机子时候,想要进行调试,但机子不足以安装VS或安装VS麻烦,可以考虑使用远程调试,这里以C#项目为例,asp.net方法略有不同 原理: 首先安装VS远程调试工具,有俩种安 ...
- js脚本实现在该界面直接跳转到一个登录界面并且自动登录
1:首先说明的是自动登录也是需要密码的,这是前一个网页传输过去的 2:这里我使用的是post提交表单的形式 <------------------------------------------ ...
- 对MPU6050坐标矩阵修改的学习
MPU6050是根据三轴陀螺仪和三轴加速度计数据通过DMP运算的出欧拉角.系统默认为水平放置, 但是实际使用过程中并不都是水平放置,有些特殊的场合,要求芯片竖直放置,这时候就不得 不修改MPU6050 ...
- shell脚本4
1.从FTP服务器下载文件 #!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 filename" fi dir=$(dirname ...
- Autumn is deep, alas! I stand on the grass in the shadow of the evergreen trees.
essence. n. 本质 flush.n. 脸红 v. 刷洗 initiate.v.开始 intrinsic.固执的 mainfest.a.显然的 intuition.n.直觉上的 refrain ...
- 使用lombok.Data编译时无法找到get/set方法
我的IDEA版本是2019.2 在使用IDEA创建了一个SpringBoot项目,其中一个实体类使用了@Data注解,但是在Service中调用的时候找不到get/set方法. 检查步骤: 1.在St ...