Codeforces 981 共同点路径覆盖树构造 BFS/DP书架&最大值
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 = 2e5 + ;
bool ok(string x)
{
int len = x.size();
if (len == )
{
return true;
}
for (int i = ; i < x.size() / ; i++)
{
if (x[i] != x[x.size() - - i])
{
return false;
}
}
return true;
}
int main()
{
ios_base::sync_with_stdio();
cin.tie();
string a;
cin >> a;
int flag = ;
while (flag)
{
if (ok(a))
{
if (a.size() == )
{
cout << << endl;
return ;
}
a = a.substr(, a.size() - );
}
else
{
flag = ;
}
}
cout << a.size() << 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 = 2e5 + ;
map<int,ll> mp;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
ll anser=;
int n,m;
cin >> n;
int a,b;
for(int i=;i<=n;i++)
{
cin >> a >> b;
if(mp[a]<b)
{
anser+=b-mp[a];
mp[a]=b;
}
}
cin >> m;
for(int i=;i<=m;i++)
{
cin >> a >> b;
if(mp[a]<b)
{
anser+=b-mp[a];
mp[a]=b;
}
}
cout<<anser<<endl;
return ;
}
C
解:
构造题
很明显如果是有不小于一个的度大于2的点则No
如果没有度大于2的点则是一条链 直接输出两端 如果有的话则是菊花图 找每个度为1的叶子点与中心相连
/*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 + ;
vector<int> g[N];
int du[N];
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n;
cin >> n;
int u, v;
for (int i = ; i < n; i++)
{
cin >> u >> v;
g[u].pb(v), g[v].pb(u);
du[u]++, du[v]++;
}
int sum = ;
int maxn = -;
int aim = ;
for (int i = ; i <= n; i++)
{
if (du[i] > )
{
sum++;
}
if (du[i] > maxn)
{
aim = i;
maxn = du[i];
}
}
if (sum > )
{
cout << "No" << endl;
return ;
}
if (maxn > )
{
cout << "Yes" << endl;
int cnt=;
for(int i=;i<=n;i++)
{
if(du[i]==)
{
cnt++;
}
}
cout << cnt << endl;
for (int i = ; i <= n; i++)
{
if (i == aim)
{
continue;
}
if (du[i] == )
{
cout << aim << " " << i << endl;
}
}
}
else
{
cout << "Yes" << endl;
cout << << endl;
for (int i = ; i <= n; i++)
{
if (du[i] == )
{
cout << i << " ";
}
}
cout << endl;
}
return ;
}
D. Bookshelves
题意:
给你N个书K个书架,每个书有一个价值,要求你把书分成 连续的K段 分配进这K个书架使得这几个书架的总值 AND值 最大
解:
贪心 DP或者BFS
首先因为是AND操作所以我们要从最高位开始贪心 如果可行的话就 ans | =1 << i
DP:
/*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];
int main()
{
ios_base::sync_with_stdio();
cin.tie();
cin >> n >> K;
for (int i = ; i <= n; i++)
{
cin >> a[i];
sum[i][i] = a[i];
for (int j = i - ; j >= ; j--)
{
sum[j][i] = sum[j + ][i] + a[j];
}
}
//sum[i][j]表示从第i位到第j位的前缀和
ll ans = ;
for (int w = ; w >= ; w--) //从最高位开始贪起
{
mem(dp, ); //每一次要初始化
dp[][] = ; //dp[i][j]表示把前N个数分成j块每块都有 1<<w 是否可以
for (int i = ; i <= n; i++)
{
for (int j = i - ; j >= ; j--)
{
for (int k = ; k <= K; k++)
{
//如果从前的位置j满足可以分为k-1块而且从j+1到i的前缀和包含了之前贪心的答案同时1<<w位为1
if (dp[j][k - ] && (sum[j + ][i]&ans) == ans && ((sum[j + ][i] >> w) & ))
{
dp[i][k] = ;
}
}
}
}
if (dp[n][K])
{
ans |= 1LL << w;
}
}
cout << ans << endl;
return ;
}
BFS
E. Addition on Segments
Codeforces 981 共同点路径覆盖树构造 BFS/DP书架&最大值的更多相关文章
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- codeforces div2_603 F. Economic Difficulties(树dfs预处理+dp)
题目连接:http://codeforces.com/contest/1263/problem/F 题意:有n个设备,上和下分别连接着一颗树,上下两棵树每棵树的叶子节点连接一个设备,两棵树的根节点都是 ...
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...
- Codeforces 618D Hamiltonian Spanning Tree(树的最小路径覆盖)
题意:给出一张完全图,所有的边的边权都是 y,现在给出图的一个生成树,将生成树上的边的边权改为 x,求一条距离最短的哈密顿路径. 先考虑x>=y的情况,那么应该尽量不走生成树上的边,如果生成树上 ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- SPOJ UOFTCG - Office Mates (树的最小路径覆盖)
UOFTCG - Office Mates no tags Dr. Baws has an interesting problem. His N graduate students, while f ...
- BZOJ-1907 树的路径覆盖 贪心
题意:给一个n个点的树,求树的最小路径覆盖.(这个最小路径覆盖不能有重点) 解法:往图论方向想很久,想得太复杂了,其实直接贪心.这个大佬题解写得很好: https://blog.csdn.net/bl ...
- SPOJ - UOFTCG 树的最小路径覆盖
//SPOJ - UOFTCG 树的最小路径覆盖 #include <bits/stdc++.h> #include <vector> using namespace std; ...
- [BZOJ] 1907: 树的路径覆盖
一个点必然被路径覆盖,根据是否为路径的端点分类 \(f[x][0]\)表示以\(x\)为根的子树,\(x\)不为端点的最小路径覆盖数 \(f[x][1]\)表示以\(x\)为根的子树,\(x\)为一条 ...
随机推荐
- ansible 剧本进阶 角色
主要内容: playbook(剧本) roles 一.查看收集到的信息 ansible cache -m setup setup (需要了解的参数) ansible_all_ipv4_addresse ...
- IMDB Classification on Keras
IMDB Classification on Keras In the book of Deep Learning with Python, there is an example of IMDB m ...
- Retrofitting Analysis
Retrofitting Analysis To figure out the process of retrofitting[1] objective updating, we do the fol ...
- 深入解析CNN pooling 池化层原理及其作用
原文地址:https://blog.csdn.net/CVSvsvsvsvs/article/details/90477062 池化层作用机理我们以最简单的最常用的max pooling最大池化层为例 ...
- 分布式任务celery
Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成. 消息中间件 Celery本身不提 ...
- beego项目部署到nginx(含http转https)
beego项目部署到nginx(含http转https) 之前的程序部署到服务器采用的直接部署,比较方便,现在把它部署到nginx,以便后续的反向代理和负载均衡,同时,因为要接入微信小程序,所以 ...
- CPU 使用率低 but负载高
一.关于负载 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常) 负载 ...
- abp.event.on与abp.event.off使用
apb的全局事件 var eventName = "app.createOrEditFieldModalSaved"; var reloadPage = function () { ...
- Notepad++ 不打开历史文件
1. 自己的很多虚拟机上面安装了notepad++ 提高编辑文件的速度. 但是发现 有时候总是默认打开 很多 历史文件 会造成很卡顿. 2. 解决办法 如下图 设置->首选项 3. 具体的位置为 ...
- java--编码规范易漏
1:命名规范 类名用大驼峰式 参数变量·函数·成员变量·局部变量 小驼峰式 常亮命名全部大些单词用_隔开 抽象类用Abstract开头·异常类用Excetpion结尾·测试类用Test结尾 *POJO ...