题目描述

$liu\_runda$决定提高一下知识水平,于是他去请教郭神。郭神随手就给了$liu\_runda$一道神题,$liu\_runda$并不会做,于是把这个题扔到联考里给高二的做。
郭神有$n$条位于第一象限内的线段,给出每条线段与$x$轴和$y$轴交点的坐标,显然这样就可以唯一确定每一条线段。
$n$条线段和$y$轴交点的纵坐标分别为$1,2,3,4...n$。我们记和$y$轴交点纵坐标为$i$的线段和$x$轴交点的横坐标为$x_i+1,x_i$按这样的方式生成:
$x_1$由输入给出。
$x_i=(x_{i-1}+a)\%mod,2\leqslant i\leqslant n$。
即:如果$x_3=4$,则与$y$轴交点纵坐标为$3$的抛物线,和$x$轴交点的横坐标为$4+1=5$。
我们保证给出的$n,x_1,a,mod$使得所有的$x_i$互不相同。
对于第一象限内的所有点(点的横纵坐标可以是任意实数),如果一个点被$x$条线段经过,它的鬼畜值就是$\frac{x\times (x-1)}{2}$。
求第一象限内的所有点的鬼畜值之和。


输入格式

一行$4$个整数$n,x_1,a,mod$。


输出格式

$1$行一个整数表示鬼畜值之和。


样例

样例输入1:

5 2 4 7

样例输出1:

5

样例输入2:

100000 233 23333 5026733

样例输出2:

2496173893

样例输入3:

10000000 233 8 66777383

样例输出3:

12430707670886

样例输入4:

10000000 6666 6666 30099271

样例输出4:

24993727056912

样例输入5:

10000000 23336666 100000 66777383

样例输出5:

24999931370887


数据范围与提示

第$1,2$个测试点,$n\leqslant 100$。
第$3,4$个测试点,$n\leqslant {10}^5$。
第$5,6$个测试点的数据,$a\leqslant 10$。
第$7,8$个测试点,$x_1=a$。
第$9,10$个测试点,无特殊限制。
对于全部数据,$1\leqslant n\leqslant {10}^7,1\leqslant a\leqslant {10}^5,1\leqslant mod\leqslant {10}^8$,$a,mod$互质,$n<mod$,给出的$n,x_1,a,mod$使得所有的$x_i$互不相同。
请选手注意,${10}^7$个$int$类型的变量将占用大约$40MB$的内存,导致内存超限,本题得$0$分。


题解

看到这道题,我还以为是道数论,准备弃掉,然后在认真算了一下,我就$AK$了这套卷……

首先,题目中所说的交点贡献的$\frac{x\times (x-1)}{2}$吓到了不少人,也包括我,况且点还都不是整数点,这要是爆精度不就凉了嘛。

仔细算一下便会发现,其实我们根本就不用考虑这一点,我们来化一下式子:

  假设现在有$x$条线已经交到了一个点上,那么这个点现在的贡献显然就是$\frac{x\times (x-1)}{2}$;

  现在又来了一条直线,交到了这个点上,那么这个点的贡献就变成了$\frac{(x+1)\times x)}{2}$;

  将上面两个式子做差得$x$,也就是说,一条直线对一个点的贡献就等于这个点原本就有的直线的个数;

  那么接着转化,就可以认为一条直线对答案的贡献与它与多少条直线交于一个点无关,而只与它与多少条直线相交有关。

接着就会发现,问题就可以转化为求逆序对的个数。

然后你可能会想到,$\Theta(n\log n)$求逆序对,卡卡常没准就$A$了,然而……

空间限制$32MB$,在爆零面前你选择了屈服。

那么怎么办呢?

认真阅读数据范围$ing...$

忽然发现$a$好小,考虑从$a$入手,突然发现式子$x_i=(x_{i-1}+a)\%mod$中如果不$mod$的的话就是一个等差数列,再画画图?

发现不超过$mod$的一组线是平行的,进而,我们可以只维护小于$a$的逆序对,剩下的通过上一位推出来就好了。

情况挺多,细节不少,详细看标程吧。

时间复杂度:$\Theta(a\log a)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,x,a,mod;
int tr[500000];
int flag,pls,cut;
long long ans;
int lowbit(int x){return x&-x;}
void change(int x)
{
for(int i=x;i<=a;i+=lowbit(i))
tr[i]++;
}
int ask(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=tr[i];
return res+1;
}
int main()
{
scanf("%d%d%d%d",&n,&x,&a,&mod);
if(x<a)change(x+1);
flag=x;
for(int i=2;i<=n;i++)
{
flag=(flag+a)%mod;
if(flag<a){pls=i-ask(flag+1);cut++;change(flag+1);}
else{if(flag<x)pls++;pls-=cut;}
ans+=pls;
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:飞(fly)(数状数组+简单几何)的更多相关文章

  1. [CSP-S模拟测试]:柱状图(树状数组+二分+三分)

    题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...

  2. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...

  3. [CSP-S模拟测试]:统计(树状数组+乱搞)

    题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  5. HDU 1166 敌兵布阵 (数状数组,或线段树)

    题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  6. wmz的数数(数状数组)

    wmz的数数(数状数组) 题目描述 \(wmz\)从小就显现出了过人的天赋,他出生的第三天就证明了哥德巴赫猜想,第五天就证明了质能方程,出生一星期之后,他觉得\(P\)是否等于\(NP\)这个问题比前 ...

  7. poj 2481 Cows(数状数组 或 线段树)

    题意:对于两个区间,[si,ei] 和 [sj,ej],若 si <= sj and ei >= ej and ei - si > ej - sj 则说明区间 [si,ei] 比 [ ...

  8. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...

  9. HDU-3015 Disharmony Trees [数状数组]

    Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...

随机推荐

  1. Zotero引用文献格式(软件学报)

    最近在写一篇综述,要处理大量引用文献,选用Zotero作为文献管理工具.在插入参考文献目录时需要遵循格式,奈何网上找不到<软件学报>对应的csl模板文件,所以决定自己动手修改.在此记录下自 ...

  2. Noi2018 归途

    zz:https://blog.csdn.net/dreaming__ldx/article/details/81106748 以海拔为第一关键字对边进行从大到小的排序,然后修建kruskal重构树, ...

  3. 毒瘤阅读题 LightOJ - 1220

    Mysterious Bacteria LightOJ - 1220 https://vjudge.net/problem/LightOJ-1220 "Each case starts wi ...

  4. 设置HTML中字体的粗细

    设置font-weight 属性:normal : 默认值.正常的字体.相当于 400 .声明此值将取消之前任何设置bold : 粗体.相当于 700 .也相当于 b 对象的作用bolder : 比 ...

  5. C#里sqlDataAdapter.fill(DataSet,String)的用法

    第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 指定后,以后就可以这样调用这张表 DataSe ...

  6. jenkins无法显示html样式问题解决

    利用jenkins的以下两个插件可以巧妙解决这个问题 Startup Trigger: 可实现在Jenkins节点(master/slave)启动时触发构建: Groovy plugin: 可实现直接 ...

  7. MD5加密 和 自定义加密解密

    public class EncryptString { /// <summary> /// MD5加密 /// </summary> /// <param name=& ...

  8. Good number(3进制)

    https://codeforces.com/problemset/problem/1249/C2 C2. Good Numbers (hard version) time limit per tes ...

  9. Appium+Python之异常自动截图

    运行过程中出现异常情况,我们怎么直观的看到呢?最简单的方法就是可以把异常现象截图下来. 思路:我这里采用get_screenshot_as_file(filename)方法,filename通过获取时 ...

  10. python学习第四十四天斐波那契数列和yield关键词使用

    斐波那契数列是数学中的常见的算法,第一个第二个不算,从第三个开始,每个数的都是前面两个数的和,使用yield关键词把生成的数列保存起来,调用的时候再调用,下面举例说明一下 def fab(max): ...