/*
容斥原理
考虑到a[i]要么不会太大,要么就对答案贡献很小
dfs即可
*/
#include<bits/stdc++.h> #define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++) using namespace std; 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;
} ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);} 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()
{
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
n=read();
m=read();
rep(i,,m)a[i]=read();
dfs(,,);
cout<<ans<<endl;
return ;
}

#include<bits/stdc++.h>

#define N 20000007

using namespace std;
int n,k,num,cnt,ans,mx,mn;
int a[N],k_th[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline bool cmp(int a,int b)
{
return a>b;
} int main()
{
freopen("kth.in","r",stdin);
freopen("kth.out","w",stdout);
n=read();k=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++)
{
mx=mn=a[i];
for(int j=i+;j<=n;j++)
{
if(a[j]>mx) mx=a[j];
if(a[j]<mn) mn=a[j];
k_th[++cnt]=mx-mn;
}
}
sort(k_th+,k_th+cnt+,cmp);
printf("%d\n",k_th[k]);
return ;
}

30暴力

/*
二分+单调队列
可以看出对于一个区间[L,R],[L-1,R]的价值一定不比他小
所以答案可以二分,然后判断是否这个答案是第k大
可以用单调队列维护最大最小值,对于每一个右端点,
找距离它最近的左端点满足这个区间的价值<=k,那么这个左端点往左都是比当前二分出答案大的。
复杂度 O(nlogn)
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 410007
#define ll long long using namespace std;
ll n,m,k,ans,cnt;
ll a[N],q1[N],q2[N]; inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} bool judge(int x)
{
int l=,r=,L=,R=;
ll res=;q1[]=,q2[]=;
int Left=;
if(x==) res=;else res=;
for(int i=;i<=n;i++)
{
while(l<=r && a[i]<=a[q1[r]]) --r;
q1[++r]=i;
while(L<=R && a[i]>=a[q2[R]]) --R;
q2[++R]=i; while(Left<i)
{
int tmp1=l,tmp2=L;Left++;
while(q1[tmp1]<Left) tmp1++;
while(q2[tmp2]<Left) tmp2++;
if(a[q2[tmp2]]-a[q1[tmp1]]>=x) l=tmp1,L=tmp2;
else {Left--;break;}
}
if(a[q2[L]]-a[q1[l]]>=x) res+=Left;
}
return res>=k;
} int main()
{
freopen("kth.in","r",stdin);
freopen("kth.out","w",stdout);
int x,y;
n=read();k=read();
for(int i=;i<=n;i++) a[i]=read();
int l_=,r_=;
while(l_<=r_)
{
int mid=(l_+r_)>>;
if(judge(mid))ans=mid,l_=mid+;
else r_=mid-;
}
cout<<ans<<endl;
return ;
}

/*
特别好的思路
考虑如果选定了几个武器要求这些武器都不被摧毁,判断是否可能
从左到右判断,需要无后效性,所以显然要按攻击力从小到大放
那么每放入一个选定的武器后在其后面添加r个比他攻击力小的武器
若当前找不出r个比它攻击力小的武器则判断失败
以上判断有个简单的表示方式:攻击力第i小的选定武器其攻击力在所有武器中的排名需
要>=i*(r+1)
状态很巧妙 dp[i][j]表示前j个武器选了i个且判定合法的战场贡献最大值
转移的时候判断第j个选不选即可
*/
#include<bits/stdc++.h> #define N 5007
#define inf 0x3f3f3f3f using namespace std;
int n,m,r,ans,cnt;
int dp[N][N];
struct node{
int f,w;
bool operator < (const node &a) const{
return f<a.f;
}
}p[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
freopen("submax.in","r",stdin);
freopen("submax.out","w",stdout);
int T;T=read();
while(T--)
{
n=read();r=read();
for(int i=;i<=n;i++) p[i].f=read();
for(int i=;i<=n;i++) p[i].w=read();
sort(p+,p+n+);
m=n/(r+)+;ans=;
memset(dp,,sizeof dp);
for(int i=;i<=m;i++)
{
int R=min(n,i*(r+));
for(int j=;j<=R-;j++) dp[i][j]=-inf;
for(int j=R;j<=n;j++)
dp[i][j]=max(dp[i][j-],dp[i-][j-]+p[j].w);
ans=max(ans,dp[i][n]);
}
printf("%d\n",ans);
}
return ;
}
p noip 提高组模拟赛 day1
.计数
(count.cpp/c/pas)
.计数
(count.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
给出 m 个数 a[],a[],…,a[m]
求 ~n 中有多少数不是 a[],a[],…,a[m]的倍数。
【输入】
输入文件名为 count.in。
第一行,包含两个整数:n,m
第二行,包含 m 个数,表示a[],a[],…,a[m]
【输出】
输出文件名为 count.out。
输出一行,包含 个整数,表示答案
【输入输出样例】
count.in count.out 【数据说明】
对于 %的数据,<=n<= 对于另外 %的数据,m=
对于 %的数据,<=n<=
,<m<=,<=a[i]<=
更多资 询 :北京信息学窦老师 QQ3377089232
.区间第 k 大
(kth.cpp/c/pas)
.区间第 k 大
(kth.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
一个区间的价值定义为该区间中的最大值减最小值
给定 n 个数,求所有区间价值中,第 k 大值为多少。
【输入】
输入文件名为 kth.in。
第 行两个数 n、k(k<=n*(n-)/)
第 行 n 个数,每个数<= 【输出】
输出文件名为 kth.out。
输出区间价值的第 k 大值。
【输入输出样例】
kth.in kth.out 【样例解释】
[l,r]表示第 l 个数到第 r 个数组成的区间的价值
[,]= [,]= [,]=
[,]= [,]=
[,]=
【数据说明】
对于 %的数据,n=
对于 %的数据,n<=
对于 %的数据,n<=
更多资 询 :北京信息学窦老师 QQ3377089232
.武器分配
(submax.cpp/c/pas)
.武器分配
(submax.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
有 n 个堡垒排成一排构成了一条防御线。 现在需要将 n 个武器放入这 n 个堡垒中, 每个
堡垒放一个,每个武器有攻击力和战场贡献值两个属性。
由于这 n 个武器都不是人为操控的, 所以会对其某半径内所有单位进行攻击, 而这就导
致某些堡垒的互相攻击。现在发现第 i 个堡垒会和第 j 个堡垒互相攻击当且仅当|i-j|<=r,
且攻击力较低的武器和他所在的堡垒会破损。
现在你需要给出一种武器分配方案使得未破损武器的战场贡献值总和最大。 为了方便你
只需输出战场贡献值总和的最大值即可。
【输入】
输入文件名为submax.in。
第一行一个数 T(<=),表示数据组数
对于每一组数据:
第一行两个数 n,r
第二行 n 个数,表示 ~n 号武器的攻击力
第三行 n 个数,表示 ~n 号武器的战场贡献值
【输出】
输出文件名为submax.out。
对于每组数据输出一个数,表示答案
【输入输出样例】
submax.in submax.out 【数据范围】
对于 %的数据:n<=
对于 %的数据,n<=
对于 %的数据,n<=,武器攻击力<= 且两两不同,武器的战场贡献值
<=,r<n
更多资 询 :北京信息学窦老师 QQ3377089232

题面

10.13NOIP模拟题的更多相关文章

  1. 10.23NOIP模拟题

    叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...

  2. 10.9NOIP模拟题

    /* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...

  3. 10.12NOIP模拟题(2)

    /* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...

  4. 10.12NOIP模拟题(1)

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...

  5. 10.11NOIP模拟题(3)

    /* 可以看出,对于一段区间[L,R]如果统计了答案 若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理 所以两个指针分别从头尾往中间扫那边小移哪边即可. */ ...

  6. 10.11NOIP模拟题(2)

    /* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...

  7. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  8. poj 1888 Crossword Answers 模拟题

    Crossword Answers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 869   Accepted: 405 D ...

  9. sdut 2162:The Android University ACM Team Selection Contest(第二届山东省省赛原题,模拟题)

    The Android University ACM Team Selection Contest Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里 ...

随机推荐

  1. 【03】emmet系列之CSS语法

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写   单位: 有几个常用值别 ...

  2. 经典算法入门 列表C/C++

    排序:插入排序.选择排序.冒泡排序.归并排序.快速排序.基数排序.计数排序.桶排序 查找:二分查找 树:先根.中根.后跟遍历 图:深度优先.广度优先.最小生成树.单元最短路径.全成对最短路径 动态规划 ...

  3. 关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse

    ---转载自:https://www.cnblogs.com/mei0619/p/8341159.html request对象的生成方式不是ServletRequest request = new S ...

  4. HUST 1407(数据结构)

    1407 - 郁闷的小J 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所 ...

  5. Linux下汇编语言学习笔记43 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  6. Android GIS开发系列-- 入门季(10) MapView快速定位到Geometry

    我们知道某个Geometry的坐标,但不知道具体的位置,该如何使地图快速定位呢?这时需要用到MapView.setExtent方法,来看下这个方法的介绍:Zooms the map to the gi ...

  7. crontab not running

    there are mutliple ways to describle this issue 1. crontab not running 2. crontab not running and no ...

  8. 电脑无线WIFI怎么共享给手机

    点屏幕右下角的那个小电脑(网络)标志,里面有打开网络和共享中. 选左上角管理无线网络——选择添加. 选择创建临时网络——点击下一步——输入网络名称. 安全类型选择WEP——安全密钥为10位数字——然后 ...

  9. Python学习系列之内置函数

    数学相关 abs(a):求取绝对值 max(list):求取list最大值 min(list):求取list最小值 sum(list):求取list元素的和 sorted(list):排序,返回排序后 ...

  10. 搭建ELK收集PHP的日志

    架构: filebeat --> redis -->logstash --> es --> kibana 每个客户端需要安装filebeat收集PHP日志 filebeat把收 ...