24/10/13 ABC375补题笔记
A
典,属于显而易见的水题,这数据范围直接暴力做就行了。
# include <bits/stdc++.h>
using namespace std;
int main (){
int n;
cin >> n;
string s;
cin >> s;
int cnt = 0;
if(n < 2) return cout << 0 << endl,0;
for(int i = 0;i < s.size()-2;i++)
{
if(s[i] == '#' && s[i+1] == '.' && s[i+2] == '#') cnt++;
}
cout << cnt << endl;
return 0;
}
B
典,这ABC这次给的分特别玄学,\(B\)题才\(150pts\),显然简单。
直接考虑记录一个\(nowx\)和\(nowy\)然后计算欧几里得距离就可以了,最后别忘了补上回去的那段路程。
code:
# include <bits/stdc++.h>
using namespace std;
int main (){
int n;
scanf("%d",&n);
double nowx = 0;
double nowy = 0;
double ret = 0;
for(int i = 0;i <= n;i++)
{
double x,y;
if(i != n)
{
cin >> x >> y;
}
else
{
x = 0,y = 0;
}
ret += sqrt((x-nowx)*(x-nowx)+(y-nowy)*(y-nowy));
nowx = x,nowy = y;
}
printf("%.12f",ret);
return 0;
}
C
好题,这题出的很牛逼。
首先你直接暴力的去做的话复杂度显然是\(O(n^3)\),所以你要考虑优化这个题。
观察整个题目的话你会发现一个性质,题目中不是要求你的\((x,y)\)要处在\(i \to i+N-1\)这个范围内吗,那么他被改变的位置是\((y,x+N-1)\)范围内对吧,也就是说,\((y,x+N-1)\)这个小方格也要在\(i \to i+N-1\)这个范围内。
那么原来一个方格的节点被映射之后会变成什么样子呢?考虑该节点变化的过程,一开始是\((x,y)\),下一个是\((y,x+N-1)\),再下一个是\((x+N-1,y+N-1)\),next is \((y+N-1,x)\),在下一个就是\((x,y)\),这时候你发现,他每四个就会变化回原来的,所以对于一个方格它的覆盖次数如果超过\(4\)次的话,可以给他优化成\(\mod 4\)的结果,那么你就可以少做一个\(N\)次的循环,而优化成\(\mod 4\)的结果,最多不会超过\(4\)次,故这个时候复杂度就是\(O(4N^2)\),近乎于\(O(N^2)\),那么你考虑这个变化的个数有多少次呢?显然是\(\min(x,x+N-1,y,y+N-1)\),那么直接对这玩意进行取模,然后暴力模拟即可。
代码老好做了,直接粘一个啦:
# include <bits/stdc++.h>
using namespace std;
const int N = 3010;
char a[N][N],b[N][N];
int main (){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> (a[i]+1);
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
int d = min({i,n-i+1,j,n-j+1});
int nowx = i,nowy = j;
for(int x = 0;x < d%4;x++)
{
int tmp = nowx;
nowx = nowy;
nowy = n+1-tmp;
}
b[nowx][nowy] = a[i][j];
}
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
cout << b[i][j];
}
cout << endl;
}
return 0;
}
D
直接考虑做每个字符的个数前缀和,然后寻找两个相同字符差的字符个数,然后再乘上这两个字符之间的距离,累加就是答案。
很简单的思路,就不赘述了。
F
好题,真的会做。
这题很典,跟JSOI2008 星球大战几乎思路真的是一模一样,你考虑题目中的删边操作,如果你正着顺序去做这个题的话,肯定是很难处理的,所以你考虑把问题离线下来,倒着处理所有问题,将删边改为加边。
至于上面做法的正确性,我们简单给出一个我自己的较为好理解的思路:假设最后将所有的边全部都删除完了,那么这个时候,你的最后一次操作在没删除之前,整个图相当于还拥有一条边,倒数第二个操作在操作之前,整个图还拥有\(2\)条边\(.....\),就这样,我们不如将每个问题记录一个数组,后面倒序的去做这个问题,具体的操作其实看代码会更好理解一些。
接下来你考虑如何处理添加这条边,对于添加这条边,他的最短路会出现下面三种情况:
设此时要求的两个节点分别为\(x\)与\(y\),这条边的起点为\(a\),终点\(b\)。
- 从\(x\)到\(y\)的最短路不经过这条边。
- 从\(x\)这个点到\(a\),再走\(a\)到\(b\)这个边,再从\(b\)走到\(y\)。
- 从\(x\)这个点到\(b\),再走\(b\)到\(a\)这个边,再从\(a\)走到\(x\)。
那么只需要把这三个取\(\min\)就可以了。
# include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 310,M = 2e5+10;
int dis[N*2][N*2];
const int inf = 1e18;
int a[M],b[M],c[M],x[M];
int vis[M];
int ans[M];
int y[M],op[M];
signed main (){
int n,m,q;
scanf("%lld%lld%lld",&n,&m,&q);
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(i == j) dis[i][j] = 0;
else dis[i][j] = inf;
}
}
for(int i = 1;i <= m;i++)
{
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
}
for(int i = 1;i <= q;i++)
{
scanf("%lld%lld",&op[i],&x[i]);
if(op[i] == 2)
{
scanf("%lld",&y[i]);
}
else
{
vis[x[i]] = 1;
}
}
for(int i = 1;i <= m;i++)
{
if(!vis[i])
{
dis[a[i]][b[i]] = dis[b[i]][a[i]] = c[i];
}
}
for(int k = 1;k <= n;k++)
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
// cout << "true" << endl;
for(int i = q;i >= 1;i--)
{
// cout << i << endl;
if(op[i] == 2)
{
// cout << dis[x[i]][]
// cout << "qwq" << endl;
ans[i] = dis[x[i]][y[i]];
// cout << "qwq" << endl;
}
else
{
// cout << "true" <<endl;
for(int j = 1;j <= n;j++)
{
for(int k = 1;k <= n;k++)
{
// cout << "k : " << k << endl;
// cout << j << " " << k << endl;
dis[j][k] = min(dis[j][k],min(dis[j][a[x[i]]]+dis[b[x[i]]][k]+c[x[i]],dis[j][b[x[i]]]+dis[a[x[i]]][k]+c[x[i]]));
// cout << dis[j][k] << endl;
}
}
/*
for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)
{
dis[j][k]=min(dis[j][k],min(dis[j][a[x[i]]]+dis[b[x[i]]][k]+c[x[i]],dis[j][b[x[i]]]+dis[a[x[i]]][k]+c[x[i]]));
}
*/
// cout << "true" << endl;
}
// cout << "true" << endl;
}
// cout << "true" << endl;
for(int i = 1;i <= q;i++)
{
if(op[i] == 2)
{
if(ans[i] == inf)
{
printf("-1\n");
}
else
{
printf("%lld\n",ans[i]);
}
}
}
// cout << "true2" << endl;
return 0;
}
一些感悟:
我出了一个很有意思的题,留给自己做做。
有一颗\(n\)个节点\(n-1\)条边的树,拥有\(q\)个询问,每个询问可能有以下两种操作:
1 x y
表示删除这颗树上\(x\)节点与\(y\)节点连的一条边。2 x y
查询此时树上\(x\)点与\(y\)点的最近公共祖先。
其中\(q \le 2*10^4,n \le 1000\)。
思路其实很简单,跟上面的操作一样,然后对于新加入的这个边,考虑这两个点和其他点的LCA,直接倍增搞一下就可以了吧。
24/10/13 ABC375补题笔记的更多相关文章
- cordforce Educational Codeforces Round 47 补题笔记 <未完>
题目链接 http://codeforces.com/contest/1009 A. Game Shopping 直接模拟即可,用了一个队列来存储账单 #include <iostream> ...
- Educational Codeforces Round 24 CF 818 A-G 补题
6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...
- QFNU-ACM 2021.10.09 Rating补题
A - A CodeForces - 478A 注意点: 和为0时要特判一下. 代码: #include<bits/stdc++.h> using namespace std; int m ...
- 2020.10.30--vj个人赛补题
D - D CodeForces - 743A Vladik is a competitive programmer. This year he is going to win the Interna ...
- 2020.10.16--vj个人赛补题
D - Drinks Choosing Old timers of Summer Informatics School can remember previous camps in which eac ...
- 2020.10.9--vj个人赛补题
B - A Tide of Riverscape 题意:给出一组字符串,由'0','1',' . '组成,' . '可以换成 0或1,判断第 i 个和第 i+p 个字符是否可以不相等,如果可以则输出 ...
- 2020.10.23-vj个人赛补题
B - B Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s consistin ...
- 二级C语言真题笔记
二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() { short i ...
- 2020.12.20vj补题
A - Insomnia cure 题意:一共s只龙,每隔k,l,m,n只龙就会受伤,问这s只龙有多少龙是受伤的 思路:看起来题目范围并不是很多,直接进行循环判断 代码: 1 #include< ...
- SAM 做题笔记(各种技巧,持续更新,SA)
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...
随机推荐
- [学习笔记] LCA - 图论
[NOIP2013 提高组] 货车运输 最大生成树+LCA+倍增 好家伙,这道题我写了一个晚上,调了两个晚上,对于这道题我颇有感触.但这道题确实好,实实在在的蓝题,让我发现了许多关于LCA的问题. 首 ...
- Camera | 3.瑞芯微平台MIPI摄像头常用调试命令
瑞芯微专栏 前面2篇我们讲解了camera的一些基础概念和知识. 本文主要讲述在瑞芯微平台上摄像头开发常用的调试命令. 0.环境 soc : rk3568 board: EVB1-DDR4-V10 软 ...
- armbian挂载sd卡记录
mkdir -p /mnt/mmctouch /etc/init.d/mount.shvim /etc/init.d/mount.sh内容见图mount /dev/mmcblk1p1 /mnt/mm ...
- [postgres]使用pgbench进行基准测试
前言 pgbench是一种在postgres上进行基准测试的简单程序,一般安装后就会自带.pgbench可以再并发的数据库绘画中一遍遍地进行相同序列的SQL语句,并且计算平均事务率. 测试准备 既然要 ...
- ICMAN触摸滑条滚轮方案
ICMAN触摸滑条滚轮调光是一种利用触摸技术实现的调光控制方式,是一种更简单.直观且节能的调光方式,有效改善了用户的照明体验,并在智能家居和节能照明领域发挥着重要作用. 基于厦门晶尊微电子(ICMAN ...
- Innodb对表加锁的过程分析
本节我们通过一些具体的案例来分析Innodb对表上锁的过程.具体场景如下图所示. 在这里我们将语句分为4类:普通select(快照读).锁定读.半一致性读 和 insert语句. 普通读 普通的sel ...
- css+div实现各种常见边框
css+div实现各种常见边框 一.效果图如下 二.实现代码 div { width: 120px; height: 100px; margin: 10px; float: left; text-al ...
- CCIA数安委等组织发起“个人信息保护影响评估专题工作”,合合信息首批入选试点
近期,"个人信息保护影响评估专题工作"(简称"PIA专题工作")试点评估结果正式发布.PIA专题工作组由中国电子技术标准化研究院.中国信息通信院等单位的法律与技 ...
- 常见的 HTTP Status Codes
前言 网页开发做久了, 自然而且会接触到许多 status code. 这篇列出一些常见的 status code. 初学者可以把它们学上来. 真的很常见哦. 参考 Wikipedia – List ...
- Azure 入门系列 (第五篇 Azure Storage)
本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...