2017.10.7 QBXT 模拟赛
T1
容斥原理,根据奇偶性进行加减
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i,a,n) for(int i=a;i<=n;i++)
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
void put(ll a)
{
if(a<)putchar('-'),a=-a;
int top=,q[];
while(a)q[++top]=a%,a/=;
top=max(top,);
while(top--)putchar(''+q[top+]);
}
ll ans=;
int n,m,a[];
ll Gcd(ll a,ll b)
{
if(!b)return a;
return gcd(b,a%b);
}
void dfs(int dep,ll t,int flag)
{
if(t>n)return;
if(dep==m+)
{
ans+=n/t*flag;
return;
}
dfs(dep+,t,flag);
dfs(dep+,t/Gcd(t,a[dep])*a[dep],-flag);
}
int main()
{
n=read();
m=read();
rep(i,,m)a[i]=read();
dfs(,,);
cout<<ans<<endl;
return ;
}
T2
对于60%数据:我们需要对程序进行优化,枚举左端点的时候,要固定右端点。
可以再n^3内算出。根据插入排序,我们可以找出中位数找出
对于80%数据:一般求第k大,一般都是需要二分答案。我们二分中位数大于等于k有多少个,二分完中位数大于等于k个。
比如说:
A 1 2 3 4 5 k=3
B -1 -1 1 1 1
因为1,2是小于零,根君b数组进行判断有多少个大于等于k个。我们二分答案,再暴力一下,可以拿到80%
对于100%数据,我们要拿前缀和s[r]进行判断。我们要让s[r]-s[l-1]>0,我们要求逆序对,我们统计顺序对的个数,求逆序对是nlogn,总时间复杂度是nlognlogn
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
typedef double ld;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define N 110000
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
int a[N],b[N],c[N],d[N],e[N],n,m;
ll k;
int lowbit(int x){return x&(-x);}
int bin(int k)
{
int l=,r=m;
while(l<r)
{
int mid=(l+r)/;
if(k<=d[mid])r=mid;
else l=mid+;
}
return l;
}
void add(int x)
{
for(;x<=m;x+=lowbit(x))e[x]++;
}
int find(int x)
{
int ans=;
for(;x;x-=lowbit(x))ans+=e[x];
return ans;
}
ll check(int k)
{
c[]=;
rep(i,,n)c[i]=c[i-]+(a[i]>=k);
rep(i,,n)c[i]=c[i]*-i,d[i+]=c[i];
sort(d+,d+n+);
d[]=;
rep(i,,n+)
if(d[i]!=d[d[]])d[++d[]]=d[i];
m=d[];
ll ans=;
rep(i,,n)c[i]=bin(c[i]);
rep(i,,m)e[i]=;
rep(i,,n)
if(i&)add(c[i]);
else ans+=find(c[i]-);
rep(i,,m)e[i]=;
rep(i,,n)
if((i&)==)add(c[i]);
else ans+=find(c[i]-);
return ans;
}
int main()
{
n=read();k=read();
rep(i,,n)a[i]=read(),b[i]=a[i];
sort(b+,b+n+);
b[]=;
rep(i,,n) if(b[i]!=b[b[]])b[++b[]]=b[i];
int l=,r=b[];
while(l<r)
{
int mid=(l+r)/+;
ll tt=check(b[mid]);
if(tt==k)
{
cout<<b[mid]<<endl;
return ;
}
if(check(b[mid])>k)l=mid;
else r=mid-;
}
cout<<b[l]<<endl;
return ;
}
T3
对于60%数据,每一次排序只新增一个数字,我们可以进行插入排序,这样我们可以n^3做这道题。
对于80%数据:首先我们来考虑一下,一个区间是5,k=4,那么会被统计4次,这个数字被统计了多少次,说明有多少个数字小于他。一个数比他小,则会对这个数字多贡献一下
我们把t变一下,比如说还有t2,那么还有i2这一段比他小
Sum=i+i2
Sum*(n-j+1)*k。所以我们只需要求出比k小的下标有多少个。
我们可以暴力做
对于100%数据:我们每一次找到比他小的下标进行维护,我们可以那树状数组,线段树甚至归并排序求出。我们先求出下标总和
比如:10 100 1000 à数据
1 2 3 à下标
这样我们可以那归并排序进行维护即可。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double ld;
typedef pair<int,int> pr;
const double pi=acos(-);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define fi first
#define sc second
#define N 1001000
ld eps=1e-;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
pr a[N];
int c1[N],c2[N],n;
ll pp=,A,B,C;
int lowbit(int x){return x&(-x);}
void add(int *c,int x,int w)
{
c[]+=w;
if(c[]>=pp)c[]-=pp;
for(;x<=n;x+=lowbit(x))
{
c[x]=c[x]+w;
if(c[x]>=pp)c[x]-=pp;
}
}
int find(int *c,int x)
{
int ans=;
for(;x;x-=lowbit(x))
{
ans+=c[x];
if(ans>=pp)ans-=pp;
}
return ans;
}
int main()
{
cin>>n>>a[].fi>>A>>B>>C;
a[].sc=;
rep(i,,n)
{
a[i].sc=i;
a[i].fi=(a[i-].fi*A+B)%C;
}
sort(a+,a+n+);
ll ans=;
rep(i,,n)
{
int t1=find(c1,a[i].sc);
int t2=c2[]-find(c2,a[i].sc-);
t2=(t2+pp)%pp;
int t3=(1ll*t1*(n-a[i].sc+)+1ll*t2*a[i].sc)%pp;
t3=(t3+1ll*a[i].sc*(n-a[i].sc+))%pp;
ans=(ans+1ll*t3*a[i].fi)%pp;
add(c1,a[i].sc,a[i].sc);
add(c2,a[i].sc,n-a[i].sc+);
}
cout<<ans<<endl;
return ;
}
2017.10.7 QBXT 模拟赛的更多相关文章
- 2017.10.3 QBXT 模拟赛
题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...
- 2017.10.6 QBXT 模拟赛
题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...
- 2017.10.5 QBXT 模拟赛
题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...
- 2017.10.4 QBXT 模拟赛
题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...
- 2017.10.2 QBXT 模拟赛
题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...
- 2017.10.1 QBXT 模拟赛
题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.10.28 QB模拟赛 —— 下午
题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...
- 2017.10.28 QB模拟赛 —— 上午
题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set 死慢.. #include <cstdio> int t; long long p; int ma ...
随机推荐
- 《Java多线程编程核心技术》读后感(十六)
线程组 线程组的作用是,可以批量的管理线程或线程组对象,有效地对线程或线程组对象进行组织 线程对象关联线程组:1级关联 package Seven; public class ThreadA exte ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
- 2014-10-4 NOIP模拟赛
1.某种密码(password.*) 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则 ...
- 剑指Offer的学习笔记(C#篇)-- 跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 一 . 解题思路. 由题目可知,青蛙一次可以跳一阶或者两阶.假设台阶为 ...
- 深入V8引擎-Time模块介绍
积跬步,行千里,先从最简单的开始写. 这一篇介绍V8中的时间模块,与libuv粗糙的update_loop_time方法不同,V8有一套独立完整的类负责管理时间. 该类位于src/base/platf ...
- Nginx 最新版源码编译安装 包含常用模块作用及所需依赖
第一部分 Nginx最新版源码编译安装 1. 使用的模块 模块1:http_rewrite_module 基于正则匹配来实现重定向.依赖PCRE库,见依赖1 模块2:http_gzip_module ...
- JS高级学习历程-3
JS-作用域链及作用 [作用域链] 1 什么事作用域链 一个变量,在当前环境可以使用,当前环境的内部环境也可以使用,内部的深层环境...也可以使用,变量在不同环境都可以使用的现象想成了一个链条,称为“ ...
- [TCP/IP]ICMP和IGMP的区别
ICMP(Internet 控制消息协议,Internet Control Message Protocol)协议用来给IP协议提供控制服务,允许路由器或目标主机给数据的发送方提供反馈信息.需要发送反 ...
- Linux —— gcc编译文件
编译过程 预处理: 作用: 负责展开在源文件重定义的宏 操作: g++ -E 源文件.c -o 目标文件.i 汇编: 作用: 将目标文件生成汇编代码文件 操作: g++ -S 目标文件.i -o 汇编 ...
- HDU-2767-ProvingEquivalences
链接:https://vjudge.net/problem/HDU-2767 题意: 给一个图,求最少需要几条边将其连成一个强连通图 思路: tarjan,缩点,考虑缩点后的图,出度为0的点和入度为0 ...