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\)个人,每个人只能跳一种圆形舞 ...
随机推荐
- 数据结构与算法 C++ 视频教程(4 套)百度网盘
为了大二有实力参加算法比赛,大一暑假我选择了留校,提前学习了一下数据结构和算法,这是我找的一些视频资源,分享给大家! 分别是 慕课网 玩转算法与数据结构.慕课网 玩转算法面试.慕课网 玩转数据结构 从 ...
- Node.js核心模块-http
通过node中的http模块可以创建编写服务器 引入 const http = require('http') http举例使用: const http = require('http') //引入 ...
- 安装JumpServer到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:JumpServer-1.4.8 硬件要求:最低2核4GB 官方文档:https://docs. ...
- 【优惠&正版】超级硬盘数据恢复软件(SuperRecovery)7.0正版注册码(39元一机终身授权,支持最新版)
[优惠&正版]超级硬盘数据恢复软件(SuperRecovery)7.0正版注册码(39元一机终身授权,支持最新版) 这个软件的数据恢复效果非常好,在全世界数据恢复软件内是数一数二的. 下载地址 ...
- 解决问题:当redis服务端断开的时候`进程会崩溃(转载6哥笔记)
package main import ( "fmt" "github.com/astaxie/beego/logs" "github.com/gar ...
- Exec msdb.dbo.sp_send_dbmail 参数详解(SQL Server 存储过程发邮件)
转载oriency755 发布于2012-12-04 11:34:45 阅读数 6870 收藏 sp_send_dbmail [ [ @profile_name = ] 'profile_name ...
- 史上最深入浅出的IT术语解读
假设你是个妹子,你有一位男朋友,与此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以甩了现任男友,另外一位马上就能补上.这是冷备份. 假设你是个妹子,同时和两位男性在交往,两位都是你男朋 ...
- java中数据类型转换注意事项
1.byte.short.char这三种类型互相做数学运算时都会先提升为int类型后再做运算 char a = 'A'; short b = 1; int num = a + b;//a和b在做运算前 ...
- 0级搭建类013-CentOS 8.x 安装
CentOS 8 操作系统安装
- poj1141题解
题意 空序列是规则序列:用小括号(或者方括号)把一个规则序列括起来依然是规则序列:两个规则序列并列在一起仍然是规则序列. 给出一个括号字符串S,求一个规则序列ANS,满足S是ANS的子序列且ans尽可 ...