2018 Multi-University Training Contest 2 部分简单题解析
Preface
多校第二场,依靠罚时优势打到了校内的Rank 2
暴力分块碾标算系列
T4 Game
题目大意:在一个数集\([1,n]\)中两个人轮流选择其中的一个数,并从数集中删去这个数所有约数。先将所有数删去的人获胜。
比赛的时候手玩了\(n<=5\)的情况发现TM的怎么总是先手赢啊,然后就认为这是个先手必胜的游戏然而真的是这样
赛后听法老讲了真正的做法,分假定情况讨论:
- 假设这个状态先手必胜,那就让先手胜。
- 假设这个状态后手必胜,那么先手把\(1\)取走之后相当与把这个必败态扔给了后手(因为\(1\)对后面的选取没有任何影响)
故先手必胜,CODE
#include<cstdio>
using namespace std;
int n;
int main()
{
while (scanf("%d",&n)!=EOF) puts("Yes");
return 0;
}
T10 Swaps and Inversions
题目大意:给出一个数列,你可以花费\(x\)的代价交换两个数。在交换结束之后,还要花费\(y*逆序对个数\)的代价。问最小的代价。
这个一个结论:交换次数等于逆序对个数,因此树状数组求逆序对之后乘上\(\min(x,y)\)即可。
CODE
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100005;
int a[N],bit[N],b[N],n,m,x,y;
long long ans;
inline int find(int x)
{
int l=1,r=m,mid;
while (l<=r)
{
mid=l+r>>1; if (b[mid]==x) return mid;
if (b[mid]<x) l=mid+1; else r=mid-1;
}
}
inline int lowbit(int x)
{
return x&-x;
}
inline int get(int x)
{
int res=0; for (;x<=m;x+=lowbit(x)) res+=bit[x]; return res;
}
inline void add(int x)
{
for (;x;x-=lowbit(x)) ++bit[x];
}
int main()
{
register int i;
while (scanf("%d%d%d",&n,&x,&y)!=EOF)
{
for (i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
memset(bit,0,sizeof(bit));
sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1;
for (ans=0,i=1;i<=n;++i)
{
a[i]=find(a[i]); ans+=get(a[i]+1); add(a[i]);
}
printf("%lld\n",ans*(x<y?x:y));
}
return 0;
}
T7 Naive Operations
题目大意:这题不用翻译也能看懂吧,毕竟都是常见套路。给你两个数组\(a,b\),初始时\(a\)的所有元素都为\(0\)。然后定义两种操作:
- \(add\ l\ r\):将\(a_i,i\in[l,r]\)都加一
- \(query\ l\ r\):询问\(\sum_{i=l}^r \lfloor \frac{a_i}{b_i}\rfloor\)
官方给出的解法是搞两棵线段树,然后一波操作反正我不会
比赛的时候YY了一个延时修改的分块,2000+ms卡过。
首先我们记录一个块内的答案,然后考虑什么时候这个值才会被修改。
当然是有个数\(i\)(或多个)的值被累加到多出一个\(b_i\)来了。
有了这个思想,我们再维护一下每一块内最少还要整块累加多少次就会使答案发生改变,记作\(v_i\)。
然后修改的时候两端还是暴力改,整块的话也弄一个标记。
然后核心的来了,我们修改的时候不更新整块标记,而是查询的时候改
查询还是先暴力计算两端,然后对于被查询的块,看一下整块的累加是否已经超过\(v_i\),是的话再更新。
一般情况下速度良好,大致\(O(n\sqrt n\cdot k)\),\(k\)为常数,大致在\([In^2\ n,In\ n]\)吧,其实主要还是和\(b_i\)的关系比较大。
块乐的CODE
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=100005,BLO=320;
int n,m,a[N],b[N],l,r,blk[N],v[BLO],t[BLO],size;
LL sum[BLO]; string s;
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void reset(int id)
{
register int i; v[id]=1e9;
for (i=(id-1)*size+1;i<=id*size;++i)
{
sum[id]-=a[i]/b[i]; a[i]+=t[id];
sum[id]+=a[i]/b[i]; v[id]=min(v[id],b[i]-a[i]%b[i]);
} t[id]=0;
}
inline void modify(int l,int r)
{
register int i;
for (i=l;i<=min(blk[l]*size,r);++i)
{
if (!(++a[i]%b[i])) ++sum[blk[l]]; v[blk[l]]=min(v[blk[l]],b[i]-a[i]%b[i]);
}
if (blk[l]!=blk[r]) for (i=(blk[r]-1)*size+1;i<=r;++i)
{
if (!(++a[i]%b[i])) ++sum[blk[r]]; v[blk[r]]=min(v[blk[r]],b[i]-a[i]%b[i]);
}
for (i=blk[l]+1;i<=blk[r]-1;++i) ++t[i];
}
inline LL query(int l,int r)
{
register int i; LL tot=0;
for (i=l;i<=min(blk[l]*size,r);++i)
tot+=(a[i]+t[blk[l]])/b[i];
if (blk[l]!=blk[r]) for (i=(blk[r]-1)*size+1;i<=r;++i) tot+=(a[i]+t[blk[r]])/b[i];
for (i=blk[l]+1;i<=blk[r]-1;++i)
{
if (t[i]>=v[i]) reset(i); tot+=sum[i];
}
return tot;
}
int main()
{
//freopen("7.in","r",stdin); freopen("7.out","w",stdout);
ios::sync_with_stdio(false); register int i;
while (cin>>n>>m)
{
memset(a,0,sizeof(a)); memset(v,63,sizeof(v));
memset(t,0,sizeof(t)); memset(sum,0,sizeof(sum));
for (size=sqrt(n),i=1;i<=n;++i)
cin>>b[i],blk[i]=(i-1)/size+1,v[blk[i]]=min(v[blk[i]],b[i]);
while (m--)
{
cin>>s; cin>>l>>r;
if (s[0]=='a') modify(l,r); else cout<<query(l,r)<<endl;
}
}
return 0;
}
Postscript
主要是其他队伍要么没写出T7要么想线段树花了一段时间。
不过还是很高兴的,出题人用心出题目,用脚造数据
2018 Multi-University Training Contest 2 部分简单题解析的更多相关文章
- 2018 Multi-University Training Contest 1 部分简单题解析
Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...
- 2018 Nowcoder Multi-University Training Contest 2
目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...
- 2018 Nowcoder Multi-University Training Contest 1
Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...
- 2018 Nowcoder Multi-University Training Contest 5
Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...
- HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...
- 2018 Multi-University Training Contest 2
题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...
- 2018 Multi-University Training Contest 1
比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...
- hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
随机推荐
- Kotlin入门(4)声明与操作数组
上一篇文章介绍了基本变量类型在Kotlin中的用法,不过这只针对单个变量,如果要求把一组相同类型的变量排列起来,形成一个变量数组,那又该如何声明和操作呢? 在Java中声明数组,跟在C语言中声明是一样 ...
- android recovery 升级时间与速度研究
从android4.4到现在android7.1升级,现在的升级包越来越大,一个system分区大小都分配了2G,整个升级包达到了接近500M, 升级包解压之后1G+,奇怪的是,发现了两个不同批次的板 ...
- Scrum敏捷开发沉思录
计算机科学的诞生,是世人为了用数字手段解决实际生活中的问题.随着时代的发展,技术的进步,人们对于现实世界中的问题理解越来越深刻,描述也越来越抽象,于是对计算机软件的需求也越来越高,越来越复杂,变化也越 ...
- Linux主机定期打补丁修复漏洞
1.如图扫描出来的漏洞 不看不知道,一看吓一跳 2.Linux主机如何扫描漏洞 参照:Linux操作系统下查找漏洞的几种必备兵器 3.linux操作系统怎么样打补丁?linux系统升级软件 使用yu ...
- 第七章 鼠标(CHECKER2)
CHECKER2程序包含一个键盘接口,内容与CHECKER1完全相同.利用←.→.↑.↓四个方向键可以在25个矩形之间移动鼠标指针.Home键把鼠标指针移动到左上角的矩形:End键使鼠标指针落到右下角 ...
- Shell脚本应用(for、while循环语句和case分支语句)
1.for:读取不同的变量值,逐个执行同一组命令,直到取值完毕退出,变量值以空格分隔 语法: for 变量值 in 取值列表 do 命令序列 done 2.while:重复测试某个条件,成立则执 ...
- Beta冲刺! Day2 - 砍柴
Beta冲刺! Day2 - 砍柴 今日已完成 晨瑶:大致确定了文章推荐的算法思路(Content-based recommender):理清了不少feature的事宜 昭锡:修复了日期选择越界时导致 ...
- golang的一些基础数据类型转换
int -- string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_ ...
- el-table复选框分页记忆
el-table 结合 el-pagination 实现分页后默认是没有复选框记忆功能的,对于这样的需求,无奈又只能硬着头皮上,试了网上的一些方法,没奏效,便自己上了. 简单的用法如下: <te ...
- Android Activity学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html 最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函 ...