ABC291题解(D-G)
ABC291
D - Flip Cards
Solution:
考虑DP,定义状态\(F_{i,0}\)为第\(i\)张卡片正面朝上的方案数,\(F_{i,1}\)为第\(i\)张卡片背面朝上的方案数,每次check是否相同然后转移即可
int f[N][2];
int a[N];
int b[N];
void solve(){
int n;
cin >> n;
for (int i = 1;i <= n;i ++) {
cin >> a[i] >> b[i];
}
f[1][0] = 1;
f[1][1] = 1;
for (int i = 2;i <= n;i ++) {
f[i][0] = (f[i - 1][0] * (a[i - 1] != a[i]) + f[i - 1][1] * (b[i - 1] != a[i])) % mod;
f[i][1] = (f[i - 1][0] * (a[i - 1] != b[i]) + f[i - 1][1] * (b[i - 1] != b[i])) % mod;
}
cout << (f[n][0] + f[n][1]) % mod << endl;
}
E - Find Permutation
Solution:
考虑到题目所说的大小关系,可以联系到是一个有向图的形式,如果\(a\)和\(b\)有一条有向边,则含义为\(a\leqslant b\),所以我们可以发现,其实题目只是求一个拓扑序,观察第二个样例,我们还可以发现不能同时有多个点在拓扑序的同一时刻入队,所以就构造完了。
vector<int> G[N];
queue<int> qq;
int c[N];
int d[N];
int n, m;
vector <int > ans;
int f[N];
bool topsort(){
int z=0;
for (int i=1;i<=n;i++){
if (!d[i])qq.push(i),z++,ans.push_back(i);
}
while (!qq.empty()){
if(qq.size() != 1) {
return false;
}
int t = qq.front();
qq.pop();
for (int i : G[t]){
d[i]--;
if (!d[i]){
qq.push(i);
ans.push_back(i);
z++;
}
}
}
return z==n;
}
void solve(){
cin >> n >> m;
map<PII,bool> mp;
for (int i = 1;i <= m;i ++) {
int x,y;
cin >> x >> y;
d[y]++;
G[x].push_back(y);
}
if(topsort()) {
cout << "Yes" << endl;
int now = 1;
vector<int> last(n + 1);
for (int i : ans) {last[i] = now++;}
for (int i = 1;i <= n;i ++) cout << last[i] << ' '; cout << endl;
}
else cout << "No" << endl;
}
F-Teleporter and Closed off
Solution:
观察到\(m \leqslant 10\),且题目要求的是不经过一个点的时候的最短路,所以对于不经过的点,我们只需要枚举其前面最多\(10\)个位置,他们是需要"跨过"当前不能经过的点的,所以DP先处理出来两个最短路,一个从\(1\)到后面的点的,一个从后面的点到\(n\)的最短路,枚举完点就可以很快的算出答案了。
int f[N][2];
void solve(){
int n , m;
cin >> n >> m;
vector<string> s(n + 1);
for (int i = 2;i <= n;i ++) f[i][1] = 1e18;
for (int i = 1;i <= n - 1;i ++) f[i][0] = 1e18;
for (int i = 1;i <= n;i ++) {
cin >> s[i];
s[i] = " " + s[i];
for (int j = 1;j <= m && i + j <= n;j ++) {
if(s[i][j] == '1') f[i + j][1] = min(f[i + j][1], f[i][1] + 1);
}
}
for (int i = n;i >= 1;i --) {
for (int j = 1;j <= m && i + j <= n;j ++) {
if(s[i][j] == '1') {
f[i][0] = min(f[i][0],f[i + j][0] + 1);
}
}
}
for (int i = 2;i <= n - 1;i ++) {
int ans = 1e18;
for (int j = max(1ll,i + 1 - m);j <= i - 1;j ++) {
for (int k = i + 1 - j;k <= min(m , n);k ++) {
if(s[j][k] == '1') {
ans = min(ans , f[j][1] + f[j + k][0] + 1);
}
}
}
if(ans != 1e18)
cout << ans << ' ';
else
cout << -1 << ' ';
}
}
G - OR Sum
Solution:
暴力的复杂度是\(O(N^{2})\),所以考虑优化。复杂度来自两个地方,一个是枚举循环的情况,\(O(N)\),还有是扫描一遍算或的值,\(O(N)\),前一个循环不好优化,因为每个数都很小,所以考虑优化后面这一个运算的复杂度。首先我们可以对每位进行分析,\(A|B = A + B - A \& B\),这样子拆开式子后,我们就可以发现,前两项会是一个定值,就是所有元素的和,将\(B\)倒序之后,后面一项,对于每一位的情况就是\(\sum_{i = 1}^{n}A_{i + k} \& B_{n - i}\),显然是个卷积的形式,二进制最多五位,做五次卷积分别算贡献就做出来了。
void solve(){
int n;
cin >> n;
int s = 0;
for (int i = 1;i <= n;i ++) cin >> A[i], s += A[i];
for (int i = 1;i <= n;i ++) cin >> B[i], s += B[i];
for (int c = 0;c < 5;c ++) {
memset(f,0,sizeof(f));memset(g,0,sizeof(g));
for (int i = 0;i < n;i ++) {
f[i] = f[i + n] = (A[i + 1] >> c) & 1;
g[i] = (B[n - i] >> c) & 1;
}
poly_mul(f,g,2 * n);
for (int i = 0;i < n;i ++) {
ans[i] += f[n + i] * (1ll << c);
}
}
int now = -1;
for (int i = 0;i < n;i ++) {
now = max(now , s - ans[i]);
}
cout << now << endl;
}
ABC291题解(D-G)的更多相关文章
- 【题解】G.Graph(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
题目链接G题 题意 序列 \(a_1,a_2,⋯,a_n\) 是一个排列, 当且仅当它含有 1 到 n 的所有整数. 排列 \(a_1,a_2,⋯,a_n\) 是一个有向图的拓扑排序,当且仅当对于每条 ...
- Codeforces 549G Happy Line[问题转换 sort]
G. Happy Line time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- hdu 5407
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5407 题意:给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...,C(n,n)) 根 ...
- 「2017 Multi-University Training Contest 2」2017多校训练2
1001 Is Derek lying 题目链接 HDU6045 Is Derek lying? 给出两个人选择题的回答,问得分分别为x和y是否可能.(\(1\le N \le 80000,0\le ...
- Wannafly 22A
题解 另g = gcd(a1,a2,a3....) 那么k * g % m的方案书就是答案 这个式子子显然是有循环节的 x * g = 0 mod m ,x * g + y * m = 0 exgcd ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders 数学 构造
D. Artsem and Saunders 题目连接: http://codeforces.com/contest/765/problem/D Description Artsem has a fr ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造
A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...
- 备战省赛组队训练赛第十七场(UPC)
upc:传送门 A: 题解[1] G: 题解[1] D,G,H,J,L 题解 by 鲁东大学
- ABC260 作战总结
ABC260 作战总结 今后开始写一些模拟赛外的其他比赛的总结(也许有题解?). 开场点到另一场\(\text{ARC}\)去了,耽误了点时间,切完前四题发现已经过了\(37\)分钟了,看来自己读题+ ...
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
随机推荐
- bzoj 3532
很好的一道题,对理解最小割有很大帮助 首先,不难发现本题与网络流24题中的某一道很类似,我们可以先跑一次dp求出每个节点的LIS,然后拆点,拆出的两点之间连流量为删除的代价的边,剩下的点之间按dp的转 ...
- jquery.easyui.min.js:12401 Uncaught TypeError: Cannot read property 'combo' of undefined jquery.easyui.min.js:12401
踩坑中成长! jquery1.4.1升级到1.4.3 点击添加报错. 一步步调试js,发现是combox使用问题. 前端报错,未声明,js是easyui的所以只有jsp和js用法问题.看了官方用法,瞬 ...
- linux命令关机和重启命令及文件查找管道符用法linux grep
关机和重启命令 Shutdown Reboot Halt poweroff grep和管道符 昨天的时候 leader 给我出了道问题: 找出文件夹下包含 "aaa" 同时不包含 ...
- Vue3 + echarts 统一封装
1. 新建 echartsLib.js 文件,统一导入需要的组件 import * as echarts from "echarts/core"; import { SVGRend ...
- Kafka相关问题
Kafka有哪几个部分组成 生产者.消费者.topic.group.partition kafka的group1)定义:即消费者组是 Kafka 提供的可扩展且具有容错性的消费者机制.在Kafka中, ...
- 自己制作Switch大气层SDFile
️SWITCH SDFILE 每次吃灰之后,就想更新下系统,每次都得研究一遍... 决定好好研究下,发现不是很繁琐. SDFile有哪些文件组成! Atmosphere 任天堂Switch定制固件 H ...
- AT212 P-CASカードと高橋君
题目描述 高桥君为了准备即将到来的7月27日土用丑日,打算邮购一些高级鳗鱼食材,通过网上银行来支付. 高桥君使用的银行卡背面有下图所示的9×9密码表.支付的时候从表中某一位置开始根据指定的方向连续读4 ...
- Unity 转小游戏
填写appid 和游戏资源位置 在导出的项目里可以修改游戏资源位置 两个目录 minigame 是小程序打开的目录 webgl 是要下载的的资源 下载一个http 服务器就有了 和JS交互 大部分js ...
- wrangler 13 mwz 脱浆记录
100度水泡了1个小时,一点没缩 70度水泡了3个小时,一点没缩 随后绝望,放洗衣机里洗了20min,缩了2cm 想再接再厉,放洗衣机30min,没缩 放外面晾干,看晾干以后多长吧 --------- ...
- Pytorch slp singleLayerPerceptron 单层感知机
单层感知机 \[\begin{aligned} & y = XW + b \\ & y = \sum x_i*w_i+b\\ \end{aligned} \] Derivative \ ...