套题 bestcoder 84
A题:Aaronson

静下心来观察就会发现
1.如果m大于等于n的位数,那么n直接写成二进制形式就是最优解形式
2.如果m小于n的位数,那么贪心地使得高位尽可能地多消掉n的值,因为高位少写一个数
就意味着低位要写更多位来弥补抵消
3.在第二种情况下,枚举2^m也不会超int,因为(n<le9)最多有30位,且m小于n的位数
,m就不会很大
#include <bits/stdc++.h>
using namespace std;
const int Max=1e5+;
inline int cacu(int x)
{
int ans=;
while(x)
{
ans++;
x/=;
}
return ans;
}
int main()
{
int T;
for(scanf("%d",&T);T;T--)
{
int n,m;
scanf("%d%d",&n,&m);
m+=;
int c=cacu(n);
int sum;
if(m>=c)
{
sum=;
while(n)
{
if(n&) sum+=;
n>>=;
}
}
else
{
sum=;
int re;
while(n)
{
re=n/(<<(m-));
sum+=re;
n=n-re*(<<(m-));
m--;
}
}
cout<<sum<<endl;
}
return ;
}
B题:Bellovin
给出一个序列,求与这个序列LIS相同的最小字母序序列
观察可知,答案即为求每位LIS
以dp[x]代表长度为x的LIS,且dp[x]==LIS长度为x的末尾值
每次都往前取dp[x]中最小的一个,当然在保证x尽可能地大的情况下
因为dp[x]是递增的,所以可以二分,l=1,r=当前最长的LIS
求得当前以小于当前a[i]的最长LIS
#include <bits/stdc++.h>
using namespace std;
const int Max=1e5+;
int A[Max];
int dp[Max];
int LIS[Max];
void Get_lis(int n)
{
int i,j,l,r,mid,ans;
dp[]=A[];
int len=;
for(i=;i<=n;i++)
{
if(dp[len]<A[i]) j=++len;
else
{
l=;r=len;
ans=;
while(l<=r)
{
mid=(l+r)>>;
if(A[i]>dp[mid]&&A[i]<=dp[mid+])
{
ans=mid;break;
}
else if(A[i]>dp[mid]) l=mid+;
else r=mid-;
}
j=ans+;
}
dp[j]=A[i];
LIS[i]=j;
}
}
int main()
{
int T;
for(scanf("%d",&T);T;T--)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&A[i]);
dp[i]=;
}
LIS[]=;
Get_lis(n);
for(int i=;i<=n;i++)
{
if(i!=) printf(" ");
printf("%d",LIS[i]);
}
puts("");
}
return ;
}
C题:Colmerauer
已知一个鞍点可覆盖范围是一个矩形,以这个鞍点作为原点
可以利用单调栈求出它的(u,l,d,r)
在枚举子矩阵的时候,会有多少次覆盖到这个鞍点的区域?
不如思考一下这个鞍点的区域可以分成多少个子矩阵
分类:
将鞍点看做原点0,那么原本的左右区间可以写成(-l,r);
鞍点在x轴上可以分为三部分:(-l,0,r)
那么左边的长度有l种,右边也有r种
分类法加分步法分析:
第一种:先选左边:那么左边l种区间的长度和为(l)(l+1)/2,因为此时右边可以任选,
,有r+1(包括原点)种方式,再乘以r+1
第二种:先选右边: 那么右边(r+1)(包括鞍点自身)种区间的长度和为(r+1)(r+2)/2,因为
此时左边可以任选,有l+1种方式,再乘以l+1
鞍点在y轴上的区分求法同上
注意此题求出的l,r,u,d比实际值高了一位
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD=(LL)(<<)*(LL)(<<);
const int Max=1e3+;
const int inf=0x3f3f3f3f;
int matrix[Max][Max],l[Max][Max],r[Max][Max],
u[Max][Max],d[Max][Max];
stack<int>st;
LL Cacu(int x,int y)
{
LL ans=(x*(x+)/*(y+)%MOD+(y+)*(y+)/*(x+)%MOD)%MOD;
return ans;
}
int main()
{
int T;
for(scanf("%d",&T); T; T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++) for(int j=; j<=m; j++)
scanf("%d",&matrix[i][j]); //行中最小
for(int i=; i<=n; i++)
{
matrix[i][m+]=matrix[i][]=-inf;
while(!st.empty()) st.pop();
st.push();
for(int j=; j<=m; j++)
{
while(!st.empty()&&matrix[i][st.top()]>matrix[i][j]) st.pop();
l[i][j]=st.top();
st.push(j);
}
while(!st.empty()) st.pop();
st.push(m+); for(int j=m; j>=; j--)
{
while(!st.empty()&&matrix[i][st.top()]>matrix[i][j]) st.pop();
r[i][j]=st.top();
st.push(j);
}
} //列中最大
for(int j=; j<=m; j++)
{
matrix[][j]=matrix[n+][j]=inf;
//这里是为了保证u[1]=0和d[n]=n+1,因此要设到最大
while(!st.empty()) st.pop();
st.push();
for(int i=; i<=n; i++)
{
while(!st.empty()&&matrix[st.top()][j]<matrix[i][j]) st.pop();
u[i][j]=st.top();
st.push(i);
}
while(!st.empty()) st.pop();
st.push(n+);
for(int i=n; i>=; i--)
{
while(!st.empty()&&matrix[st.top()][j]<matrix[i][j]) st.pop();
d[i][j]=st.top();
st.push(i);
}
}
LL ans=;
int uy,dy,lx,rx;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
uy=i-u[i][j]-;lx=j-l[i][j]-;
dy=d[i][j]-i-;rx=r[i][j]-j-;
ans=(ans+(Cacu(uy,dy)*Cacu(lx,rx)%MOD*matrix[i][j]))%MOD;
}
}
printf("%I64d\n",ans);
}
return ;
}
D题:Dertouzos
求1到n-1中最大因数是d的数的个数
设m是1到n-1的任意一个数
设m=d*r,若d是m的最大因数,r必须满足:
1.r必然是m的最小因数,
2.r必然是素数,不然总可以拆成另外的几个数,导致存在比d大的因数
3.r必然小于等于d
可以看到,m最大是n-1,r最大是n-1/d
那么可以从最小素数2开始进行检查,看其是否能成为r
1到1e9的素数筛出来,过于艰难
通过观察可以发现:
当d很小时,由于r小于等于d,循环d次即可
当d很大时,由于r小于等于n-1/d,循环次数也不会很多
可以将d<=1e4时当作很小进行分析:
d<=1e4,r不会超过1e4
d>1e4,n最高等于1e9,n-1/d<=1e5,r不会超过1e5
因此我们只要筛出1到1e5的素数就好了
#include <bits/stdc++.h>
using namespace std;
const int Max=1e7+;
int prime[Max],is_prime[Max],top;
void Erato()
{
int m,n;
n=1e5+;
for(int i=; i<=n; i++) if(!is_prime[i])
{
prime[top++]=i;
for(int j=i*; j<=n; j+=i) is_prime[j]=;
}
}
int check(int n,int d)
{
int ans=;
for(int i=; i<top; i++)
{
if(d*prime[i]>=n) return ans;
if(d%prime[i]==) return ans+; //包括自身
ans++;
}
return ans;
}
int main()
{
Erato();
int T;
for(scanf("%d",&T); T; T--)
{
int n,d;
scanf("%d%d",&n,&d);
int ans=check(n,d);
printf("%d\n",ans);
}
return ;
}
E题:Eades
待续。。。。。。
套题 bestcoder 84的更多相关文章
- 第46套题【STL】【贪心】【递推】【BFS 图】
已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...
- Educational Codeforces Round 15 套题
这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...
- 【套题】qbxt国庆刷题班D1
Day1 事实上D1的题目还是比较简单的= =然而D1T2爆炸了就十分尴尬--错失一波键盘 看题 T1 传送门 Description 现在你手里有一个计算器,上面显示了一个数\(S\),这个计算器十 ...
- Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告
写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...
- Tarjan & LCA 套题题目题解
刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...
- 套题 codeforces 361
A题((Mike and Cellphone) 看起来好像需要模拟数字键位的运动,可是,只要判断出那些必然YES的数字组合不就好了么 #include <cstdio> #include ...
- 套题 codeforces 360
A题:Opponents 直接模拟 #include <bits/stdc++.h> using namespace std; ]; int main() { int n,k; while ...
- 套题 codeforces 359
A题:Free Ice Cream 注意要使用LL,避免爆int #include <bits/stdc++.h> #define scan(x,y) scanf("%d%d&q ...
- 套题T8&T9
A - 8球胜负(eight) Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submi ...
随机推荐
- linux中软链接打包、计算以及同步
目录test中存在软连接: 1.打包,参数h(将实际文件进行打包): tar zcvfPh test.tar.gz test 2.计算大小,参数L(计算的是实际文件的大小): du -sL te ...
- Aspose.Words 的使用 Aspose.Total_for_.NET
最近在做有个业务需要Word做好模版,数据库取出业务数据在写入Word模版里面,然后生成PDF给客户端的业务人员 之前找了半天,没有找到用微软的Microsoft.Office.Interop.Wor ...
- Extract QQ from iPhone and analyze it
QQ is one of the most popular chat App in the world. Now let me show you how to extract QQ from iPho ...
- IMS Global Learning Tools Interoperability™ Implementation Guide
Final Version 1.1 Date Issued: 13 March 2012 Latest version: http://www.imsglobal ...
- js编码
var url = encodeURI(encodeURI("search-keyword-"+keyword+".html")); 后台uri = Strin ...
- [cocos2d-js]cc.RenderTexture几种用法(数字图片、刮刮乐效果)
[转]http://blog.csdn.net/realcrazysun1/article/details/42393629 本文基于cocos2d-js 3.0版本引擎开发 RenderTextur ...
- 【软件工程】电梯调度的初步实现 李亚文&&郭莉莉
一.开门见山,代码粘 using System; using System.Collections.Generic; using System.Data; using System.Drawing; ...
- js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“
js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“ var reg = /^[a-zA-Z]{1}(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d_@ ...
- Groovy basic
1. print println "Hello Groovy!" you can use java in Groovy System.out.println("Hello ...
- POJ 2155 Matrix (二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460 Descripti ...