总结

本场比赛很不负责对待

暴力都没怎么打

一个半小时后才开始打题

很悲剧的只有 \(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. Git同步操作

    同步github数据 先要进入仓库文件夹 新建仓库文件夹要初始化或将远程仓库clone下来 git init或git clone https://github.com/用户名称/仓库名称.git 新建 ...

  2. EasyCode全自动单表增删改查!

    需要IDEA下载EasyCode插件 准备好三个基础Base类 分页封装基础 package com.gton.io; import lombok.AllArgsConstructor; import ...

  3. 【JVM调优】Day04:总结前三日内容(GC+算法*4+简单回收器*3三色标记,CMS+G1+ZGC,参数个数+OOM+调优参数)

  4. Java/JDK各版本主要特性汇总

    目录 Java18(2022.3) Java17(2021.9)(LTS版本) Java16(2021.3) Java15(2020.9) Java14(2020.3) Java13(2019.9) ...

  5. ArcObjects SDK开发 017 在ArcObject SDK 中使用Toolbox

    1.Geoprocessor和IGPProcess Geoprocessor是ArcObjects SDK中定义Tool执行器.IGPProcess接口是ArcObjects SDK中定义的ArcTo ...

  6. 新项目决定用 JDK 17了

    大家好,我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 最近在调研 JDK 1 ...

  7. 【机器学习】李宏毅——AE自编码器(Auto-encoder)

    1.What 在自编码器中,有两个神经网络,分别为Encoder和Decoder,其任务分别是: Encoder:将读入的原始数据(图像.文字等)转换为一个向量 Decoder:将上述的向量还原成原始 ...

  8. 正则爬取豆瓣Top250数据存储到CSV文件(6行代码)

    利用正则爬取豆瓣TOP250电影信息 电影名字 电影年份 电影评分 评论人数 import requests import csv import re # 不算导包的话正式代码6行 存储到csv文件 ...

  9. 3、mysql着重号解决关键字冲突

    1.着重号(`  `): 使用着重号(` `)将字段名或表名括起来解决冲突:保证表中的字段.表名等没有和保留字.数据库系统名或常用方法名冲突

  10. 何为GUI???

    1.GUI是什么–简介 GUI的全称为Graphical User Interface,图形化界面或图形用户接口,是指采用图形方式显示的计算机操作环境用户接口.与早期计算机使用的命令行界面相比,图形界 ...