套题 codeforces 361
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的更多相关文章
- 套题 codeforces 359
A题:Free Ice Cream 注意要使用LL,避免爆int #include <bits/stdc++.h> #define scan(x,y) scanf("%d%d&q ...
- 套题 codeforces 360
A题:Opponents 直接模拟 #include <bits/stdc++.h> using namespace std; ]; int main() { int n,k; while ...
- 套题 Codeforces Round #277 (Div. 2)
A. Calculating Function 水题,分奇数偶数处理一下就好了 #include<stdio.h> #include<iostream> using names ...
- Educational Codeforces Round 15 套题
这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...
- 第46套题【STL】【贪心】【递推】【BFS 图】
已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...
- 【套题】qbxt国庆刷题班D1
Day1 事实上D1的题目还是比较简单的= =然而D1T2爆炸了就十分尴尬--错失一波键盘 看题 T1 传送门 Description 现在你手里有一个计算器,上面显示了一个数\(S\),这个计算器十 ...
- Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告
写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...
- Codeforces Round #361 (Div. 2) 套题
A - Mike and Cellphone 问有没有多解,每个点按照给出的序列用向量法跑一遍 #include<cstdio> #include<cstring> #incl ...
- Codeforces Round #579 (Div. 3) 套题 题解
A. Circle of Students 题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- python中的时间转换
Python中的时间相关库有: datetime 和time. 主要形式有: datetime timestamp 相互转换: timestamp->datetime: dt = datetim ...
- final评论II
1. Nice 项目:约跑软件 在此次六个发布作品中,此作品是唯一基于Androrid开发app.并且此作品创意和实用性很高的,跑步是人们日渐热爱的一个活动,用户广泛,并且在网上沟通交 ...
- Unity 之 Shader 对Z深度的偏移
对Z深度的偏移 Offset 指令给了我们一个操作正常的ZTest 检测结果的手段. Offset有两个参数,这两个参数理解起来不是很直观,而且具体实现是和硬件相关的 下面在实际例子中看他的效果 Sh ...
- $anchorScroll和$cache
1.$achorScroll服务---用于描点跳转 $scope.change = function(id){ $location.hash(id); $anchorScroll(); }; 只要给l ...
- android中回调函数机制完全解析
1.在要调用的业务操作中,创建一个接口,在接口中创建方法,这个方法表示的是我们原先要在业务类中执行的操作 public interface BackUpSmsListener { /** * 设置总进 ...
- Shell文本处理 - 匹配与编辑
正则表达式 符号 含义 . 匹配任意ASCII中任意单个字符,或是字母,或是数字 ^ 匹配行首 $ 匹配行尾 * 匹配任意字符或前一个的一次或多次重复 \ 转义,被转义的有$ . ‘ “ * [ ] ...
- .Net WinForm下配置Log4Net(总结不输出原因)
最近做一个winform项目,配置了Log4net 但是总是不能输出,搜索了很多文章加上自己的探索发现自己在项目中添加的 Log4Net.config 生成时没有被复制到Debug文件夹下, 所以程序 ...
- Nodejs 高并发长链接TCP链接的服务器设计问题
最近有个项目比较棘手,nodejs的tcp服务,目前的服务器支持3W左右的客户端连接,但是客户希望能够支持30W左右,原先的模型是让客户端请求一个地址分发服务器,然后再tcp链接到不同的地址上实现高并 ...
- jquery之右下角消息提示框
messager.js (function (jQuery) { var window; var obj = new Object(); obj.version = '@1.0'; obj.title ...
- jekyll安装的斗智斗勇
jekyll---将纯文本转化为静态网站和博客,GitHub Pages 可以运行 Jekyll,你很简单就可以完全免费的在 GitHub 上发布网站. 小白安装jekyll时的若干问题,有错误欢迎指 ...