首页 > 其他分享 >ABC191 复盘

ABC191 复盘

时间:2024-04-18 11:13:45浏览次数:23  
标签:int ABC191 long v1 ans push 复盘 dis

ABC191 复盘

[ABC191C] Digital Graffiti

思路解析

求不规则图形的边数,根据题目可知多边形的内角只有 \(90^\circ\) 和 \(270^\circ\),所以只需要从四个方向扫描一遍,求出每个方向上分别有几条边即可。

code

#include<bits/stdc++.h>
using namespace std;
int n, m;
char ch[15][15];
int main() {
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> ch[i][j];
		}
	}
	int ans = 0;
	for(int i = 1; i < n; i++) {
		for(int j = 2; j <= m; j++) {
			if(ch[i][j] == '#' && ch[i + 1][j] == '.' && !(ch[i][j - 1] == '#' && ch[i + 1][j - 1] == '.')) ans++;
		}
	}
	for(int i = 1; i < n; i++) {
		for(int j = 2; j <= m; j++) {
			if(ch[i][j] == '.' && ch[i + 1][j] == '#' && !(ch[i][j - 1] == '.' && ch[i + 1][j - 1] == '#')) ans++;
		}
	}
	for(int j = 1; j < m; j++) {
		for(int i = 2; i <= n; i++) {
			if(ch[i][j] == '#' && ch[i][j + 1] == '.' && !(ch[i - 1][j] == '#' && ch[i - 1][j + 1] == '.')) ans++;
		}
	}
	for(int j = 1; j < m; j++) {
		for(int i = 2; i <= n; i++) {
			if(ch[i][j] == '.' && ch[i][j + 1] == '#' && !(ch[i - 1][j] == '.' && ch[i - 1][j + 1] == '#')) ans++;
		}
	}
	cout << ans;
	return 0;
}

[ABC191D] Circle Lattice Points

思路解析

可以根据数据范围 \(|X| \le 10^5\) 发现直接枚举两个维度肯定不行,但是我们发现可以把这个圆沿着每一条竖(或横)轴切开,然后对于每单独的一条分别统计这一条中有多少个整点,这样就可以做到 \(O(|X|)\) 完成。

注意在开方操作时会损失精度,所以可以在输入半径时先给半径加上一个很小的常数避免精度损失。

code

#include<bits/stdc++.h>
using namespace std;
#define double long double
double x, y, r;
int main() {
	cin >> x >> y >> r;
	r += 1e-14;
	long long ans = 0;
	for(int i = ceil(x - r); i <= floor(x + r); i++) {
		long long lt = (long long)ceil(y - sqrt(r * r - (x - i) * (x - i)));
		long long rt = (long long)floor(y + sqrt(r * r - (x - i) * (x - i)));
		ans += rt - lt + 1;
	}
	cout << ans;
	return 0;
}

[ABC191E] Come Back Quickly

思路解析

这题非常版,求问能否形成环,其实就是跑一遍 dijkstra,看能否再一次到达起点,若可以到达,则将答案设为第二次到达时所用的距离即可。

时间复杂度:对于每一个点都要跑一次最短路,\(O(n^2 \log n)\)。

code

#include<bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
#define fir first
#define sec second
const int N = 2e3 + 10;
int n, m, ind[N], tp[N], ans[N], dis[N];
vector< PII > g[N];
void dij(int st) {
	memset(dis, 0x3f, sizeof(dis));
	priority_queue< PII , vector< PII >, greater< PII > > q;
	q.push({0, st});
	while(!q.empty()) {
		int u = q.top().sec, d = q.top().fir; q.pop();
		for(auto it : g[u]) {
			int v = it.fir, w = it.sec;
			if(d + w < dis[v]) dis[v] = d + w, q.push({d + w, v});
		}
	}
	ans[st] = dis[st];
}
int main() {
	cin >> n >> m;
	memset(ans, 0x3f, sizeof(ans));
	for(int i = 1, u, v, w; i <= m; i++) {
		cin >> u >> v >> w;
		if(u == v) ans[u] = min(ans[u], w);
		g[u].push_back({v, w});
	}
	for(int i = 1; i <= n; i++) {
		dij(i);
	}
	for(int i = 1; i <= n; i++) {
		if(ans[i] < 1e9) cout << ans[i] << '\n';
		else cout << "-1\n";
	}
	return 0;
}

CF154C Double Profiles

思路解析

可以把题意转换成求有多少个点对 \((u,v)\) 使得两点连出的点集完全相同,这样只需要把每个点连出的点集求出来即可,如果直接用数组存肯定会超时,所以我们想把每一个与任意一点直接相连的点集进行压缩,可以想到使用字符串哈希的想法压缩一个点集。如果两点的点集哈希后相等,说明两点的点集也相等。

注意:需要特判点度为 \(0\) 的情况,以及需要分别讨论 \(i,j\) 之间有连边和没连边的情况,最后注意这题卡 map

code

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const ull p = 13;
const int N = 1e6 + 10;
int n, m, sz[N];
ull hs[N], pw[N];
signed main() {
	cin >> n >> m;
	pw[0] = 1; for(int i = 1; i <= n; i++) pw[i] = pw[i - 1] * p;
	for(int i = 1, u, v; i <= m; i++) {
		cin >> u >> v;
		sz[u]++; sz[v]++;
		hs[u] += pw[v];
		hs[v] += pw[u];
	}
	vector<ull> v, v1;
	long long ans = 0;
	for(int i = 1; i <= n; i++) {
		if(sz[i] > 0) v.push_back(hs[i]);
		else v.push_back(0);
		v1.push_back(hs[i] + pw[i]);
	}
	sort(v.begin(), v.end()); sort(v1.begin(), v1.end());
	for(int i = 0, j = i; i < v.size(); i = j) {
		j = i; while(j < v.size() && v[j] == v[i]) j++;
		ans += (long long)(j - i) * (long long)(j - i - 1) / 2;
	}
	for(int i = 0, j = i; i < v1.size(); i = j) {
		j = i; while(j < v1.size() && v1[j] == v1[i]) j++;
		ans += (long long)(j - i) * (long long)(j - i - 1) / 2;
	}
	cout << ans;
	return 0;
}

标签:int,ABC191,long,v1,ans,push,复盘,dis
From: https://www.cnblogs.com/2020luke/p/18143078

相关文章

  • ABC229 复盘
    ABC229复盘[ABC229C]Cheese思路解析题目已经告诉了你每克比萨能带来的美味度,因此直接以每克的美味度为关键字贪心即可。时间复杂度:一次排序,\(O(n\logn)\)。code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definePIIpair<longlong,longl......
  • Educational Codeforces Round 157 (Rated for Div. 2) 复盘
    又是vp的稀烂的一场。A没问题。被B一道800卡了。但是确实非常简单,就是从式子上入手,让\(|x_1-x_2|+|y_1-y_2|\)最小就可以了。所以就把两维度分开来看,这两维之间的距离是不会影响代价的,这是曼哈顿距离的特点。那么就很明显了,就是从中间分开。但是我vp的时候并没有看出来。而是......
  • ABC212 复盘
    ABC212复盘[ABC212C]MinDifference思路解析与\(a_i\)差值最小的某个\(b_j\)要么是第一个大于它的值,要么是第一个小于它的值,而这两个值都可以用二分求得,于是我们直接将\(b\)数组排序,然后对于每一个\(a_i\)都用二分找到上文提到的两个值即可。code#include<bits/std......
  • ABC211 复盘
    ABC211复盘[ABC211C]chokudai思路解析题目说的很明白,看到匹配子序列可以轻易想到是简单dp,直接做即可。时间复杂度:两个字符串两层循环,\(O(8\timesN)\)。code#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;constlonglongmod=1e9+7;stri......
  • vue3复盘学习(一)
    其实说是复盘,因为在平常的开发中因为公司一些项目和其他原因断断续续的使用了一段时间vue3,因为着急赶项目,有些知识点没有系统性学习,所以决定从今天开始一点点再学习一遍٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ哈哈!刚开始从vue2过渡到vue3的同学们其实是有些不适应的,但是随着前端框......
  • 面试复盘
    2024.02投了微软的暑期实习,3.25的时候收到了拒信,没有一个明确的反馈,总之noselected。猜测是因为:1.背景挂背景确实算不上很好2.技术挂这点可能性比较大,因为大学这几年除了学算法写大作业,在技术层面没有钻研得很深入。感觉微软和google这样的公司在招人少的情况下,会偏好有开......
  • ABC 223 复盘
    ABC223复盘[ABC223C]Doukasen思路解析根据题目可知,燃烧的总时长肯定不变,所以我们可以直接从头开始遍历找到第一根香使得烧完这根香后的时间会大于总时长的一半,然后加上剩余时间下会烧掉的长度即可。时间复杂度:一次遍历,\(O(N)\)。code#include<bits/stdc++.h>usingnames......
  • ABC221 复盘
    ABC221复盘[ABC221A]Seismicmagnitudescales思路解析数据范围\(B\leA\le10\),可以发现能直接暴力求解。注意开longlong。code//ABC221A#include<bits/stdc++.h>usingnamespacestd;inta,b;intmain(){ cin>>a>>b; a-=b; longlongans=1; for......
  • Java后端新手的第一次面试复盘
    昨天经历了第一次Java后端实习生面试,在无数次的简历投递后,很难得的一次面试机会,收获很多,也深刻感受到自己能力的不足(还需要继续沉淀半个学期),在此记录下收获和感悟,如有错误,欢迎指正!1.面试流程闲聊(5分钟):自我介绍+询问背景动机技术问答(45分钟):包括Java基础、数据库技......
  • 转盘小程序首页运营复盘记录
    转盘小程序首页运营复盘记录~今天是4月1号,距离我的转盘小程序上线也一月有余了正如大家期待的那样,是的,我的转盘小程序已经在3月份正式上线发布了,具体的时间线如下所示  *2024-03-30功能完善,增加敏感词过滤*2024-03-25功能完善,支持语音播报*2024-03-20功能完善,新增......