总结

本场比赛很不负责对待

暴力都没怎么打

一个半小时后才开始打题

很悲剧的只有 \(23+11+36=70\) 分

\(T1\) 4300. 装饰大楼

题目

思路

很无聊的找规律题

考场弃疗

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL; const int N = 1e6 + 5;
int n , a[N] , s , x , t;
LL ans; int main()
{
freopen("building.in" , "r" , stdin);
freopen("building.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i < n; i++) scanf("%d" , &a[i]);
for(register int i = 1; i < n; i++)
{
ans += (LL)s + 1;
if (a[i] <= s + 1) ans--;
s = max(s , a[i]);
}
ans += (LL)s + 1;
s = 0;
for(register int i = 1; i < n; i++)
{
if (a[i] - x > 2)
{
printf("0");
return 0;
}
else if (a[i] - x == 2)
{
s++;
if (s == 1) t = i;
}
if (s >= 2)
{
printf("0");
return 0;
}
x = max(x , a[i]);
}
if (s == 1)
{
x = s = 0;
for(register int i = 1; i < t; i++)
if (a[i] > x) x = a[i] , s = i;
ans = t - s;
}
printf("%lld" , ans);
}

\(T2\) 4301. 备用钥匙

题目

思路

奇怪的 \(dp\) 题

很容易想到按时间排序

相邻两个时间分离开和回来四种情况讨论

不用钥匙的直接加,记到 \(ans\) 里

单独用一个钥匙的另开数组记需要钥匙者产生的贡献,记到 \(c\) 里

两个都需要就弄出链来并算给他们两把钥匙能获得的贡献,记到 \(se\) 里

然后调整 \(dp\) 的顺序

链上的连在一起

设 \(f_{i,j}\) 表示前 \(1..i\) 中选 \(j\) 个人且强行让 \(i\) 也持有钥匙的最大答案, \(g_{i,j}=max_{k=1}^{i} f_{k,j}\)

那么转移:\(f_{i,j}=max{f_{i-1,j-1}+se[i],g[i-2][j-1]}+c[i]\)

最终 \(ans=ans+g[n][k]\)

\(Code\)

#include<cstdio>
#include<algorithm>
using namespace std; const int N = 2005;
int n , m , k , tot , s[N] , se[N] , sz[N] , c[N] , ans , pre[N] , nxt[N] , f[N][N] , g[N][N] , vis[N] , b[N]; struct node{
int id , t , s;
}a[2 * N]; inline bool cmp(node x , node y){return x.t < y.t;} int main()
{
freopen("key.in" , "r" , stdin);
freopen("key.out" , "w" , stdout);
scanf("%d%d%d" , &n , &m , &k);
int p , q;
for(register int i = 1; i <= n; i++)
{
scanf("%d%d" , &p , &q);
a[++tot].id = i , a[tot].t = p , a[tot].s = 1;
a[++tot].id = i , a[tot].t = q , a[tot].s = 2;
}
sort(a + 1 , a + tot + 1 , cmp);
ans = a[1].t + m - a[tot].t; for(register int i = 1; i <= tot; i++)
{
if (a[i].s == 2 && a[i + 1].s == 1) ans += a[i + 1].t - a[i].t;
if (a[i].id == a[i + 1].id) s[a[i].id] += a[i + 1].t - a[i].t;
else if (a[i].s == 1 && a[i + 1].s == 1) s[a[i].id] += a[i + 1].t - a[i].t;
else if (a[i].s == 2 && a[i - 1].s == 2) s[a[i].id] += a[i].t - a[i - 1].t;
else if (a[i].s == 1 && a[i + 1].s == 2)
{
pre[a[i + 1].id] = a[i].id;
nxt[a[i].id] = a[i + 1].id;
sz[a[i + 1].id] = a[i + 1].t - a[i].t;
}
} int to;
tot = 0;
for(register int i = 1; i <= n; i++)
if (!vis[i])
{
to = i;
while (pre[to]) to = pre[to];
while (to) b[++tot] = to , vis[to] = 1 , to = nxt[to];
} for(register int i = 1; i <= n; i++) c[i] = s[b[i]] , se[i] = sz[b[i]];
f[1][1] = g[1][1] = c[1];
for(register int i = 2; i <= n; i++)
{
g[i][1] = max(g[i - 1][1] , f[i][1] = c[i]);
for(register int j = 2; j <= k; j++)
g[i][j] = max(g[i - 1][j] , f[i][j] = max(f[i - 1][j - 1] + se[i] , g[i - 2][j - 1]) + c[i]);
} printf("%d" , ans + g[n][k]);
}

\(T3\) 4302. IOIOI卡片占卜

题目

思路

牛逼得不得了的操作:记给定的序列 \(I\) 为 \(1\),\(O\) 为 \(0\)。让这个序列相邻两个异或

于是区间 \([l..r]\) 翻转变为异或单点 \(l-1\) 和 \(r\) (亲手模拟看看)

异或后的序列只剩 \(4\) 个 \(1\),让这四个 \(1\) 变 \(0\) 的最少代价即为答案

那么我们把 \(l-1\) 和 \(r\) 连边,边权为 \(r-l+1\),表示 \(l-1\) 到 \(r\) 的最小代价为 \(r-l+1\)

因为一次翻一个区间,即转化后的一次翻两个点,所以现在要使 \(4\) 个 \(1\) 配对

使他们最短路的和最小即为答案

\(Code\)

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL; const int N = 5e5 + 5;
int a , b , c , d , e , vis[N] , h[N] , tot , n;
LL dis[N] , ans; struct edge{
int nxt , to , w;
}E[2 * N]; struct node{
int id;
LL d;
bool operator < (node c) const
{
return d > c.d;
}
}; inline void add(int x , int y , int z)
{
E[++tot].to = y;
E[tot].w = z;
E[tot].nxt = h[x];
h[x] = tot;
} priority_queue<node> Q; inline LL dij(int s , int t)
{
memset(vis , 0 , sizeof vis);
memset(dis , 60 , sizeof dis);
while (!Q.empty()) Q.pop();
dis[s] = 0;
Q.push((node){s , dis[s]});
node x;
while (!Q.empty())
{
x = Q.top();
Q.pop();
if (vis[x.id]) continue;
vis[x.id] = 1;
if (x.id == t) break;
for(register int i = h[x.id]; i; i = E[i].nxt)
{
int v = E[i].to;
if (dis[x.id] + E[i].w < dis[v])
{
dis[v] = dis[x.id] + E[i].w;
Q.push((node){v , dis[v]});
}
}
}
return dis[t];
} int main()
{
freopen("card.in" , "r" , stdin);
freopen("card.out" , "w" , stdout);
scanf("%d%d%d%d%d" , &a , &b , &c , &d , &e);
scanf("%d" , &n);
int l , r;
for(register int i = 1; i <= n; i++)
{
scanf("%d%d" , &l , &r);
l--;
add(l , r , r - l) , add(r , l , r - l);
}
ans = min(dij(a , a + b) + dij(a + b + c , a + b + c + d) , dij(a , a + b + c) + dij(a + b , a + b + c + d));
ans = min(ans , dij(a , a + b + c + d) + dij(a + b , a + b + c));
if (ans >= 4340410370284600380) printf("-1");
else printf("%lld" , ans);
}

JZOJ 2020.07.30【NOIP提高组】模拟的更多相关文章

  1. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  2. 2017.07.07【NOIP提高组】模拟赛B组

    Summary 因为某种无法抗拒的原因,今天没有打比赛,所以也就没有那种心态.今天的题目有状压DP和二分,这套题不难也不简单,适中,适合我这种渣渣来做.在改题时,发现了许多问题.我连欧拉函数的计算都记 ...

  3. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  4. HGOI20180815 (NOIP 提高组模拟赛 day2)

    Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...

  5. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  6. [LUOGU] NOIP提高组模拟赛Day1

    题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...

  7. 10-18 noip提高组模拟赛(codecomb)T2贪心

    T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...

  8. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

  9. noip提高组模拟赛(QBXT)T2

    T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...

  10. l洛谷 NOIP提高组模拟赛 Day2

    传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...

随机推荐

  1. 自动注册实体类到EntityFramework Core上下文,并适配ABP及ABP VNext

    继上篇文章(EF Core懒人小技巧之拒绝DbSet)之后,最近笔者把这个小功能单独封装成一个扩展方法并开源,欢迎交流和Star~ GitHub: EntityFrameworkCore.Extens ...

  2. 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务

    大数据时代,数据库 SaaS 是企业实现降本增效和业务创新的重要抓手.在腾讯全球数字生态大会数据库 SaaS 专场上,腾讯云发布了多项数据库 SaaS 产品能力升级,并重点分享了其在上云.日常运维.数 ...

  3. PHP8.1.10手动安装教程及报错解决梳理

    安装教程参考一:https://www.cnblogs.com/haw2106/p/9839655.html 安装教程参考二:https://www.cnblogs.com/jiangfeilong/ ...

  4. 【大数据面试】【框架】Flume:Source的断点续传、重复数据、Channel选择

    〇.用途 流式结构 获取磁盘日志,拦截器过滤后,传递指定数据,写入HDFS或kafka 一.组成-Source.Channel.Sink 事务(put/take) 1.Source---taildir ...

  5. 【HarmonyOS】ArkTS Native开发——使用 system函数创建文件

    ​ ArkTS是HamronyOS优选的主力语言,但官方文档指南中对于Native应用开发并没有详细的描述,只有一篇Codelab可以学习(简易Native C++ 示例(ArkTS) (huawei ...

  6. RocketMQ 在网易云音乐的实践

    本文作者:蒋星韬,网易云音乐服务端开发工程师. 云音乐线上场景众多,比如直播.评论.广告,各个业务线都会有消息场景比如发奖券,也会有延迟消息和事务消息场景,以及大数据做埋点数据.数据清洗.离线处理等. ...

  7. 04.Javascript学习笔记3

    1.箭头函数 箭头函数是一种更短的函数表达式. const age = birthyear => 2022 - birthyear; console.log(age(2000)) 箭头左边的bi ...

  8. ES6——模块化

    模块化 模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来. 一.浏览器使用ES6模块化方式一 使用script标签,将type属性设置为module,然后在script中书写代码 ...

  9. 数据库MySQL(完结)

    SQL注入问题 简介 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为. 其成因可归结为以下两个原理叠加造成: 程序编写者在处理 ...

  10. JavaScript:变量:声明和赋值变量时,内存结构是什么样的?

    这里只是大概画出内存结构的模型图,方便理解当我们声明变量和赋值变量时,到底在干嘛. 如上图所示,a赋值一个对象{},b赋值字符串hello: 于是内存里划了三个区域给我们,一个存储我们声明的变量表,即 ...