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

  1. 第46套题【STL】【贪心】【递推】【BFS 图】

    已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...

  2. Educational Codeforces Round 15 套题

    这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...

  3. 【套题】qbxt国庆刷题班D1

    Day1 事实上D1的题目还是比较简单的= =然而D1T2爆炸了就十分尴尬--错失一波键盘 看题 T1 传送门 Description 现在你手里有一个计算器,上面显示了一个数\(S\),这个计算器十 ...

  4. Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

    写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...

  5. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

  6. 套题 codeforces 361

    A题((Mike and Cellphone) 看起来好像需要模拟数字键位的运动,可是,只要判断出那些必然YES的数字组合不就好了么 #include <cstdio> #include ...

  7. 套题 codeforces 360

    A题:Opponents 直接模拟 #include <bits/stdc++.h> using namespace std; ]; int main() { int n,k; while ...

  8. 套题 codeforces 359

    A题:Free Ice Cream 注意要使用LL,避免爆int #include <bits/stdc++.h> #define scan(x,y) scanf("%d%d&q ...

  9. 套题T8&T9

    A - 8球胜负(eight) Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submi ...

随机推荐

  1. C#的 is 和 as 类型转换

    C#在操作类型转换时,提供了 as 和 is , 显式,隐式类型转换,由于显式和隐式类型转换比较容易理解,这里主要介绍下 is 和 as 的转换. 1. is  转换   is 操作符指定一个对象类型 ...

  2. iOS开发--应用设置及用户默认设置【2、读取应用中的设置】

            在上一节中,我们通过探讨应用的系统设置的基本功能,了解运用bundle捆绑包以及plist文件的基本开发.用户能够使用设置应用来声明他们的偏好设置,那么我们怎样去调用用户所设置的参数呢 ...

  3. android开发之单选按钮

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  4. ASPxSpinEdit 控件的三元判断

    方法一:<dx:ASPxSpinEdit ID=" DisplayFormatString="c" Width="100px"></ ...

  5. [转载]:经纬度与WGS84坐标转换

    本代码实现在WGS84系统的大地坐标(BLH)和空间直角坐标(XYZ)的互相转换,符合标准语法,可直接使用 如下代码,输出为: WGS84:  -2175790.73969891    4461032 ...

  6. FizzlerEx —— 另一个HtmlAgilityPack的CSS选择器扩展,

    之前我介绍过HtmlAgilityPack的CSS选择器扩展——ScrapySharp,它可以非常方便的实现通过CSS选择器表达式来查询HtmlNode.今天在使用的过程中,发现它不支持nth-chi ...

  7. 关于php Hash算法的一些整理总结

    最近在公司内部的分享交流会上,有幸听到了鸟哥的关于php底层的一些算法的分享,虽然当时有些问题没有特别的明白,但是会后,查阅了各种各样的相关资料,对php的一些核心的hash算法有了进一步的理解和认识 ...

  8. oracle net manager的配置文件tnsnames.ora位置

    配置文件所在的路径:C:\app\Ling-PC\product\11.2.0\client_1\network\admin     (红色为安装的盘符位置)

  9. Jmeter外部函数引用

    Jmeter外部函数引用 1.Beanshell引用Jmeter变量 添加用户自定义变量,输入变量名称和变量值,添加Debug sampler,用于输出初始变量值.

  10. word 批量删除书签

    打开word    按住alt+F11 进入vba 界面 Sub test() Dim MyBk As Bookmark For Each MyBk In ActiveDocument.Bookmar ...