题目描述

$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. 类StringBuffer

    1字符串声明和创建 public StringBuffer() 无参构造函数 public StringBuffer(int capacity) 指定容量的字符串缓冲区对象 public String ...

  2. 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be

    当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...

  3. web service接口 wsdl和asmx有什么区别

    没有区别,只是后缀名的区别.Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立 ...

  4. Myeclipse 快捷键大全(绝对全)

    非常感谢分享这篇文章的大虾..但是我忘了几下您的blog地址,因此无法注明原文地址...见谅哈 存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合 ...

  5. ngnix高并发的原理实现(转)

    英文原文:Inside NGINX: How We Designed for Performance & Scale 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在 ...

  6. Eclipse查看jdk源码(Ctrl+左键)

    Window ->Preferences ->Java ->Installed JREs ->选中jdk ->Edit ->选中rt.jar ->source ...

  7. String hashCode 这个数字,很多人不知道!

    作者:coolblog segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 ...

  8. 【洛谷p1981】表达式求值

    题前废话: 咱也不知道咱写了个什么神奇的代码导致_rqy都看不明白它是怎么re掉的, 代码的大致思路是这样的:对于这样一个中缀表达式,先转化成它的后缀表达式的形式,然后利用P1449 后缀表达式 这道 ...

  9. 知乎使用selenium反爬虫的解决方案

    from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOp ...

  10. SCUT - 77 - 哈利波特与他的魔法杖

    https://scut.online/p/77 METO说是单点更新线段树.要记录哪些点不用再更新,不太清楚具体是要怎么实现? 一个类似的想法是把n个点建一棵平衡树,每次节点变成0之后从树上移除,至 ...