A - exercise

照题意模拟即可,注意每天先增后减。细节见代码。

时间复杂度\(O(m\log m)\)。

点击查看代码
#include<bits/stdc++.h>
#define M 514
#define int long long
using namespace std;
struct task{int l,r,w;}a[M];
int n,m;
string s;
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>s>>a[i].l>>a[i].r>>a[i].w;
sort(a+1,a+1+m,[](task a,task b){return a.l<b.l;});
for(int i=1;i<=m;i++){
n+=a[i].l-a[i-1].r-1;
int t=(1-a[i].w)*(a[i].r-a[i].l+1);
if(n+t<=0) cout<<"Runtime Error\n"<<a[i].l+(n-1)/(a[i].w-1),exit(0);
// ↑相当于a[i].l+⌈n/(a[i].w-1)⌉-1
n+=t;
}
n+=1440-a[m].r;
cout<<"Accepted\n"<<n<<"\n";
return 0;
}

B - 魔兽争霸

区间修改、查询名次等操作通常可以用平衡树在\(O((n+m)\log n)\)的时间复杂度中完成。不过放在这道题,我们也可以使用线段树达到同样的时间复杂度。

先对中途所有可能出现的血量(最多有\(n+m\)个)进行离散化,然后用线段树作为桶数组(现在才知道这叫做权值线段树)。应对\(2\)种操作:

  • 血量修改:血量从\(x\)变成\(y\),在线段树上仅需将\(x\)处\(-1\),\(y\)处\(+1\)。
  • 查询第\(k\)大:采用线段树上二分,对于当前节点对应的区间\([l,r]\),令该区间的第\(k\)大是\(f(l,r,k)\),则:
    • 如果\([mid+1,r]\)中数的个数\(cnt\ge k\),说明第\(k\)名在\([mid+1,r]\)中,那么\(f(l,r,k)=f(mid+1,r,k)\)。
    • 如果\([mid+1,r]\)中数的个数\(cnt<k\),说明第\(k\)名在\([l,mid]\)中,那么\(f(l,r,k)=f(l,mid,k-cnt)\)。

每个操作时间复杂度都是\(O(\log n)\),算上离散化的\(O(n\log n)\),总时间复杂度为\(O((n+m)\log n)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define lc (x<<1)
#define rc (x<<1|1)
#define N 30010
#define M 50010
using namespace std;
struct Que{char op;int p,v;}q[M];
int n,m,a[N],ta[N],tmp[(N+M)],idx,ans;
int sum[(N+M)<<2],tag[(N+M)<<2];
unordered_map<int,int> to;
void update(int x){sum[x]=sum[lc]+sum[rc];}
void pushdown(int l,int r,int x){
if(tag[x]!=0){
int mid=(l+r)>>1;
tag[lc]+=tag[x];
tag[rc]+=tag[x];
sum[lc]+=tag[x]*(mid-l+1);
sum[rc]+=tag[x]*(r-mid);
tag[x]=0;
}
}
void build(int l,int r,int x){
if(l==r){
sum[x]=0;
return;
}
int mid=(l+r)>>1;
build(l,mid,lc);
build(mid+1,r,rc);
update(x);
}
void chr(int a,int b,int v,int l,int r,int x){
if(a<=l&&r<=b){
tag[x]+=v;
sum[x]+=v*(r-l+1);
return;
}
pushdown(l,r,x);
int mid=(l+r)>>1;
if(a<=mid) chr(a,b,v,l,mid,lc);
if(b>mid) chr(a,b,v,mid+1,r,rc);
update(x);
}
int query(int k,int l,int r,int x){
if(l==r) return tmp[l]<=0?-1:tmp[l];
pushdown(l,r,x);
int mid=(l+r)>>1;
if(sum[rc]>=k) return query(k,mid+1,r,rc);
else return query(k-sum[rc],l,mid,lc);
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],tmp[++idx]=ta[i]=a[i];
cin>>m;
for(int i=1;i<=m;i++){
cin>>q[i].op;
if(q[i].op=='A'){
cin>>q[i].p>>q[i].v,q[i].op='+',q[i].v=-q[i].v;
tmp[++idx]=(ta[q[i].p]+=q[i].v);
}else if(q[i].op=='C'){
cin>>q[i].p>>q[i].v,q[i].op='+';
tmp[++idx]=(ta[q[i].p]+=q[i].v);
}else cin>>q[i].v;
}
sort(tmp+1,tmp+1+idx);
int len=unique(tmp+1,tmp+1+idx)-tmp-1;
for(int i=1;i<=len;i++) to[tmp[i]]=i;
build(1,len,1);
for(int i=1;i<=n;i++) chr(to[a[i]],to[a[i]],1,1,len,1);
for(int i=1;i<=m;i++){
if(q[i].op=='+'){
chr(to[a[q[i].p]],to[a[q[i].p]],-1,1,len,1),
a[q[i].p]+=q[i].v,
chr(to[a[q[i].p]],to[a[q[i].p]],1,1,len,1);
}else cout<<query(q[i].v,1,len,1)<<"\n";
}
for(int i=1;i<=n;i++) ans+=(a[i]>0);
cout<<ans<<"\n";
return 0;
}

线段树代码搬的之前的模板,所以单点修改都是直接调用的区间修改。实际上用不着区间修改。

C - 盟军敢死队

考虑建图求解,将敌人看做节点,如果\(u\)看向\(v\),就连一条\(u\)向\(v\)的边。

这样建出的图\(G\),按其拓扑序击杀,一定是合法的。

相应地,如果\(G\)存在环,则无法全部击杀,输出Impossible


排除了不合法的情况,\(G\)就是一个DAG(有向无环图)。根据上面的分析,其不同拓扑序的数量即为答案。

考虑到节点数\(T\le 15\),所以考虑直接状压dp。用一个01串\(x\)来表示我们所选定的节点集合\(A\),节点\(u\)在\(A\)中,当且仅当\(x\)的第\(u\)位是\(1\)。

令\(f[x]\)表示所选的节点集合为\(A\)时的拓扑序计数。

考虑在\(A\)的基础上添加一个节点\(u\),那么必须满足:

  • \(u\)不在\(A\)中。
  • \(u\)的子节点都在\(A\)中。

令新集合对应的整数为\(x'\),那么有转移\(f[x']\leftarrow (f[x']+f[x])\)。

完成递推后,\(f[2^T-1]\)即为答案。

时间复杂度\(O(2^T T+nm\max(n,m))\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 61
#define NN 15
using namespace std;
struct edge{int nxt,to;}e[NN*N];
int n,m,dx[256],dy[256],idx,head[NN+5],deg[NN+5],cnt,num[N][N],enemy;
int f[1<<NN],son[1<<NN];
string s[N];
void add(int u,int v){
e[++idx]={head[u],v},head[u]=idx;
deg[v]++,son[u]|=(1<<v);
}
int frac(int x){int ans=1;for(int i=2;i<=x;i++) ans*=i;return ans;}
queue<int> q;
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
memset(num,-1,sizeof num);
dx['^']=-1,dy['^']=0;
dx['v']=1,dy['v']=0;
dx['<']=0,dy['<']=-1;
dx['>']=0,dy['>']=1;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(dx[s[i][j]]|dy[s[i][j]]) num[i][j]=enemy++;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(num[i][j]==-1) continue;
for(int x=i+dx[s[i][j]],y=j+dy[s[i][j]];;x+=dx[s[i][j]],y+=dy[s[i][j]]){
if(x<0||x>=n||y<0||y>=m||s[x][y]=='#') break;
if(~num[x][y]) add(num[i][j],num[x][y]);
}
}
}
int cnt=0;
for(int i=0;i<enemy;i++) if(!deg[i]) q.emplace(i);
while(!q.empty()){
int u=q.front();
q.pop(),cnt++;
for(int i=head[u];i;i=e[i].nxt){
deg[e[i].to]--;
if(!deg[e[i].to]) q.push(e[i].to);
}
}
if(cnt!=enemy) cout<<"Impossible\n",exit(0);
f[0]=1;
for(int i=0;i<(1<<enemy);i++){
for(int j=0;j<enemy;j++){
if(i&(1<<j)) continue;
if((i&son[j])!=son[j]) continue;
f[i|(1<<j)]+=f[i];
}
}
cout<<f[(1<<enemy)-1]<<"\n";
return 0;
}

D - orbs

可以想到一个很暴力的做法。

将边按权值排序。

为了使边权极差最小,我们所选的边要尽可能是一个连续的区间。

那么我们不妨枚举这个区间的左端点。对于每个左端点,从它开始逐个加边。这样每个左端点都跑出一个生成树,这些生成树的极差求最小值即为答案。

时间复杂度每个测试数据\(O(m(n+m))\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 105
#define M 5005
using namespace std;
struct edges{int u,v,w;}es[M];
int t,n,m,fa[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
while(cin>>n>>m){
if(!n&&!m) break;
for(int i=1;i<=m;i++) cin>>es[i].u>>es[i].v>>es[i].w;
sort(es+1,es+1+m,[](edges a,edges b){return a.w<b.w;});
int ans=LLONG_MAX;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++) fa[j]=j;
int cnt=0,ww=-1;
for(int j=i,u,v;j<=m;j++){
u=find(es[j].u),v=find(es[j].v);
if(u!=v) fa[u]=v,ww=es[j].w,cnt++;
}
if(cnt!=n-1) continue;
ans=min(ans,ww-es[i].w);
}
cout<<(ans==LLONG_MAX?-1:ans)<<"\n";
}
return 0;
}

[题解]test0406模拟赛的更多相关文章

  1. 题解 noip2019模拟赛Day1T3

    题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...

  2. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  6. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  7. 题解 P5594 【【XR-4】模拟赛】

    P5594 [[XR-4]模拟赛] 洛谷10月月赛 II & X Round 4 Div.2前两道签到题还是很简单的,基本上是半小时内一遍过两题 看看题解,这题STL做法有用set输出size ...

  8. 【noip模拟赛 sword,zero,2048】 题解

    1.光剑 (sword.pas/c/cpp) [题目描述] 小林和亮亮各有一把光剑,长度分别为 a 和 b,他们拿光剑进行比试.每一回合,长光剑会砍向短光剑,砍完后,短光剑完好无损,而长光剑则被截成两 ...

  9. 2020.3.23 模拟赛游记 & 题解

    这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...

  10. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

随机推荐

  1. java netty socket实例:报文长度+报文内容,springboot

    前言 说实话,java netty方面的资料不算多,尤其是自定义报文格式的,少之又少 自己写了个简单的收发:报文长度+报文内容 发送的话,没有写自动组装格式,自己看需求吧,需要的话,自己完善 服务端启 ...

  2. Arduino 74HC164 数显屏幕显示简单程序

    根据卖家的代码,翻译成arduino语言就是这样了,废话少说直接放函数 接口:DAT------11号数字输出接口 CLK------12号数字输出接口 代码在下面: typedef unsigned ...

  3. 开源大数据调度系统Taier技术公开课——Taier数据开发介绍

    一键直达直播间 一.直播介绍 之前的内容,我们为大家分享了Taier入门及控制台,以及Taier的Web前端架构介绍,本期我们为大家分享Taier数据开发介绍. 本次直播我们将从Taier的数据开发功 ...

  4. 12-搭建小实战和Sequential使用

    1. 神经网络 ① 把网络结构放在Sequential里面,好处就是代码写起来比较简介.易懂. ② 可以根据神经网络每层的尺寸,根据下图的公式计算出神经网络中的参数. 2. 搭建神经网络 import ...

  5. CAE和CAD的区别

    CAE又被叫做"计算机辅助工程",而CAD则是"计算机辅助设计".虽然CAE和CAD是两种不同的技术,但它们却有着一定联系.在如今这个遍布科技与狠活的社会里,C ...

  6. MySQL核心知识学习之路(7)

    作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习<MySQL实战45讲>的总结笔记的第七篇,总结了MySQL是如何解决幻读的. 上一篇:MySQL核心 ...

  7. 使用openOffice将office文件转成pdf

    下载安装openoffice,下载地址:http://www.openoffice.org/download/ 我安装的目录: 输入cmd回车 在命令窗口输入 soffice -headless -a ...

  8. Java简历、面试、试用期、转正

    前言 这个内容其实一直在我的GitHub中,但我最近应要求面了一些人,整体感受让我头疼得很,所以添加一些细节点后拿到博客园来了,顺便夹杂着吐吐槽, 面试前准备 提前准备 1.使用招聘网站列出招聘的技术 ...

  9. OverallAuth权限管理系统,超精度权限划分(第一篇:功能级权限)。

    一.前言 随着信息化系统的普及,信息安全愈发的重要,企业对于信息的保密程度越来越高.程序员面临的压力开始逐步递增. 而作者作为"码农",也深深的体会到这一点. 随着公司业务的发展, ...

  10. ETL数据集成丨MySQL到MySQL的数据迁移实践

    前言 MySQL数据迁移至另一MySQL数据库的过程,不仅是数据复制或移动的操作那么简单,它还涉及到一系列策略性考量和技术优化,旨在实现数据的高效.安全传输,以及确保目标系统的高性能运行.其深远意义在 ...