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 ...
随机推荐
- IJCAI 2019 Analysis
IJCAI 2019 Analysis 检索不到论文的关键词:retrofitting word embedding Getting in Shape: Word Embedding SubSpace ...
- vuex里面的store架构
将store文件夹分为四个文件夹,分别是actions,getters,mutations,state. action:和mutatation功能是类似的,都是修改state里面的数据,区别是acti ...
- Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
默认情况,如果没有显示的指 service 所运行的进程, Service 和 activity 是运行在当前 app 所在进程的 main thread(UI 主线程)里面.service 里面不能 ...
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- zabbix报警后不会自动消除解决
http://www.cnblogs.com/zhongkai-27/p/9984597.html
- JavaScript 积累
1. 基本类型值在内存中占据固定大小的空间,因此被保存在栈空间中: 2. 引用类型的值是对象,保存在堆空间中: 3. 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本:从一个变量向另一个 ...
- java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...
- 【ABAP系列】SAP ABAP7.40新语法简介第二篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...
- Linux vim文件编辑器使用
学习目标: 通过本实验熟练vim的使用. 步骤: 1.将用户家目录的ls结果重定向到vimfile.txt 2.查看rh124第403页实验要求,并完成 参考命令: 复制文件前,需要先建立文件,教材上 ...
- 【神经网络与深度学习】Caffe使用step by step:caffe框架下的基本操作和分析
caffe虽然已经安装了快一个月了,但是caffe使用进展比较缓慢,果然如刘老师说的那样,搭建起来caffe框架环境比较简单,但是完整的从数据准备->模型训练->调参数->合理结果需 ...