Codeforces Round #614 (Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1293
A. ConneR and the A.R.C. Markland-N
题意:略
思路:上下枚举1000次扫一遍,比较一下上下最近的房间
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<utility>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<unordered_map>
using namespace std;
const int maxn=1e5;
typedef long long ll; int main()
{
int t;
cin >> t;
while(t--)
{
map<int,int> v;
int n,s,k;
scanf("%d%d%d",&n,&s,&k);
int x;
for(int i=; i<=k; i++)
{ scanf("%d",&x);
v[x]++;
}
int l,r;
l=r=s;
if(!v[s])
cout << << endl;
else
{
while(v[l]&&v[r])
{
if(l->=)
l--;
if(r+<=n)
r++; }
if(!v[r]&&!v[l])
{
cout << min(s-l,r-s) << endl;
}
else if(!v[r]&&v[l])
{
cout << r-s<< endl;
}
else if(v[r]&&!v[l])
cout << s-l << endl;
}
}
return ;
}
B. JOE is on TV!
题意:略
思路:比较简单,推结论 max (n) = i/n+(i-1)/n + ...n/n
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<unordered_map>
using namespace std;
typedef long long ll;
int main(){
int t;
float ans = ;
scanf("%d",&t);
float i = ;
while(i<=t){
ans+=(/i);
i+=;
}
printf("%.12lf",ans);
return ;
}
C. NEKO's Maze Game
题意:有一个2×n的网格迷宫,网格可以翻动,由正常区域和堵塞区域切换,问从(1,1)能否到(2,n)
思路:一个网格如果翻动,如果这个网格是在第二列,那么这个网格可以和其左上角、正上方、右上角构成堵塞,这样算是三个“堵塞贡献”,如果位于第一列翻动由正常区域变成堵塞,那么这个网格可以和左下角、正下方、右下方的网格构成堵塞区域,这样也是三个贡献,每次放置网格就计算上这些贡献,换回正常的时候就减去,如果总的贡献是0,那么就可以到达(2,n)
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
int grid[][maxn];
int can[maxn];
int main(){
int n,q;
int cnt = ;
scanf("%d%d",&n,&q);
while(q--){
int x,y;
scanf("%d%d",&x,&y);
x = x - ;
if((grid[][y]+grid[][y]) == ){
cnt--;
}
if(grid[x][y]+grid[(x+)%][y-] == ){
cnt--;
}
if(grid[x][y]+grid[(x+)%][y+] == ){
cnt--;
}
grid[x][y] = (grid[x][y]+)%;
if((grid[][y]+grid[][y]) == ){
cnt++;
}
if(grid[x][y]+grid[(x+)%][y-] == ){
cnt++;
}
if(grid[x][y]+grid[(x+)%][y+] == ){
cnt++;
}
if(cnt == ){
printf("YES\n");
}
else printf("NO\n");
}
return ;
}
D. Aroma's Search
题意:二维平面上有若干个点,第i个点的坐标(xi,yi)满足xi=xi-1*ax+bx,yi=y-1*ay+by,已知 ax,bx,ay,by,x0,y0 以及初始位置(xs,ys),每秒钟可以往上下左右走1个单位,则在t秒内最多可以走到多少个点
思路:所有点之间的曼哈顿距离是乘指数级别增长的,不能到了一个点之后再回到初始点,也不能从距离最近的点开始出发去枚举。考虑到数据范围,其实点的极限数量大概在60多,所以可以构造一个暴力的算法去枚举。最佳的方案是先从起点到其中一个点,再从这个点向下面的点移动,因为向上比向下距离远,如果下方所有的点都可以到达,再往上走,这样是最佳的方案。所有需要枚举起点到每一个点,再从该点先向下方移动再向上移动
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x0,y0,ax,ay,bx,by,xs,ys,t;
vector<pair<ll,ll> > v;
ll solve(int x){
ll remain = t;
remain -= abs(v[x].first-xs)+abs(v[x].second-ys);
if(remain<) return ;
ll res = ;
int last = x;
for(int i = x-;i>=;i--){
ll can = abs(v[i].first-v[last].first)+abs(v[i].second-v[last].second);//先向下方的点移动
if(remain-can<) break;
res++;
remain-=can;
last = i;
}
for(int i = x+;i<v.size();i++){
ll can = abs(v[i].first-v[last].first)+abs(v[i].second-v[last].second);//如果还有时间剩余向上方点移动
if(remain-can<) break;
res++;
remain-=can;
last = i;
}
return res;
}
int main(){
cin>>x0>>y0>>ax>>ay>>bx>>by;
cin>>xs>>ys>>t;
ll curx = x0,cury = y0;
while(){
ll disX = abs(curx-xs);
ll disY = abs(cury-ys);
if(curx>xs && cury>ys && disX+disY > t) break;//如果移动到该点就超过了t秒,break
v.push_back({curx,cury});
curx = ax*curx+bx;
cury = ay*cury+by;
}
ll ans = ;
for(int i = ;i<v.size();i++){
ans = max(ans,solve(i));//枚举到每个点
}
cout<<ans;
return ;
}
E. Xenon's Attack on the Gangs
题意:给出一颗树,树上随机分配边权值,不存在权值相同的两条边,定义mex(u,v)表示点u到点v经过边的边权集合S中没有出现的最小非负整数,求S = ∑mex(u,v) (1<=u<=v<=n)的最大值。
思路:这道题没有太明白,看官方题解首先要推出一个组合公式,问题转化为求一条边的贡献,对u到v的路径进行dp,枚举u到v的每一条路径的贡献。
放个官方题解吧


AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
typedef long long ll;
int fa[maxn][maxn],sub[maxn][maxn];
ll dp[maxn][maxn];
vector<int> G[maxn];
int n,root;
int dfs(int cur,int father){
sub[root][cur] = ;
for(int i = ;i<G[cur].size();i++){
if(G[cur][i]!=father){
fa[root][G[cur][i]] = cur;
sub[root][cur]+=dfs(G[cur][i],cur);
}
}
return sub[root][cur];
}
ll getDp(int u,int v){
if(u == v) return ;
if(dp[u][v] ) return dp[u][v];
return dp[u][v] = sub[u][v]*sub[v][u] + max(getDp(fa[v][u],v),getDp(fa[u][v],u));
}
int main(){
scanf("%d",&n);
for(int i = ;i<n;i++) {
int u,v;
cin>>u>>v;
G[u].push_back(v),G[v].push_back(u);
}
for(int i = ;i<=n;i++){
root = i;
dfs(i,-);
}
ll res = ;
for(int i = ;i<=n;i++){
for(int j = ;j<=n;j++){
res = max(res,getDp(i,j));
}
}
printf("%lld",res);
return ;
}
Codeforces Round #614 (Div. 2) A-E简要题解的更多相关文章
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- Codeforces Round #614 (Div. 2) C - NEKO's Maze Game
题目链接:http://codeforces.com/contest/1293/problem/C 题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走, 给定q个询问,每个询问给定一个点(x,y ...
- Codeforces Round #614 (Div. 2) D
变色失败 只加8分 距离变色只差5分 B题没想到那么简单,结论秒猜,不敢交,傻傻验证5分钟. C题也想了码了好一会儿,我动态维护set做的. 1小时3题,整体难度好像没以前那么大了?(虽然也不强,但比 ...
- Codeforces Round #614 (Div. 2)E(思维,构造,DP)
构造边权,从0开始给边赋值,初始选取一条边权为0,每次赋值的贡献为这一条链两侧的结点(包含链的端点)个数之积,下一次赋值以当前链其一端点续一条边,边权为上次赋的值+1.先DFS找到点的组合这条链两侧结 ...
- Codeforces Round #614 (Div. 1) A. NEKO's Maze Game (思维,模拟)
题意:有一个\(2\)X\(n\)的矩阵,你想从\((1,1)\)走到\((2,n)\),每次可以向上下左右四个方向走,但在某些时间段某个点会被堵住,如果已经被堵住,那么即恢复正常,每次对某个点操作, ...
- Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划
题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
- Codeforces Round #624 (Div. 3) F. Moving Points 题解
第一次写博客 ,请多指教! 翻了翻前面的题解发现都是用树状数组来做,这里更新一个 线段树+离散化的做法: 其实这道题是没有必要用线段树的,树状数组就能够解决.但是个人感觉把线段树用熟了会比树状数组更有 ...
- Codeforces Round #677 (Div. 3) E、G题解
E. Two Round Dances #圆排列 题目链接 题意 \(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞 ...
随机推荐
- Luogu2040 | 打开所有的灯 (广搜+状压)
题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的 ...
- C++ 与String有关的函数!!!
String函数 1.字符串的输入 (1) string s; cin >> s;//碰到空格等分隔符会终端输入 /* string s; cin >> s;//如果输入 he ...
- 将IMAGE转为PDF后上传
using iTextSharp.text; using iTextSharp.text.pdf; /// <summary> /// 将IMAGE转为PDF后上传 /// </su ...
- 关于牛客网C语言结构体位域(bit-fields)的一道题
题目链接地址: https://www.nowcoder.com/questionTerminal/f4e20747a2dd4649bac0c028daa234f4 来源:牛客网 低地址字节 Byte ...
- python3-cookbook笔记:第二章 字符串和文本
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
- MySql 小表驱动大表
在了解之前要先了解对应语法 in 与 exist. IN: select * from A where A.id in (select B.id from B) in后的括号的表达式结果要求之输出一列 ...
- Oracle Solaris 10 重启后提示 Bad PBR sig
Solaris 10 安装完毕重启后提示 Bad PBR sig 在磁盘分区的时候,默认自带的 overlap 不要删除,否则启动报错. 分区时,保留overlap(默认显示总容量大小)分区.安装操作 ...
- dos命令获取系统时间与变量定义
1.获取系统时间及格式化 参考文章: 1.1 cmd下获取系统时间 1.2 获取系统时间的DOS命令 2.变量定义 https://www.jb51.net/article/49197.htm 3.使 ...
- Docker最全教程——从理论到实战(二十二)
前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...
- 常用命令 在linux下
1.拷贝某个目录及其下的所有的文件到另外一个目录 语法:cp -r <source directory name>/ <destination directory name>/ ...