D - Trophy

题目大意

有一个游戏,由NNN个关卡组成。第iii个关卡由一个数对(Ai,Bi)(A_i,B_i)(Ai​,Bi​)组成。

要通过一个关卡,你必须先花AiA_iAi​的时间看一次介绍。然后,用BiB_iBi​的时间打通这个关卡。若想多次通过同一个关卡,则第一次需要看介绍,后面无需再看(即如果想打通第iii关NNN次,则所需时间为Ai+N×BiA_i+N\times B_iAi​+N×Bi​)。

开始时,只有第一关被解锁。当你每打通一关,其下一关会自动解锁(最后一关除外)。求总共打通XXX关的最少时间(重复通关也算)。

1≤N≤2×1051\le N\le 2\times 10^51≤N≤2×105
1≤Ai,Bi≤1091\le A_i,B_i\le 10^91≤Ai​,Bi​≤109
1≤X≤N1\le X\le N1≤X≤N

输入格式

NXN~XN X
A1B1A_1~B_1A1​ B1​
⋮\vdots⋮
ANBNA_N~B_NAN​ BN​

输出格式

输出答案。

样例

略,请自行前往AtCoder查看。

分析

仔细想想会发现,通过的方式都是先不重复通过某一关前所有关卡,再通过这一关一定次数,最终达到正好XXX次。因此,我们利用前缀和,依次枚举每个关卡,最终时间复杂度可达O(n)\mathcal O(n)O(n)。

代码

#include <cstdio>
#define INF 0x7FFFFFFFFFFFFFFFLL
using namespace std;int main()
{int n, x;scanf("%d%d", &n, &x);if(x < n) n = x;long long s = 0LL, ans = INF, cur;for(int i=1; i<=n; i++){int a, b;scanf("%d%d", &a, &b);if((cur = (s += a + b) + (long long)(x - i) * b) < ans)ans = cur;}printf("%lld\n", ans);return 0;
}

E - Packing Potatoes

题目大意

1010010^{100}10100个土豆排成一列。它们的重量分别是W0,W1,…,WN−1,W0,…W_0,W_1,\dots,W_{N-1},W_0,\dotsW0​,W1​,…,WN−1​,W0​,…,即第iii个土豆的重量是WimodNW_{i\bmod N}WimodN​(i=0,1,2,…i=0,1,2,\dotsi=0,1,2,…)。

Takahashi会往一个盒子里依次放入每个土豆,当放入的土豆总重量≥X~\ge X ≥X的时候他会换一个新盒子。

给定QQQ个询问。第iii个询问:给定整数KiK_iKi​,求第KiK_iKi​个盒子中土豆的个数

1≤N,Q≤2×1051\le N,Q\le 2\times 10^51≤N,Q≤2×105
1≤X,Wi≤1091\le X,W_i\le 10^91≤X,Wi​≤109
1≤Ki≤10121\le K_i\le 10^{12}1≤Ki​≤1012

输入格式

NQXN~Q~XN Q X
W0…WN−1W_0~\dots~W_{N-1}W0​ … WN−1​
K1K_1K1​
⋮\vdots⋮
KQK_QKQ​

输出格式

输出QQQ行,第iii行是第iii个询问的答案。

样例

略,请自行前往AtCoder查看。

分析

周期问题。

代码

#include <cstdio>
#include <vector>
#define maxn 200005
using namespace std;using LL = long long;
int cnt[maxn], ord[maxn], w[maxn << 1];template <typename T>
inline T read()
{char c;while((c = getchar()) < '0' || c > '9');T res = c ^ 48;while((c = getchar()) >= '0' && c <= '9')res = (res << T(3)) + (res << T(1)) + (c ^ 48);return res;
}inline void print(int x)
{if(x > 9) print(x / 10);putchar(x % 10 ^ 48);
}inline void println(int x)
{print(x);putchar('\n');
}int main()
{int n = read<int>(), q = read<int>(), x = read<int>();LL sum = 0LL;for(int i=0; i<n; i++)sum += w[i + n] = w[i] = read<int>();int fill = x / sum * n;for(int i=0; i<n; i++)cnt[i] = fill, ord[i] = -1;x %= sum;for(int i=0, j=0, s=0; i<n; i++){if(j < i) j = i, s = 0;while(s < x){s += w[j];j += 1;}cnt[i] += j - i;s -= w[i];}vector<int> path;int loop = -1;for(int u=0, k=0; ; k++){if(ord[u] != -1){loop = k - ord[u];break;}ord[u] = k;path.push_back(u);(u += cnt[u]) %= n;}int non_loop = path.size() - loop;while(q--){LL k = read<LL>();println(cnt[path[--k < non_loop? k:non_loop + (k - non_loop) % loop]]);}return 0;
}

F - Main Street

WJ...


G - Triangle

题目大意

给定一张由NNN个点组成的简单无向图GGG和它的邻接矩阵AAA。

什么是邻接矩阵

  • 邻接矩阵,顾名思义,即表示图中每两点之间关系的矩阵。
  • 如本题中Ai,jA_{i,j}Ai,j​表示i,ji,ji,j两点之间是否有边。Ai,j=0A_{i,j}=0Ai,j​=0表示无边,111表示有边。
  • 一般来说,对于任意简单无向图,Ai,i=0A_{i,i}=0Ai,i​=0,Ai,j=Aj,iA_{i,j}=A_{j,i}Ai,j​=Aj,i​ (i≠ji\ne ji=j)。

求数对(i,j,k)(i,j,k)(i,j,k)的个数,使得:

  • 1≤i<j<k≤N1\le i<j<k\le N1≤i<j<k≤N
  • (i,j,k)(i,j,k)(i,j,k)三个点在图中组成一个三角形,即i,j,ki,j,ki,j,k中任意两点之间有一条连边。

3≤N≤30003\le N\le 30003≤N≤3000

输入格式

NNN
A1,1A1,2…A1,NA_{1,1}A_{1,2}\dots A_{1,N}A1,1​A1,2​…A1,N​
A2,1A2,2…A2,NA_{2,1}A_{2,2}\dots A_{2,N}A2,1​A2,2​…A2,N​
⋮\vdots⋮
AN,1AN,2…AN,NA_{N,1}A_{N,2}\dots A_{N,N}AN,1​AN,2​…AN,N​(注意没有空格,如10110

输出格式

输出一个整数,即符合条件的数对(i,j,k)(i,j,k)(i,j,k)的个数。

样例

略,请自行前往AtCoder查看。

分析

前言

  • 个人感觉这题其实是这场比赛中最有意思的题。题目不难,但很具有研究意义。
    这里我将从各个角度分析题目,也期待大家在评论区中分享其他方法。

废话不多说,题解开始!

题目说得太啰嗦,其实不用管什么图论,可以看成是给定N×NN\times NN×N的010101矩阵AAA,求Ai,j=Ai,k=Aj,k=1A_{i,j}=A_{i,k}=A_{j,k}=1Ai,j​=Ai,k​=Aj,k​=1的(i,j,k)(i,j,k)(i,j,k)的个数。

再来看数据范围。N≤3000N\le 3000N≤3000,则O(N3)\mathcal O(N^3)O(N3)的朴素算法时间可达到T(2.7×1010)T(2.7\times 10^{10})T(2.7×1010),显然无法通过。

然而,事实并非如此。
在仔细研究后发现,时间限制为3s3\mathrm{s}3s的题目可以使用复杂度稍高的算法。
但是一般来说,极端情况下超过T(1010)T(10^{10})T(1010)的算法无法通过。
因此,也许是数据不够强吧,使用如下的优化可以恰好通过(#32949139 37764KB,2755ms37764\mathrm{KB},2755 \mathrm{ms}37764KB,2755ms):

#pragma GCC optimize("Ofast") // -Ofast 预编译优化
#include <cstdio>
#define maxn 3000 // 数组大小设置正好,减少内存占用
using namespace std;// 题目中正常的邻接矩阵
bool a[maxn][maxn];// 特殊邻接表存储,减少尝试次数
// 这里不使用vector,会拖慢速度
int G[maxn][maxn], sz[maxn];inline void print(const long long& x) // 快写-输出优化
{if(x > 9LL) print(x / 10);putchar(x % 10 ^ 48);
}int main()
{// getchar快读输入优化int n = 0; char c;while((c = getchar()) != '\n')n = (n << 3) + (n << 1) + (c ^ 48);for(int i=0; i<n; i++, getchar())for(int j=0; j<n; j++)if(getchar() == '1' && j > i) // j > i:只存一半,去掉重复a[i][j] = 1, G[i][sz[i]++] = j;// 注意答案数据类型使用long longlong long ans = 0LL;for(int v=0; v<n; ++v)for(int i=0; i<sz[v]; ++i) // 直接调取邻接表,省去不必要判断{int u = G[v][i];for(int j=0; j<sz[u]; ++j)if(a[v][G[u][j]])ans ++;}print(ans);return 0;
}

当然,这种方法并非每道题都能用,因此还是建议大家继续看正解。

正解还是基于上面的朴素算法,可看作:

  • 依次遍历Ai,j=1A_{i,j}=1Ai,j​=1的(i,j)(i,j)(i,j)(i<ji<ji<j)
  • => 将答案加上A[i]A[i]A[i]和A[j]A[j]A[j]对应位置上都是111的位置个数
  • 输出答案,除以3(去掉每个重复算的三次)

那么别的地方都没办法,只有第二步可以使用bitset并集(&)操作进行优化。此时时间复杂度为O(n3w)\mathcal O(\frac{n^3}w)O(wn3​),其中w=64w=64w=64。详见代码。

代码

#include <cstdio>
#include <bitset>
#define maxn 3000
using namespace std;bitset<maxn> a[maxn];int main()
{int n = 0; char c;while((c = getchar()) != '\n')n = (n << 3) + (n << 1) + (c ^ 48);for(int i=0; i<n; i++, getchar())for(int j=0; j<n; j++)if(getchar() == '1')a[i].set(j); // a[i][j] = 1long long ans = 0LL;for(int i=0; i+1<n; i++)for(int j=i+1; j<n; j++)if(a[i][j])ans += (a[i] & a[j]).count(); // 取交集,数1的个数printf("%lld\n", ans / 3LL);return 0;
}

AtCoder Beginner Contest 258 A~Ex 题解相关推荐

  1. AtCoder Beginner Contest 246 A~E 题解 Bishop 2

    AtCoder Beginner Contest 246 A~E 题解 A Four Points 题意 给你矩形的三个顶点,输出剩下那个 思路 把横坐标和纵坐标分开,必会存在两个相同的数,横纵坐标就 ...

  2. AtCoder Beginner Contest 252 A~G 题解

    前言 这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! ABC252 A~G [A - ASCII code](https://atco ...

  3. AtCoder Beginner Contest 196 A~E题解

    ABC196 A~E [A - Difference Max](https://atcoder.jp/contests/abc196/tasks/abc196_a) 题目大意 输入格式 输出格式 样例 ...

  4. AtCoder Beginner Contest 177 A~D 题解

    ABC177 A~D [A - Don't be late](https://atcoder.jp/contests/abc177/tasks/abc177_a) 题目大意 输入格式 输出格式 样例 ...

  5. AtCoder Beginner Contest 168 C~D题解

    ABC168 C&D [C - : (Colon)](https://atcoder.jp/contests/abc168/tasks/abc168_c) 题目大意 输入格式 输出格式 样例 ...

  6. AtCoder Beginner Contest 242 C~E 题解

    ABC242 C~E [C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c) 题目大意 输入格式 输出格式 ...

  7. AtCoder Beginner Contest 250 C~E 题解

    ABC250 C~E [C - Adjacent Swaps](https://atcoder.jp/contests/abc250/tasks/abc250_c) 题目大意 输入格式 输出格式 样例 ...

  8. AtCoder Beginner Contest 192 A~D题解

    ABC192 A~D [A - Star](https://atcoder.jp/contests/abc192/tasks/abc192_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

  9. AtCoder Beginner Contest 254 A~E 题解

    ABC254 A~E [A - Last Two Digits](https://atcoder.jp/contests/abc254/tasks/abc254_a) 题目大意 输入格式 输出格式 样 ...

  10. AtCoder Beginner Contest 205 A~E 题解

    ABC205 A~E [A - kcal](https://atcoder.jp/contests/abc205/tasks/abc205_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

最新文章

  1. ​2012年至今,细数深度学习领域这些年取得的经典成果!
  2. plsql developer导出csv乱码问题
  3. 基于SpringBoot,SpringSession和redis的会话共享
  4. 代码雨代码源复制_小程序基于Parser添加长按复制、代码高亮等功能
  5. setTimeout里如果有$(this),$(this)指的是谁?
  6. React开发中常用的工具集锦
  7. 揭秘腾讯微视人脸技术「黑科技」,基于GAN的人脸魔法特效
  8. 管程由哪三部分组成_换热器是几壳程?几管程的?
  9. Navicat 查看导出连接的密码 破解保存的密码 + 密码解密|navicat查看密码方案
  10. 学自动化测试哪个培训机构好 试听课程后就选了这个地方学习
  11. gb28181简单实现sip信令服务器(java版基于springboot):二、sip摄像头注册(信令解读)
  12. python+django+mysql图片分享平台毕业设计毕设开题报告
  13. w10恢复出厂设置_笔记本电脑w10怎么恢复出厂设置
  14. 【经济模型】CAPM模型实例验证
  15. Ubuntu安装布谷鸟沙盒
  16. 金蝶数据库(质疑)解决方法
  17. mysql 级联复制
  18. 为什么k8s天然适合微服务?
  19. 工控系统设计(八)组态功能开发
  20. 免费QQ群管助手-帮你管理QQ群

热门文章

  1. LMS Virtual.Lab二次开发:场点网格编辑(VBScript)
  2. 服务器 系统 版本查询
  3. 手机自动休眠与距离感应器失效的问题
  4. ExoPlayer播放器播放MP2音频格式视频无声音加入Ffmpeg软解码功能
  5. 如何收割暑期实习offer
  6. 浅谈个人对读书的看法
  7. 女明星对比潮人HOLD姐的妖艳妆容
  8. 一、爬虫 - 新浪爱问共享资源全下载之解决方案
  9. 服务器搭建ftp共享文件夹,设置共享文件夹或者搭建FTP服务器。
  10. linux nfs共享目录访问速度慢,linux之间共享文件夹选nfs还是选samba--