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 ...
随机推荐
- Sublime text3 Version 3.2.2, Build 3211破解
一.修改hosts hosts地址: C:\Windows\System32\drivers\etc #sublimetext 127.0.0.1 www.sublimetext.com 127.0. ...
- UML学习笔记_01_基本概念
1.什么是UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发 ...
- 基于 Node.js 的服务器自动化部署搭建实录
基于 Node.js 的服务器自动化部署搭建实录 在服务器上安装 Node.js 编写拉取仓库.重启服务器脚本 配置 Github 仓库的 Webhook 设置 配置 Node.js 脚本 其他问题 ...
- [转] javascript 正则表达式提取数字使用
简述: 测试了一下js的正则表达式函数match 用来从一个字符串里挑出非0开头的数字, 放入一个array里, 之后join(',')之后输出 知识点: 1. 用match函数, 提取一个字符串当中 ...
- pytest -- 测试的参数化
目录 1. @pytest.mark.parametrize标记 1.1. empty_parameter_set_mark选项 1.2. 多个标记组合 1.3. 标记测试模块 2. pytest_g ...
- CSRF token的原理
参考: http://www.cnblogs.com/zhaof/p/6281482.html 简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.cs ...
- 2019JAVA第六次实验报告
Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.10.18 评分等级 实验四 类的继承 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获 ...
- Who will be punished
Who will be punished Problem Description This time,suddenly,teacher Li wants to find out who have mi ...
- priority_queue的常见用法
priority_queue的常见用法 priority_queue是什么? 优先队列 底层实现用堆来实现 每次队首的优先级最大 priority_queue的定义 引入头文件 # include & ...
- 洛谷 P1233 木棍加工 题解
题面 Dilworth定理:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度. 反链是一种偏序集,其任意两个元素不可比:而链则是一种任意两个元 ...