A题((Mike and Cellphone)

看起来好像需要模拟数字键位的运动,可是,
只要判断出那些必然YES的数字组合不就好了么

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int vis[];
inline bool judge()
{
if(vis[]&&vis[]) return true;
if(vis[]&&vis[]) return true;
if(vis[]&&(vis[]||vis[]||vis[])) return true;
if((vis[]||vis[])&&vis[]&&vis[]) return true;
if((vis[]||vis[])&&vis[]&&vis[]) return true;
if(vis[]&&vis[]&&vis[]) return true;
return false;
}
char ch[];
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",ch);
int x;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
x=ch[i]-'';
vis[x]=;
}
if(judge())
{
printf("YES\n");
}
else printf("NO\n");
}
return ;
}

B题((Mike and Shortcuts)
题意:对于n个点,可以从1开始直接走过去,代价是abs(x-1),也可以通过某种捷径而到,代价是1
解题:难点在于建图,每个点之间都连通,难道要建n^2条边?
1.在不考虑捷径的情况下,每两个点之间的距离是两者之差的绝对值
2.任意两点没有必要都建一条边使得他们直接相连,对于任意的一个点,只要相邻的两个
点与它建一条代价为1的边,这样任意两点都能够间接相连,而且代价累加起来正好是距离。
3.最后再加上捷径,最多有n条,总共会有3*n条边,由于不存在负权回路,使用DIJKSTRA+优先队列
优化,时间复杂度是O(ElogE).

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int Max=+;
int abs(int x) {return x>=?x:-x;}
int n,m;
struct Edge{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
vector <Edge> edges;
vector <int> G[Max];
int d[Max];
void Init()
{
for(int i=;i<=n;i++) G[i].clear();
edges.clear();
}
void AddEdge(int from,int to,int dist)
{
edges.push_back(Edge(from,to,dist));
m=edges.size();
G[from].push_back(m-);
}
struct node
{
int d,u;
node(int dd,int uu):d(dd),u(uu){};
bool operator < (const node & rhs) const {
return d>rhs.d;
}
};
const int INF=0x3f3f3f3f;
bool done[Max];
void Dijkstra(int s)
{
priority_queue<node>Q;
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
memset(done,,sizeof(done));
Q.push(node(,s));
while(!Q.empty())
{
node x=Q.top();Q.pop();
int u=x.u;
if(done[u]) continue;
done[u]=true;
for(int i=;i<G[u].size();i++)
{
Edge &e=edges[G[u][i]];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]=d[u]+e.dist;
Q.push(node(d[e.to],e.to));
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
int x;
Init();
for(int i=;i<=n;i++)
{
scanf("%d",&x);
AddEdge(i-,i,);
AddEdge(i+,i,);
AddEdge(i,x,);
}
Dijkstra();
for(int i=;i<=n;i++)
{
if(i!=) printf(" ");
printf("%d",d[i]);
}
puts("");
}
return ;
}

C题(Mike and Chocolate Thieves)
要求一个四元组,并且这个四元组成k倍关系。
可知n越大,种数越多,且种类数取决于k。
对于这样一个有序关系,可以使用二分查找

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n;
LL cacu(LL x)
{
LL sum=;
for(LL i=;i<=1e6;i++)
{
if(i*i*i>x) break;
sum+=x/(i*i*i);
}
return sum;
}
int main()
{
while(~scanf("%I64d",&n))
{
LL l=,r=1e18,m;
while(l<=r)
{
m=(l+r)>>;
if(cacu(m)>=n) r=m-;
else l=m+;
}
if(cacu(r+)!=n) puts("-1");
else printf("%I64d\n",r+);
}
return ;
}

D题(Friends and Subsequences)
对于每个max(ai)==min(bj)
枚举所有的左区间,
max(ai)是递增的,min(bj)是递减的
因此对max(ai)-min(bj)可以进行二分查找
二分查找满足条件的下界和上界
RMQ可以使用ST算法实现

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+;
int A[N],B[N];
int mn[N][],mx[N][];
void RMQ_init(int n)
{
for(int i=;i<=n;i++) mx[i][]=A[i],mn[i][]=B[i];
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]);
}
}
}
int RMQ(int L,int R,int flag)
{
int k=;
while((<<(k+))<=R-L+) k++;
if(flag)
return max(mx[L][k],mx[R-(<<k)+][k]);
else
return min(mn[L][k],mn[R-(<<k)+][k]);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++) scanf("%d",&A[i]);
for(int i=;i<=n;i++) scanf("%d",&B[i]);
RMQ_init(n);
long long sum=;
for(int i=;i<=n;i++)
{
int l,r,mid,ansr,ansl,ma,mb;
ansl=ansr=-;
l=i;r=n;
while(l<=r)
{
mid=l+(r-l)/;
ma=RMQ(i,mid,);mb=RMQ(i,mid,);
if(ma==mb) l=mid+,ansr=mid;
else
if(ma>mb) r=mid-;
else l=mid+;
}
l=i;r=n;
while(l<=r)
{
mid=l+(r-l)/;
ma=RMQ(i,mid,);mb=RMQ(i,mid,);
if(ma==mb) r=mid-,ansl=mid;
else
if(ma>mb) r=mid-;
else l=mid+;
}
if(ansl==-||ansr==-) continue;
sum+=ansr-ansl+;
}
printf("%I64d\n",sum);
}
return ;
}

E题

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+;
const int MOD=1e9+;
LL fact[N];
LL qpow(LL x,LL k)
{
LL base=x,ans=;
while(k)
{
if(k&) ans=(ans*base)%MOD;
base=(base*base)%MOD;
k>>=;
}
return ans;
}
LL inv(LL x)
{
return qpow(x,MOD-);
}
LL C(int n,int k)
{
LL ans=fact[n]*inv(fact[k])%MOD*inv(fact[n-k])%MOD;
return ans;
}
map<int,int>book;
int main()
{
int n,k,l,r,ans,add,dist;
cin>>n>>k;
fact[]=;
for(int i=;i<=n;i++) fact[i]=(fact[i-]*i)%MOD;
for(int i=;i<n;i++)
{
cin>>l>>r;
book[l]++;
book[r+]--;
}
ans=add=;
l=book.begin()->first;
map<int,int>::iterator it;
for(it=book.begin();it!=book.end();it++)
{
dist=it->first-l;
if(add>=k) ans=(ans+C(add,k)*dist)%MOD;
add+=it->second;
l=it->first;
}
cout<<ans<<endl;
return ;
}

套题 codeforces 361的更多相关文章

  1. 套题 codeforces 359

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

  2. 套题 codeforces 360

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

  3. 套题 Codeforces Round #277 (Div. 2)

    A. Calculating Function 水题,分奇数偶数处理一下就好了 #include<stdio.h> #include<iostream> using names ...

  4. Educational Codeforces Round 15 套题

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

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

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

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

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

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

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

  8. Codeforces Round #361 (Div. 2) 套题

    A - Mike and Cellphone 问有没有多解,每个点按照给出的序列用向量法跑一遍 #include<cstdio> #include<cstring> #incl ...

  9. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

随机推荐

  1. 为什么重写equals时必须重写hashCode方法?

    原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现Stri ...

  2. flash中字体兼容性

    非谷歌浏览器设置字体font时需设置为该字体的(英文名字)或者(中文名字+可读性消除锯齿), 谷歌浏览器设置字体font时需设置为该字体的(中文名字) 总结:静态文本一般通过选择可读性消除锯齿来能实现 ...

  3. APP如何实现推送功能

    一.推送功能的集成 (1)在Umeng开发者中心,申请新应用,开通推送功能.此时需要上传开发推送证书和生产推送证书的p12文件. 申请证书的流程如下: >>1 创建开发推送证书 >& ...

  4. 微信web开发者工具初探

    最近需要在微信企业号中挂接网页,之前也没有接触过微信开发,刚开始也不知道怎么调试,后来同事介绍使用“微信web开发者工具”,于是在网上下了一个,使用了一下的确很好用.它不仅支持Android和IOS同 ...

  5. 16.10.18学到的Java知识

    1. 突然间发现自己忘了关于自增自减运算符放在变量前后的区别是什么了? 于是乎,我查了资料. 如果只对自变量进行加1或减1的时候,放在前面和后面都是没有区别的. 但是,如果自增自减运算符使用在需要赋值 ...

  6. softmax分类器+cross entropy损失函数的求导

    softmax是logisitic regression在多酚类问题上的推广,\(W=[w_1,w_2,...,w_c]\)为各个类的权重因子,\(b\)为各类的门槛值.不要想象成超平面,否则很难理解 ...

  7. flask-admin章节五:wtforms FormField超级炫酷使用

    1. 概述 查看wtforms代码树fields目录的core.py,会发现在文件开头有这样的语句: __all__ = ( 'BooleanField', 'DecimalField', 'Date ...

  8. android Handler机制详解

      简单运行图:    名词解析: Message(消息):定义了一个包含描述以及随意的数据对象可以被发送到Hanlder的消息,获得消息的最好方法是Message.obtain或者Handler.o ...

  9. maven使用

    Maven是一个项目管理和构建自动化工具.但是对于我们程序员来说,我们最关心的是它的项目构建功能,它定义了项目开发的几个标准步骤:编译,发布,单元测试及部署以帮助项目开发 最简单的时候场景是,在pom ...

  10. 第一节(配置springmvc环境)学习尚硅谷-springmvc视频教程

    之前,一直从事C#开发.后来,公司调整后领导决定使用java开发,因此需要收集相关学习资料.该视频教程比较入门,也适合自己,于是边看边写的同时再总结一下便于自己牢记,遇到分歧不对之处望指正. 开发环境 ...