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 ...
随机推荐
- CF-828B
B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- day4 函数重载
函数的重载 1.函数重载的定义:在同一个类中,有一个以上的同名函数,只要函数的参数列表或参数类型不一样即可,与返回值无关, 这些统称为方法的重载. 2.函数的重载存在的原因:为了增强方法的阅读性,优化 ...
- Windows下怎样安装Tomcat
Tomcat 是开源的WEB应用容器,所以受到各位程序员和公司的亲赖.在这里给大家介绍一下如何在Windows环境下安装Tomcat绿色版本,希望能够对大家有帮助. 1.首先去Tomcat官网下载To ...
- location对象介绍
Location 对象 Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 Window 对象的一个部分,可通过 window.location 属 ...
- 使用MeshLab的技巧总结(自己原创总结)
1.放大点的显示,Alt+wheel,即按住Alt键后使用鼠标滑轮改变点的显示大小.
- 洛谷P1014 Cantor表
P1014 Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 ...
- 了解HTTP协议和TCP协议
HTTP(超文本传输协议),互联网上应用最为广泛的一种网络协议.所有的www文件都必须遵守这个标准.HTTP是一个客户端和服务端请求和应答的标准(TCP):客户通过浏览器发起一个到服务器上指定端口的H ...
- Elasticsearch内存分配设置详解(转)
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题.这里有两种方式修改Elastics ...
- hdu6070Dirt Ratio 多校题 套路二分
比赛中我看了一眼题目就觉得是二分的套路,跟miaom说,结果发现miaom开始碎觉 miaom醒来以后表示这是道凸包合并(%%%) 我&wzf2000:那您快写啊 miaom:我不会写啊 莫名 ...
- jetty jndi数据源
applicationContext.xml <?xml version="1.0" encoding="utf-8"?> <beans de ...