10.13NOIP模拟题

/*
容斥原理
考虑到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模拟题的更多相关文章
- 10.23NOIP模拟题
叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...
- 10.9NOIP模拟题
/* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- 10.12NOIP模拟题(1)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- 10.11NOIP模拟题(3)
/* 可以看出,对于一段区间[L,R]如果统计了答案 若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理 所以两个指针分别从头尾往中间扫那边小移哪边即可. */ ...
- 10.11NOIP模拟题(2)
/* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
- sdut 2162:The Android University ACM Team Selection Contest(第二届山东省省赛原题,模拟题)
The Android University ACM Team Selection Contest Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里 ...
随机推荐
- 被老板逼着实现了Excle的透视表分析算法
package com.example.demo; import java.sql.SQLException;import java.util.ArrayList;import java.util.H ...
- 洛谷P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- PatentTips - Hierarchical RAID system including multiple RAIDs
BACKGROUND OF THE INVENTION The present invention relates to a storage system offering large capacit ...
- POJ 1064_Cable master
题意: 给定一系列长度的电缆,将他们切成K条相等长度的电缆,问每条最长有多长? 分析: 对长度进行二分,判断能否满足K条. 二分搜索: 在求解最大化或最小化问题中,能够比较简单的判断条件是否满足,那么 ...
- P1765 手机_NOI导刊2010普及(10)
P1765 手机_NOI导刊2010普及(10) 题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 ...
- 一个简单的Java文件工具类
package com.xyworkroom.ntko.util; import java.io.File; import java.io.FileInputStream; import java.i ...
- Dell PowerEdge RAID Controller (PERC) | Dell
Dell PowerEdge RAID Controller (PERC) The Dell™ PERC (PowerEdge™ RAID Controller) fami ...
- Maven项目中遇到的奇葩问题(续)
场景描写叙述 开发项目搞环境是一个很蛋疼的问题.总是会遇到各种奇葩的问题,上一篇文章http://blog.csdn.net/gao36951/article/details/50955526中遇到的 ...
- JAVA获取操作系统的信息
列出全部信息: Properties prop = System.getProperties(); prop.list(System.out); 获取某个信息: String os = prop.ge ...
- android 加密手机完毕后待机两分钟出现有频率的杂音
这个音效是code里面主动加的,是为了提醒end user输入PIN的一个提示音,也标志着加密手机动作的完毕. 详细位置是在alps\packages\apps\Settings\src\com\an ...