ABC459
今天只写到D题,但是我还是来写题解了~ A和B感觉没什么好写的,略了。 C 题意 给你N个格子,进行Q次操作 1.在第x个格子里面加1,如果每个格子都大于1,每个格子都需要减去1 2.查询有几个格子大于x 思路 刚开始想着直接暴力,但是一看范围,嗯100%超时 每次所有格子大于1的时候都减掉1,如果暴力遍历所有格子好麻烦,那么!我们干脆不要减了,记录下需要减的次数cnt 在查询x的时候,因为我们没有给每个格子减cnt,所以我们需要给x加上tar是我们最后得出需要查询的值$tar=cnt+x$ 解决了减掉1的麻烦,还有什么麻烦呢?有没有感觉查询大于tar如果每次都遍历一次好麻烦,那么!如何快速的找到几个格子大于tar呢?我们直接开一个数组S[i]来记录累计次数>=i 的单元格数量,现在我们查询只要输出S[tar]即可 好了,问题又来了,我们如何看是否需要cnt++(所有格子减1),其实思考完上面,这个解决非常简单,只有当所有单元格的次数都大于cnt*的时候,我们才要减掉1,我们已经记录了次数数组S,所以只要$S[cnt+1]==n$ 我们就需要cnt++ 代码 1234567...
图论整合
图的储存 1.邻接矩阵 使用条件:适合点数比较少的,注意处理重边时需取 $\min$。 1234567891011121314const int MAXN = 1005; // 最大顶点数const int INF = 0x3f3f3f3f; // 无穷大int g[MAXN][MAXN]; // g[u][v] 存储 u 到 v 的边权int n, m; // n个点,m条边int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; g[u][v]=min( g[u][v], w ); // 防止重边,取最小权 g[v][u]=min( g[v][u], w );// 如果是无向图,加上这一行 } return 0;} P2245 星际导航 - 洛谷 2.邻接表 适合大部分场景,简...
ABC458
今天写到E题,来写个小小题解吧! A 题意 给你一个字符串s,删除前面n个和后面n个字母,然后输出 思路 使用substr进行截取 代码 1234567891011void solve(){ string s; cin>>s; int n; cin>>n; s=s.substr(n); int len=s.size(); s=s.substr(0,len-n); cout<<s<<"\n";} B 题意 给你一个二维数组,问每一个单元格的相邻的单元格数 思路 超出范围的不算,我们可以假设都为4,然后如果有在边上的就剪掉 代码 123456789101112131415161718void solve(){ int n,m; cin>>n>>m; for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) {...
ABC457
比赛时写到D题,比赛后补完了,记录一下第一次补完,以及第一次写题解 A 题意 给你一个序列A,和下标x, 问第x个元素是多少 思路 直接输出Ax,注意下标从1开始 代码 12345678910void solve(){ int n; cin>>n; vector<int> a(n+1); for(int i=1;i<=n;++i) cin>>a[i]; int x; cin>>x; cout<<a[x]<<'\n';} B 题意 给你N个长度不一样的序列A,和下标x,y,问Ax,y是多少 思路 使用vector的动态数组,注意x和y下标都从1开始 代码 1234567891011121314151617181920void solve(){ int n; cin>>n; vector<int> a[n+1]; for(int i=1;i<=n;++i) ...
