本来打算划划水洗洗睡了,突然听到这次的主人公是冈部伦太郎

石头门(《steins;gate》)主题的比赛,岂有不打之理!

石头门真的很棒啊!人设也好剧情也赞曲子也特别好听。

推荐http://music.163.com/#/m/song?id=26259014&userid=115264555

(强行跑题)

Okabe and Future Gadget Laboratory

O(n^4)暴力妥妥的

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
vector<int>r[],c[];
int mp[][];
int check(int a,int x,int y){
for(int i=;i<r[x].size();i++){
for(int j=;j<c[y].size();j++){
if(r[x][i]+c[y][j]==a)return ;
}
}
return ;
}
int main(){
int i,j;
int n=read();
for(i=;i<=n;i++){
for(j=;j<=n;j++){
mp[i][j]=read();
r[i].push_back(mp[i][j]);
c[j].push_back(mp[i][j]);
}
}
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(mp[i][j]==)continue;
if(!check(mp[i][j],i,j)){
printf("NO\n");
return ;
}
}
}
printf("YES\n");
return ;
}

A

Okabe and Banana Trees

枚举 扫描

发现枚举横坐标最多需要枚举1e7次

推一下收益的式子就可以了。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
LL calc(LL x,LL y){
LL res=(+y)*y/*(x+);
res+=(+x)*x/*y;
res+=(+x)*x/;
return res;
}
LL ans=;
int main(){
int i,j;
int m,b;
m=read();b=read();
for(int i=;i>=;i++){
int y=b-ceil((double)i/m);
if(y<)break;
ans=max(ans,calc(i,y));
}
printf("%I64d\n",ans);
return ;
}

B

Okabe and Boxes

贪心 构造

显然当不能满足要求的出栈序的时候就要把栈内元素排序。

真的都排序的话复杂度受不了,只存还没有排过序的就可以了

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
priority_queue<int>q;
int last,ord;
int n,x;
char s[];
int st[mxn],top=;
int main(){
int i,j;
n=read();
int ed=n<<;
ord=;
int ans=;
for(i=;i<=ed;i++){
// printf("i:%d\n",i);
scanf("%s",s);
if(s[]=='a'){
scanf("%d",&x);
q.push(-x);
st[++top]=x;
last=x;
}
else{//remove
if(last==ord){
q.pop();
ord++;
if(top)top--;
if(top){
last=st[top];
}
else last=-q.top();
}
else{
ans++;
ord++;
q.pop();
last=-q.top();
top=;
}
}
// printf("top:%d last:%d\n",q.top(),last);
}
printf("%d\n",ans);
return ;
}

C

Okabe and City

图论 最短路 脑洞题

正解是把每行每列看做一个点,在这些点和原有的点之间花式连边跑最短路。

然而博主用非显式建边的方法暴力跑了一发过去了。

只要有1w个点全在一行的数据就能把我的方法卡掉。。

  ↑然而没有这种数据233

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct edge{
int v,nxt;
}e[mxn<<];
int hd[mxn],mct=;
void add_edge(int u,int v){
e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
}
void insert(int u,int v){
add_edge(u,v);add_edge(v,u);
}
int n,m,K;
struct point{
int x,y;
}a[mxn];
vector<int>r[mxn],c[mxn];
int f[mxn];
queue<int>q;
bool inq[mxn];
void SPFA(int st){
memset(f,0x3f,sizeof f);
q.push(st);f[st]=;
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
// if(f[u]>f[K])continue; // nope!
int x=a[u].x;
for(int i=;i<r[x].size();i++){
int v=r[x][i],cost=(abs(a[u].y-a[v].y)==)?:;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
//
for(int i=;i<r[x+].size();i++){
int v=r[x+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<r[x+].size();i++){
int v=r[x+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<r[x-].size();i++){
int v=r[x-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
if(x>){
for(int i=;i<r[x-].size();i++){
int v=r[x-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
//
int y=a[u].y;
for(int i=;i<c[y].size();i++){
int v=c[y][i],cost=(abs(a[u].x-a[v].x)==)?:;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<c[y-].size();i++){
int v=c[y-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
if(y>){
for(int i=;i<c[y-].size();i++){
int v=c[y-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
for(int i=;i<c[y+].size();i++){
int v=c[y+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<c[y+].size();i++){
int v=c[y+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
/*
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
// printf("u:%d v:%d\n",u,v);
if(f[v]>f[u]+1){
f[v]=f[u]+1;
if(!inq[v]){
inq[v]=1;
q.push(v);
}
}
}
*/
}
return;
}
map<int,int>mp[mxn];
int main(){
int i,j;
n=read();m=read();K=read();
for(i=;i<=K;i++){
a[i].x=read();a[i].y=read();
r[a[i].x].push_back(i);
c[a[i].y].push_back(i);
mp[a[i].x][a[i].y]=i;
}
//
/*
for(i=1;i<=K;i++){
if(mp[a[i].x+1][a[i].y+1]){
insert(i,mp[a[i].x+1][a[i].y+1]);
}
if(mp[a[i].x-1][a[i].y+1]){
insert(i,mp[a[i].x-1][a[i].y+1]);
}
}
*/
for(i=;i<=K;i++){
if(a[i].x== && a[i].y==){
SPFA(i);break;
}
}
int ans=0x3f3f3f3f;
for(i=;i<=K;i++){
// printf("i:%d f:%d\n",i,f[i]);
if(a[i].x==n && a[i].y==m)ans=min(ans,f[i]);
if(a[i].x>=n- || a[i].y>=m-)ans=min(ans,f[i]+);
}
if(ans==0x3f3f3f3f)ans=-;
printf("%d\n",ans);
return ;
}

D

代码看着长,其实只要写一小段,其他都是复制的

Okabe and El Psy Kongroo

数学问题 递推 矩阵乘法

应该跟D换一下的,明显这个更简单

看到矩阵乘法就能明白了吧233

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int mod=1e9+;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int sz=;
struct Mat{
int x[][];
void clear(){
memset(x,,sizeof x);return;
}
void init(int n){
for(int i=;i<=n;i++)x[i][i]=;return;
}
Mat operator * (const Mat b){
Mat res;
for(int i=;i<=sz;i++){
for(int j=;j<=sz;j++){
res.x[i][j]=;
for(int k=;k<=sz;k++){
res.x[i][j]=((LL)res.x[i][j]+(LL)x[i][k]*b.x[k][j]%mod)%mod;
}
}
}
return res;
}
void debug(){
for(int i=;i<=sz;i++){
for(int j=;j<=sz;j++){
printf("%d ",x[i][j]);
}
puts("");
}
puts("");
return;
}
};
Mat ans,bas,aa;
Mat ksm(Mat a,LL k){
Mat res;res.clear();res.init(sz);
while(k){
if(k&)res=res*a;
a=a*a;
k>>=;
}
return res;
}
int n;LL K;
void Build(int lim){
bas.clear();
for(int i=;i<=lim;i++){
bas.x[i][i]=;
if(i)bas.x[i][i-]=;
if(i<lim)bas.x[i][i+]=;
}
return;
}
int main(){
int i,j;
n=read();K=read();
ans.init();sz=;
LL a,b;int c;
int last=;
for(i=;i<=n;i++){
a=read();b=read();c=read();
if(a>=K)break;
Build(c);
b=min(b,K);
aa=ksm(bas,b-a);
ans=ans*aa;
}
printf("%d\n",ans.x[][]);
return ;
}

E

Codeforces Round #420 (Div. 2) A-E的更多相关文章

  1. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  2. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  3. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  4. Codeforces Round #420 (Div. 2) - C

    题目链接:http://codeforces.com/contest/821/problem/C 题意:起初有一个栈,给定2*n个命令,其中n个命令是往栈加入元素,另外n个命令是从栈中取出元素.你可以 ...

  5. Codeforces Round #420 (Div. 2) - E

    题目链接:http://codeforces.com/contest/821/problem/E 题意:起初在(0,0),现在要求走到(k,0),问你存在多少种走法. 其中有n条线段,每条线段为(a, ...

  6. Codeforces Round #420 (Div. 2) - B

    题目链接:http://codeforces.com/contest/821/problem/B 题意:二维每个整点坐标(x,y)拥有的香蕉数量为x+y,现在给你一个直线方程的m和b参数,让你找一个位 ...

  7. Codeforces Round #420 (Div. 2) - A

    题目链接:http://codeforces.com/contest/821/problem/A 题意:给定一个n*n的矩阵. 问你这个矩阵是否满足矩阵里的元素除了1以外,其他元素都可以在该元素的行和 ...

  8. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  9. Codeforces Round #420 (Div. 2) A,B,C

    A. Okabe and Future Gadget Laboratory time limit per test 2 seconds memory limit per test 256 megaby ...

  10. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. [Prism框架实用分享]如何在Prism应用程序中使用日志

    前言 在Prism中有关日志的命名空间: Microsoft.Practices.Prism.Logging 在Prism中,你可以使用Prism自带的Logger(比如TextLogger等),也可 ...

  2. 对小组项目alpha发布的评价

    第一组:新蜂小组 项目:俄罗斯方块 评论:看见同学玩的时候,感到加速下落时不是很灵敏,没有及成绩的功能,用户的界面仍在修正. 第二组:天天向上 项目:连连看 评论:这个游戏增加了很多好玩的功能,比如更 ...

  3. PAT 甲级 1081 Rational Sum (数据不严谨 点名批评)

    https://pintia.cn/problem-sets/994805342720868352/problems/994805386161274880 Given N rational numbe ...

  4. 【EF】EF Code-First数据迁移

    Code-First数据迁移  首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...

  5. java面试及答案

    优秀总结博客 mybatis总结 java并发包相关 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. hashmap3.反射中,Class. ...

  6. UVA12545_Bits Equalizer

    题目意思很简单,给你两个串,第一个串为0,1或者?,第二个串为0,1, 每次你可以对第一个串进行三种操作,1.0变为1:2.?变为0或者1:3.交换任意两个数的位置. 现在问你能否把第一个串变为第一个 ...

  7. 【bzoj2656】[Zjoi2012]数列(sequence) 高精度

    题目描述 给出数列 $A$ 的递推公式如下图所示,$T$ 次给定 $n$ ,求 $A_n$ . 输入 输入文件第一行有且只有一个正整数T,表示测试数据的组数.第2-T+1行,每行一个非负整数N. 输出 ...

  8. 洛谷 P1972 [SDOI2009]HH的项链

    不是裸题,鉴定完毕. 我是题面 对于这道题,我是离线做的... 树状数组吧,好些点 我们可以很轻易地得到一个很显然的结论,就是关于同一个数,我们只需要记录它不超过当前区间的最后一次出现的位置即可.举例 ...

  9. Wifi密码破解实战

    原文链接地址:http://www.freebuf.com/articles/wireless/127261.html https://www.baidu.com/?tn=98012088_4_dg& ...

  10. BZOJ3509 [CodeChef] COUNTARI 【分块 + fft】

    题目链接 BZOJ3509 题解 化一下式子,就是 \[2A[j] = A[i] + A[k]\] 所以我们对一个位置两边的数构成的生成函数相乘即可 但是由于这样做是\(O(n^2logn)\)的,我 ...