/*
容斥原理
考虑到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. 关于No Spring WebApplicationInitializer types detected on classpath的提示,tomcat 卡主

    No Spring WebApplicationInitializer types detected on classpath 下一句:Initializing Spring root WebAppl ...

  2. node学习的一些网站

    Node.js 包教不包会 篇幅比较少 node express 入门教程 nodejs定时任务 一个nodejs博客 [NodeJS 学习笔记04]新闻发布系统 过年7天乐,学nodejs 也快乐 ...

  3. noip模拟赛 区间

    分析:要遍历所有的区间,肯定是枚举左端点,然后再枚举右端点.关键是怎么高效地求区间&,|,一般而言是用前缀和的,但是&,|不满足区间可减性,所以可以考虑线段树?这道题不带修改操作,用线 ...

  4. HDU 5950 Recursive sequence 递推转矩阵

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. 洛谷 P2237 [USACO14FEB]自动完成Auto-complete

    P2237 [USACO14FEB]自动完成Auto-complete 题目描述 Bessie the cow has a new cell phone and enjoys sending text ...

  6. MongoDB小结15 - find【查询条件$ne】

    $ne表示不相等 db.user.find({"name":{"$ne":"william"}})

  7. Orcle定时生成表数据作业

    --建表 create table table41( id ) not null, --主键 col1 ), col2 ), col3 ), col4 int, col5 timestamp, col ...

  8. 条款三:尽量用new和delete而不用malloc和free

    malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数. 假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new: s ...

  9. IOS View编程指南笔记

    我们所示程序 对于一切IOS APP来说.我们看的的内容,都是UIView所呈现的. UIView如场景,UIWindow如舞台.UIView粉墨登场在UIWindow这个舞台上,使我们看到丰富多彩的 ...

  10. PHP中的extract函数的用途 extract($_GET);extract($_POST)

    把客户端表单中的变量名取出来 addslashes -- 使用反斜线引用字符串 extract(addslashes($_POST)); --处理POST表单 把客户端<FORM METHOD= ...