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. c++模板使用出错情况error LNK2019: unresolved external symbol "public: float __thiscall Compare<float>::min(void)" (?min@?$Compare@M@@QAEMXZ) referenced in function _main

    将类模板在头文件中定义,类的成员函数在头文件中声明,头文件中只留下接口,函数的实现在另一个.cpp文件中,这样编译出来错误error LNK2019: unresolved external symb ...

  2. java中运算符的优先级

    所谓优先级,就是在表达式中的运算顺序.Java 中常用的运算符的优先级如下表所示: 级别为 1 的优先级最高,级别 11 的优先级最低.譬如,x = 7 + 3 * 2  得到的结果是 13 &quo ...

  3. oracle pl/sql split函数

    在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号 ...

  4. 重启eclipse color theme失效的解决办法

    For Eclipse Mars users: In the main menu bar, go to Window > Preferences In the preference tree o ...

  5. RSA For PHP

    最近和一保险公司对接接口,对方要求RSA加密,并给一个*.jks的文件,网上搜索一番均无答案,最后在谷歌上偶然看到一个人说需要转成.pem进行读取,折腾一番直接上代码: /** * 获取RSA加密ke ...

  6. HTML和CSS设置动态导航以及CSS中伪元素的简单说明

    HTML页面代码: <!DOCTYPE html> <html> <head> <title>Test</title> <meta c ...

  7. 不容错过!2016年度优秀UI/UX设计文章

    本文整理了一些2016年度最受欢迎的文章,例如有关UI / UX设计的理论知识,书籍和工具,如何做出更好的设计的方法和建议,以及新的设计趋势. 1. 2017年用户体验设计趋势 我们期待着2017年用 ...

  8. 手机safari图片上传竖变横处理

    在手机safari上传图片时,竖着的照片会变成横着的照片,以下程序片段利用图片exif信息把图片旋转回去,代码抄自php.net官网. http://php.net/manual/zh/functio ...

  9. javascript中关于深复制与浅复制的问题

    在javascript中,变量的类型分为基本类型和引用类型. 对于基本类型的变量来说,值的复制以及作为函数参数实参传递的过程都是值的复制传递,换句话说,是会在内存中开辟出一个新空间用于存放新的值的.这 ...

  10. gcc与gdb版本兼容问题

    今天在用gdb调试C++程序的时候,想用"p i”命令打印出程序的一个局部变量i,却一直提示: No symbol "i" in current context. 我愣了 ...