[CSP-S模拟测试]:飞(fly)(数状数组+简单几何)
题目描述
$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)(数状数组+简单几何)的更多相关文章
- [CSP-S模拟测试]:柱状图(树状数组+二分+三分)
题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...
- [CSP-S模拟测试]:影魔(树状数组+线段树合并)
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- [CSP-S模拟测试]:统计(树状数组+乱搞)
题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- HDU 1166 敌兵布阵 (数状数组,或线段树)
题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...
- wmz的数数(数状数组)
wmz的数数(数状数组) 题目描述 \(wmz\)从小就显现出了过人的天赋,他出生的第三天就证明了哥德巴赫猜想,第五天就证明了质能方程,出生一星期之后,他觉得\(P\)是否等于\(NP\)这个问题比前 ...
- poj 2481 Cows(数状数组 或 线段树)
题意:对于两个区间,[si,ei] 和 [sj,ej],若 si <= sj and ei >= ej and ei - si > ej - sj 则说明区间 [si,ei] 比 [ ...
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- HDU-3015 Disharmony Trees [数状数组]
Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...
随机推荐
- shell脚本中执行python脚本并接收其返回值的例子
1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序 hello.py 复制代码代码如下: def main(): pri ...
- python基础-6.2正则表达式,计算器练习
content = "1-2*((60-30+(1-40/5*5+3-2*5/3)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))&q ...
- Web API 入门三(参数绑定)
学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多.在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的. 其实,Contro ...
- hdu-4289.control(最小割 + 拆点)
Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 初识STM8S105K心得!
最近由于公司项目需要STM8S105K这颗芯片,这两天我也捣鼓了下,正好现在开通了博客,以此记录下自己的工作. 开发环境: window10操作系统: IAR for ...
- CentOS 下 redis 安装与配置
CentOS 下 redis 安装与配置 1.到官网上找到合适版本下载解压安装 [root@java src]# wget -c http://redis.googlecode.com/files ...
- 使用git版本管理时的免密问题
方式1 使用ssh 方式 方式2 使用命令 git config --global credential.helper store 会把密码存放到当前用户的home目录下的 该文件中 [root@ ...
- 给当当同学的random data
m**o 00'57"32街**o 00'52"23c**6 00'44"15斗**6 00'57"58n**5 00'32"04s**p 00'51 ...
- k3 cloud列表中出现很多空白
解决办法:找到单据体:过滤面板默认隐藏打勾
- CentOS7搭建Hadoop2.8.0集群及基础操作与测试
环境说明 示例环境 主机名 IP 角色 系统版本 数据目录 Hadoop版本 master 192.168.174.200 nameNode CentOS Linux release 7.4.1708 ...