题目描述

$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. 获取当前进程当前runtime加载的appdomain

    using System.Runtime.InteropServices; // Add the following as a COM reference - C:\WINDOWS\Microsoft ...

  2. Python json函数与Flask jsonify函数

    JSON数据结构 要把json与字典区分开来 dumps(字典转换成Json) loads(Json转换成字典) 参考: Python 的字典是一种数据结构,JSON 是一种数据格式. json 就是 ...

  3. 前端 CSS的选择器 伪元素选择器

    介绍常用的伪元素. after用得比较多的 first-letter 用于为文本的第一个首字母设置样式. <!DOCTYPE html> <html lang="en&qu ...

  4. [Python3 填坑] 009 深拷贝与浅拷贝

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python3.7 官方文档 2.2 赋值.切片与 copy() 分析 分析 分析 分析 2.3 copy 模块 分析 分析 2.4 小 ...

  5. CentOS7 iptables安装及操作

    添加规则时的考量点: (1)要实现哪种功能:判断添加在哪张表上: (2)报文流经的路径:判断添加在哪个链上: 链上规则的次序: (1)同类规则(访问同一应用),匹配范围小的放上面: (2)不同类规则( ...

  6. Git 本地创建分支并提交远程分支

    在本地git checkout -b xxx 创建分支之后 想要提交分支到远程, 直接git push是不行的, 除非原来的分支里面就有这个分支. 需要先使用:git push origin  xxx ...

  7. Python时间模块datetime用法

    时间模块datetime是python内置模块,datetime是Python处理日期和时间的标准库. 1,导入时间模块 from datetime import datetime 2,实例 from ...

  8. A.Equivalent Prefixes

    题目大意:等价数组定义为(1≤l≤r≤m)中,所有的子区间都满足最小值下标相等,找出最大的m. 题解:我们要找到最大的m,就要保证两个数组的所有子区间最小值下标相等 所以用一个单调栈来维护一个单调递增 ...

  9. 01. Linux-Kali系统网卡配置

    配置网卡操作: vim /etc/network/interfaces auto eth0iface eth0 inet static 配置eth0使用默认的静态地址address 192.168.1 ...

  10. linux里面以指定用户运行命令

    一.chroot方式 [root@localhost ~]# chroot --userspec "nginx:nginx" "/" sh -c "w ...