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 ...
随机推荐
- 新建一个浏览器APP
安卓开发环境准备好了,试试新建一个浏览器程序吧 1.Start a new Android Studio Project 2.选这个像微信一样的样式 3.选择语言和版本 4.等待创建完成,拖一个Web ...
- 关于 LDTP 操纵 windows 控件。
LDTP doc: https://ldtp.freedesktop.org/user-doc/ 对于 web 自动化,我们用 Selenium, 但是对于 windows 控件,我们可以使用 LD ...
- jquery绝对路径
<strong>1.修改为绝对路径</strong> $(document).ready(function(){ $.get("${pageContext.reque ...
- SQL查询的嵌套
SQL查询过程中,可以将查询嵌套为表,嵌套时需要给每个派生出来的表一个自己的别名. 如图:
- foundation DB问题
1. go get github.com/apple/foundationdb/bindings/go/src/fdb # github.com/apple/foundationdb/bindings ...
- ffmpeg 视频过度滤镜 gltransition
ffmpeg 视频过度滤镜 gltransition 上次随笔中提到的 ffmpeg-concat 可以处理视频过度,但是缺点是临时文件超大. 经过查找 ffmpeg 还有 gltransition ...
- 深入理解Istio核心组件之Pilot
Istio作为当前服务网格(Service Mesh)领域的事实标准,流量治理(Traffic Management)是其最为基础也最为重要的功能.本文将结合源码对Istio流量治理的实现主体——组件 ...
- beego框架学习(二) -路由设置
路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...
- Java 8中处理集合的优雅姿势——Stream
在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便 ...
- MSF魔鬼训练营-3.1.2信息收集-通过搜索引擎进行信息搜集
1.Google hacking 技术 自动化的Google搜索工具 SiteDigger https://www.mcafee.com/us/downloads/free-tools/sitedig ...