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 部分简单题解析的更多相关文章

  1. 2018 Multi-University Training Contest 1 部分简单题解析

    Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...

  2. 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 ...

  3. 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 ...

  4. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  5. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

  6. 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 ...

  7. 2018 Multi-University Training Contest 2

    题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...

  8. 2018 Multi-University Training Contest 1

    比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...

  9. 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 ...

随机推荐

  1. Jenkins 利用Dashboard View插件管理任务视图

    利用Dashboard View插件管理任务视图   by:授客 QQ:1033553122 步骤 1.  安装Dashboard View插件 说明: 如果无法在线安装,可以选择本地上传方式安装 附 ...

  2. ImageButton和ImageView设置点击透明区域不响应

    思路 ImageView和ImageButton都可以设置background和设置src,两者的区别自行度娘.由于两者的不同,获取它们的图片资源的方法也不同.倘若设置的是background,那么需 ...

  3. 解决ArrayList线程不安全

    前些天做项目时,程序出现意外的问题,经后来分析是使用ArrayList这个线程不安全的方法导致 解决这个问题通常有两种方法(个人认为) 一:使用synchronized关键字,这个大家应该都很熟悉了, ...

  4. TypeError: __init__() missing 1 required positional argument: 'on_delete'

    报错的原因呢,就是在设计model时我弄了个外键,然后就报错了... 不难看出,它是想让我们在表与表关联时添加一个on_delete参数 解决办法: 如其所愿,加上on_delete=models.C ...

  5. sqlserver 2017 docker安装(启动代理)

    从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像. docker pull microsoft/mssql-server-linux:2017-latest 运行 ...

  6. [20171225]变态的windows批处理4.txt

    [20171225]变态的windows批处理4.txt --//昨天学习windows 批处理的echo &.使用它可以实现类似回车换行的功能.例子: 1.echo &.R:\> ...

  7. [20171031]markhot.txt

    [20171031]markhot.txt --//昨天看了https://jonathanlewis.wordpress.com/2017/10/02/markhot/,测试看看这样时候可以减少争用 ...

  8. MyEclipse10或者eclipse中配置开发Python的Pydev插件安装教程

    注意使用LiClipse的用户 PyDev已经预装在LiClipse中,所以可以跳过这一步(请注意,如果使用LiClipse,PyDev不能单独安装或更新,因为它必须始终作为一个整体更新). 必需品 ...

  9. banner图片全屏显示

    <script> $(function () { function reinitSize() { var window_h = $(window).height(); var window ...

  10. nginx防攻击的简单配置

    主要通过两方案来做防护,一是nginx自带模块限制请求连接数和并发数:二是筛选IP加入黑名单: 1.并发数和连接数控制的配置    nginx http配置:    #请求数量控制,每秒20个    ...