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\)个人,每个人只能跳一种圆形舞 ...
随机推荐
- composer封装dd函数
1.安装composer,本人用的phpstudy,打开php扩展php_openssl 2.切换到www目录下 cmd 命令 composer 第一个就是我们要找的 3.运行composer req ...
- Count the Colors ZOJ - 1610 区间颜色覆盖
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> ...
- 每隔n步循环删除,返回最后一个元素
题目:有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置.以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0-& ...
- hibernate.exception.GenericJDBCException: could not extract ResultSet 解决办法
这句话翻译过来就是无法提取ResultSet 我在联查表的视图的时候发现的问题,明明之前好好的 那么你就得想想了 你再把错误信息往上翻翻,能不能看到 no viable alternative a ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- Java第四节课总结
动手动脑1:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法.Foo obj1=new Foo()在此处调用应增加参数. 动手动脑2:静态初始化块只执行一次.创建子类型的对象时,也会导 ...
- [Java]对double变量进行四舍五入,并保留小数点后位数
1.功能 将double类型变量进行四舍五入,并保留小数点后位数 2.代码 import java.math.BigDecimal; import java.math.RoundingMode; im ...
- 关于Hosts与network的异同之处
1.hosts文件,路径:/etc/hosts,此文间是在网络上使用的,用于解析计算机名称和IP地址的映射关系,功能相当于windows下面的c:\windows\system32\drivers\e ...
- 使用IntersectionObserver制作滚动动画以及其他记录
前言 最近在重做公司项目的主页,正好新来了个UI,整个都重新设计了一下,动画还挺多的.我之前没有怎么玩过这些,踩了挺多坑,最后找到了目前而言最合适的方法,现在做一个记录. 需要把原来的主页从项目中抽出 ...