A

脑筋急转弯

 // #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = <<;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-); //void fre() {
// freopen("in.txt","r",stdin);
//}
int vis[];
int ans[];
int main(){
int n;
string s;
cin>>n;
cin>>s;
clc(vis,);
clc(ans,);
for(int i=;i<s.length();i++) vis[s[i]-'']=true;
for(int i=;i<=;i++){
if(!vis[i]) continue;
if(i==||i==||i==) ans[]=;
if(i==||i==||i==||i==) ans[]=;
if(i==||i==||i==) ans[]=;
if(i==||i==||i==||i==) ans[]=;
}
printf("%s\n",ans[]&ans[]&ans[]&ans[]?"YES":"NO");
return ;
}

B - Mike and Shortcuts

从i到j的花费是fabs(j-i)

现在每个点有一条路ai,可以使得i走到ai的花费为1

现在问你从1走到i点的花费是多少

搜索i点前后两个点

 // #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-); //void fre() {
// freopen("in.txt","r",stdin);
//}
int a[N];
int ans[N];
int vis[N];
int n;
struct Node{
int x,w;
Node(int a,int b):x(a),w(b){}
};
void bfs(){
queue<Node>q;
q.push(Node(,));
while(!q.empty()){
Node f=q.front();
q.pop();
if(vis[f.x]) continue;
vis[f.x]=true;
ans[f.x]=f.w;
if(!vis[a[f.x]])
q.push(Node(a[f.x],f.w+));
if(!vis[f.x+]&&(f.x+)<=n)
q.push(Node(f.x+,f.w+));
if(!vis[f.x-]&&(f.x-)>=)
q.push(Node(f.x-,f.w+));
}
}
int main(){
// int n;
cin>>n;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
bfs();
for(int i=;i<=n;i++){
printf("%d%c",ans[i],i!=n?' ':'\n' );
}
return ;
}

C - Mike and Chocolate Thieves

题意:

求一个数,恰好可以分成n个(a.ak.ak^2.ak^3)的形式。且符合条件最小的数。。看样列yy一下题意。。

思路:直接二分答案

 // #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = <<;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-); //void fre() {
// freopen("in.txt","r",stdin);
//}
LL n;
LL cube(LL x){
return x*x*x;
}
LL fun(LL k){
LL sum=;
for(int i=;i<=1e6;i++){
if(cube(i)>k) break;
sum+=k/cube(i);
}
return sum;
}
int main(){
cin>>n;
LL l=,r=1e18;
LL mid;
while(l<=r){
mid=(l+r)>>;
if(fun(mid)>=n) r=mid-;
else l=mid+;
}
if(fun(r+)==n) printf("%I64d\n",r+);
else printf("-1\n");
return ;
}

D - Friends and Subsequences

题意:a b两个数组,[l,r]上,a的最大值等于b的最小值,问有几个这样区间

思路:首先一看这种题肯定是二分来做。

枚举l,二分r。a数组中最大值肯定是非递减的,b最小值肯定是非递增的。所以二分r的时候,根据这个性质。

两次二分,二分r的极右端,极左端需要技巧。看代码。

求区间最大值可以用rmq,O(n*logn+1);

线段树查询时(logn),也可以。

 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-); void fre() {
freopen("in.txt","r",stdin);
} // inline int r() {
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
// } int a[N],b[N];
int maxa[N][],minb[N][]; void init(int n){
int i,j;
for(i=;i<n;i++){
maxa[i][]=a[i];
minb[i][]=b[i];
}
for(j=;(<<j)<=n;j++)
for(i=;i+(<<j)-<n;i++){
maxa[i][j]=max(maxa[i][j-],maxa[i+(<<(j-))][j-]);
minb[i][j]=min(minb[i][j-],minb[i+(<<(j-))][j-]);
}
} int rmq(int l,int r,int c)
{
int k=;
while((<<(k+))<=r-l+) k++;
if(c)
return max(maxa[l][k],maxa[r-(<<k)+][k]);
else
return min(minb[l][k],minb[r-(<<k)+][k]);
} int main() {
// fre();
int n;
scanf("%d",&n);
for(int i=; i<n; i++)
scanf("%d",&a[i]);
for(int i=; i<n; i++)
scanf("%d",&b[i]);
init(n);
LL ans=;
for(int i=; i<n; i++) {
int l=i,r=n-;
int rmin,rmax;
bool flag=;
while(l<=r) {
int mid=(l+r)>>;
int ans_a=rmq(i,mid,);
int ans_b=rmq(i,mid,);
if(ans_a==ans_b){
flag=;
}
if(ans_a>ans_b){
r=mid-;
}
else
l=mid+;
}
if(!flag) continue;
rmax=r;
l=i;
while(l<=r){
int mid=(l+r)>>;
int ans_a=rmq(i,mid,);
int ans_b=rmq(i,mid,);
if(ans_a<ans_b)
l=mid+;
else
r=mid-;
}
rmin=l;
ans+=(LL)(rmax-rmin+);
}
printf("%I64d\n",ans);
return ;
}

E - Mike and Geometry Problem

题意:k个区间,求C(k,n)个区间的交集

思路:数据太大显然不能直接暴力。区间交集等价与每个点被覆盖了几次,最后答案就是每个点覆盖的次数C(nex,n)求和。

lucas超时,费马小。。。

统计每个点被覆盖的次数类似扫描线处理离线化树状数组

 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-); void fre() {
freopen("in.txt","r",stdin);
} // inline int r() {
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
// }
LL fac[N]; LL qpow(LL a,LL b)
{
LL ans=;a%=MOD;
for(LL i=b;i;i>>=,a=a*a%MOD)
if(i&) ans=ans*a%MOD;
return ans;
} LL Comb(LL n,LL m){
if(m>n||m<) return ;
LL s1=fac[n],s2=fac[n-m]*fac[m]%MOD;
return s1*qpow(s2,MOD-)%MOD;
}
int main(){
int k,n;
fac[]=;
fac[]=;
for(int i=;i<N;i++)
fac[i]=fac[i-]*i%MOD;
scanf("%d%d",&k,&n);
vector<pair<int,int> >p;
for(int i=;i<k;i++){
LL r,l;
scanf("%I64d %I64d",&l,&r);
p.push_back(make_pair(l-,));
p.push_back(make_pair(r,-));
}
sort(p.begin(),p.end());
LL ans=;
int nex=,last=;
for(int i=;i<(int)p.size();i++){
ans=(ans+Comb(nex,n)*(p[i].first-last))%MOD;
nex+=p[i].second;
last=p[i].first;
}
printf("%I64d\n",ans);
return ;
}

Codeforces Round #361 (Div. 2)的更多相关文章

  1. Codeforces Round #361 (Div. 2) C.NP-Hard Problem

    题目连接:http://codeforces.com/contest/688/problem/C 题意:给你一些边,问你能否构成一个二分图 题解:二分图:二分图又称作二部图,是图论中的一种特殊模型. ...

  2. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化 排列组合

    E. Mike and Geometry Problem 题目连接: http://www.codeforces.com/contest/689/problem/E Description Mike ...

  3. Codeforces Round #361 (Div. 2) D. Friends and Subsequences 二分

    D. Friends and Subsequences 题目连接: http://www.codeforces.com/contest/689/problem/D Description Mike a ...

  4. Codeforces Round #361 (Div. 2) C. Mike and Chocolate Thieves 二分

    C. Mike and Chocolate Thieves 题目连接: http://www.codeforces.com/contest/689/problem/C Description Bad ...

  5. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs

    B. Mike and Shortcuts 题目连接: http://www.codeforces.com/contest/689/problem/B Description Recently, Mi ...

  6. Codeforces Round #361 (Div. 2) A. Mike and Cellphone 水题

    A. Mike and Cellphone 题目连接: http://www.codeforces.com/contest/689/problem/A Description While swimmi ...

  7. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  8. Codeforces Round #361 (Div. 2) D

    D - Friends and Subsequences Description Mike and !Mike are old childhood rivals, they are opposite ...

  9. Codeforces Round #361 (Div. 2) C

    C - Mike and Chocolate Thieves Description Bad news came to Mike's village, some thieves stole a bun ...

  10. Codeforces Round #361 (Div. 2) B

    B - Mike and Shortcuts Description Recently, Mike was very busy with studying for exams and contests ...

随机推荐

  1. 数据挖掘10大算法(1)——PageRank

    1. 前言 这系列的文章主要讲述2006年评出的数据挖掘10大算法(见图1).文章的重点将偏向于算法的来源以及算法的主要思想,不涉及具体的实现.如果发现文中有错,希望各位指出来,一起讨论. 图1 来自 ...

  2. HTML5 增强的页面元素

    一.HTML5 改良的 input 元素的种类 1.<input type="number" id="num1"> var n1 = documen ...

  3. Android:利用SharedPreferences实现自动登录

    主要代码: public class LoginActivity extends Activity { private EditText username; private EditText user ...

  4. swift:自动引用计数ARC

    Swift自动引用计数:ARC    原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...

  5. opencv 图像阴影检测

    参数说明: IplImage *workImg-当前全局变量,表示正在显示的图片. downleft, upright- 检测出的阴影部分矩形框的两个对角顶点. /****************** ...

  6. 【转】深入解析cookie

    来源:http://www.freebuf.com/articles/web/42802.html 写的超级详细,mark下,刚好学习爬虫的时候,有用到cookie模仿登录的,就顺便了解下. 0×00 ...

  7. C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.

    使用C#编写媒体播放器时,需要用到Microsoft的Directx提供的DirectShow组件.用该组件前需要先注册程序集QuartzTypeLib.dll. 1.用QuartzTypeLib.d ...

  8. java8 十大新特性

    这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API ...

  9. JavaScript constructor 属性

    定义和用法 constructor 属性返回对创建此对象的数组函数的引用. 语法 object.constructor 实例 例子 1 在本例中,我们将展示如何使用 constructor 属性: & ...

  10. 关于ie6对齐

    先来没有任何对齐时的样子: 1.一种是在父级没有高度的情况下居中. 给每个独立的元素都加上vertical-align:middle; 针对文字可以不加,加与不加都可以居中对齐.但是无法做到绝对的居中 ...