题目链接

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 模拟赛的更多相关文章

  1. 2017.10.3 QBXT 模拟赛

    题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...

  2. 2017.10.6 QBXT 模拟赛

    题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...

  3. 2017.10.5 QBXT 模拟赛

    题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...

  4. 2017.10.4 QBXT 模拟赛

    题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...

  5. 2017.10.2 QBXT 模拟赛

    题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...

  6. 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] ...

  7. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  8. 2017.10.28 QB模拟赛 —— 下午

    题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...

  9. 2017.10.28 QB模拟赛 —— 上午

    题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set  死慢.. #include <cstdio> int t; long long p; int ma ...

随机推荐

  1. qpython 读入数据问题: EOF error with input / raw_input

    直接使用input会报错 EOF error with input / raw_input 原因是在qpy里console mode 命令行模式不是完全和pc上的命令行一致,所以input和raw_i ...

  2. UVaLive 4731 Cellular Network (期望DP)

    题意:手机在蜂窝网络中的定位是一个基本问题,假设蜂窝网络已经得知手机处于c1,c2,,,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手机, 但这样做很浪费带宽,由于蜂窝网络中可以得知手机在 ...

  3. Trigonometric Function - Base

    虽然三角函数是初中知识,比较简单,却也因为是初中知识,距现在比较久,难免忘掉一些,所以复习一下. 三角函数英文单词 正弦:sine 余弦:cosine 正切:tangent 余切:contangent ...

  4. LeetCode: 669 Trim a Binary Search Tree(easy)

    题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...

  5. 模板 - 动态规划 - 数位dp

    #include<bits/stdc++.h> using namespace std; #define ll long long ]; ll dp[][/*可能需要的状态2*/];//不 ...

  6. poj1088滑雪最短路径

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 97281   Accepted: 36886 Description ...

  7. poj1088(記憶化搜索)

    題目鏈接:http://poj.org/problem?id=1088 題意:中文題誒- 思路:dfs,不過直接dfs因該會超時,那我們給他加個記錄路徑就好了... 代碼: #include < ...

  8. jzoj6008. 【THUWC2019模拟2019.1.18】Sequence (矩阵加速)

    题面 茉优最近研究发现,一个人的想愿能力可以认为是字符串S的一个子串S[l,r],而连接值可以认为是这个子串的本质不同子序列个数.现在她想验证她的结论是否正确,于是她给了你Q个询问,希望你帮她来计算, ...

  9. GHOST操作

    通过详细的图文说明,怎么用ghost备份系统,以备系统中毒或者感觉不好用时,快速恢复到备份时的状态! 工具/原料 2013最新雨林木风ghostxpxp3系统或者老毛桃等工具 方法/步骤 1 重新启动 ...

  10. nodejs动态路由

    主要功能:根据输入路由的不同,加载访问不同的HTML页面 在这里我不得不说webstorm真的是一个很棒的开发工具,我学习nodejs也是用的它. 文件目录: first_server.js: 首先我 ...