zoukankan      html  css  js  c++  java
  • Codeforces Round #420 (Div. 2) A-E

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

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

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

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

    (强行跑题)

    Okabe and Future Gadget Laboratory

    O(n^4)暴力妥妥的

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<vector>
     7 using namespace std;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    12     return x*f;
    13 }
    14 vector<int>r[51],c[51];
    15 int mp[51][51];
    16 int check(int a,int x,int y){
    17     for(int i=0;i<r[x].size();i++){
    18         for(int j=0;j<c[y].size();j++){
    19             if(r[x][i]+c[y][j]==a)return 1;
    20         }
    21     }
    22     return 0;
    23 }
    24 int main(){
    25     int i,j;
    26     int n=read();
    27     for(i=1;i<=n;i++){
    28         for(j=1;j<=n;j++){
    29             mp[i][j]=read();
    30             r[i].push_back(mp[i][j]);
    31             c[j].push_back(mp[i][j]);
    32         }
    33     }
    34     for(i=1;i<=n;i++){
    35         for(j=1;j<=n;j++){
    36             if(mp[i][j]==1)continue;
    37             if(!check(mp[i][j],i,j)){
    38                 printf("NO
    ");
    39                 return 0;
    40             }
    41         }
    42     }
    43     printf("YES
    ");
    44     return 0;
    45 }
    A

    Okabe and Banana Trees

    枚举 扫描

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

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

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #define LL long long
     7 using namespace std;
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    12     return x*f;
    13 }
    14 LL calc(LL x,LL y){
    15     LL res=(1+y)*y/2*(x+1);
    16     res+=(1+x)*x/2*y;
    17     res+=(1+x)*x/2;
    18     return res;
    19 }
    20 LL ans=0;
    21 int main(){
    22     int i,j;
    23     int m,b;
    24     m=read();b=read();
    25     for(int i=0;i>=0;i++){
    26         int y=b-ceil((double)i/m);
    27         if(y<0)break;
    28         ans=max(ans,calc(i,y));
    29     }
    30     printf("%I64d
    ",ans);
    31     return 0;
    32 }
    B

    Okabe and Boxes

    贪心 构造

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

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

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<queue>
     7 using namespace std;
     8 const int mxn=300050;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 priority_queue<int>q;
    16 int last,ord;
    17 int n,x;
    18 char s[10];
    19 int st[mxn],top=0;
    20 int main(){
    21     int i,j;
    22     n=read();
    23     int ed=n<<1;
    24     ord=1;
    25     int ans=0;
    26     for(i=1;i<=ed;i++){
    27 //        printf("i:%d
    ",i);
    28         scanf("%s",s);
    29         if(s[0]=='a'){
    30             scanf("%d",&x);
    31             q.push(-x);
    32             st[++top]=x;
    33             last=x;
    34         }
    35         else{//remove
    36             if(last==ord){
    37                 q.pop();
    38                 ord++;
    39                 if(top)top--;
    40                 if(top){
    41                     last=st[top];
    42                 }
    43                 else last=-q.top();
    44             }
    45             else{
    46                 ans++;
    47                 ord++;
    48                 q.pop();
    49                 last=-q.top();
    50                 top=0;
    51             }
    52         }
    53 //        printf("top:%d last:%d
    ",q.top(),last);
    54     }
    55     printf("%d
    ",ans);
    56     return 0;
    57 }
    C

    Okabe and City

    图论 最短路 脑洞题

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

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

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

      ↑然而没有这种数据233

      1 #include<iostream>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<cstdio>
      5 #include<cmath>
      6 #include<vector>
      7 #include<queue>
      8 #include<map>
      9 using namespace std;
     10 const int mxn=10005;
     11 int read(){
     12     int x=0,f=1;char ch=getchar();
     13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     14     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
     15     return x*f;
     16 }
     17 struct edge{
     18     int v,nxt;
     19 }e[mxn<<5];
     20 int hd[mxn],mct=0;
     21 void add_edge(int u,int v){
     22     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
     23 }
     24 void insert(int u,int v){
     25     add_edge(u,v);add_edge(v,u);
     26 }
     27 int n,m,K;
     28 struct point{
     29     int x,y;
     30 }a[mxn];
     31 vector<int>r[mxn],c[mxn];
     32 int f[mxn];
     33 queue<int>q;
     34 bool inq[mxn];
     35 void SPFA(int st){
     36     memset(f,0x3f,sizeof f);
     37     q.push(st);f[st]=0;
     38     while(!q.empty()){
     39         int u=q.front();q.pop();inq[u]=0;
     40 //        if(f[u]>f[K])continue; // nope!
     41         int x=a[u].x;
     42         for(int i=0;i<r[x].size();i++){
     43             int v=r[x][i],cost=(abs(a[u].y-a[v].y)==1)?0:1;
     44             if(f[v]>f[u]+cost){
     45                 f[v]=f[u]+cost;
     46                 if(!inq[v]){
     47                     inq[v]=1;
     48                     q.push(v);
     49                 }
     50             }
     51         }
     52         //
     53         for(int i=0;i<r[x+1].size();i++){
     54             int v=r[x+1][i],cost=1;
     55             if(f[v]>f[u]+cost){
     56                 f[v]=f[u]+cost;
     57                 if(!inq[v]){
     58                     inq[v]=1;
     59                     q.push(v);
     60                 }
     61             }
     62         }
     63         for(int i=0;i<r[x+2].size();i++){
     64             int v=r[x+2][i],cost=1;
     65             if(f[v]>f[u]+cost){
     66                 f[v]=f[u]+cost;
     67                 if(!inq[v]){
     68                     inq[v]=1;
     69                     q.push(v);
     70                 }
     71             }
     72         }
     73         for(int i=0;i<r[x-1].size();i++){
     74             int v=r[x-1][i],cost=1;
     75             if(f[v]>f[u]+cost){
     76                 f[v]=f[u]+cost;
     77                 if(!inq[v]){
     78                     inq[v]=1;
     79                     q.push(v);
     80                 }
     81             }
     82         }
     83         if(x>1){
     84             for(int i=0;i<r[x-2].size();i++){
     85                 int v=r[x-2][i],cost=1;
     86                 if(f[v]>f[u]+cost){
     87                     f[v]=f[u]+cost;
     88                     if(!inq[v]){
     89                         inq[v]=1;
     90                         q.push(v);
     91                     }
     92                 }
     93             }
     94         }
     95         //
     96         int y=a[u].y;
     97         for(int i=0;i<c[y].size();i++){
     98             int v=c[y][i],cost=(abs(a[u].x-a[v].x)==1)?0:1;
     99             if(f[v]>f[u]+cost){
    100                 f[v]=f[u]+cost;
    101                 if(!inq[v]){
    102                     inq[v]=1;
    103                     q.push(v);
    104                 }
    105             }
    106         }
    107         for(int i=0;i<c[y-1].size();i++){
    108             int v=c[y-1][i],cost=1;
    109             if(f[v]>f[u]+cost){
    110                 f[v]=f[u]+cost;
    111                 if(!inq[v]){
    112                     inq[v]=1;
    113                     q.push(v);
    114                 }
    115             }
    116         }
    117         if(y>1){
    118             for(int i=0;i<c[y-2].size();i++){
    119                 int v=c[y-2][i],cost=1;
    120                 if(f[v]>f[u]+cost){
    121                     f[v]=f[u]+cost;
    122                     if(!inq[v]){
    123                         inq[v]=1;
    124                         q.push(v);
    125                     }
    126                 }
    127             }
    128         }
    129         for(int i=0;i<c[y+1].size();i++){
    130             int v=c[y+1][i],cost=1;
    131             if(f[v]>f[u]+cost){
    132                 f[v]=f[u]+cost;
    133                 if(!inq[v]){
    134                     inq[v]=1;
    135                     q.push(v);
    136                 }
    137             }
    138         }
    139         for(int i=0;i<c[y+2].size();i++){
    140             int v=c[y+2][i],cost=1;
    141             if(f[v]>f[u]+cost){
    142                 f[v]=f[u]+cost;
    143                 if(!inq[v]){
    144                     inq[v]=1;
    145                     q.push(v);
    146                 }
    147             }
    148         }
    149         /*
    150         for(int i=hd[u];i;i=e[i].nxt){
    151             int v=e[i].v;
    152 //            printf("u:%d v:%d
    ",u,v);
    153             if(f[v]>f[u]+1){
    154                 f[v]=f[u]+1;
    155                 if(!inq[v]){
    156                     inq[v]=1;
    157                     q.push(v);
    158                 }
    159             }
    160         }
    161         */
    162     }
    163     return;
    164 }
    165 map<int,int>mp[mxn];
    166 int main(){
    167     int i,j;
    168     n=read();m=read();K=read();
    169     for(i=1;i<=K;i++){
    170         a[i].x=read();a[i].y=read();
    171         r[a[i].x].push_back(i);
    172         c[a[i].y].push_back(i);
    173         mp[a[i].x][a[i].y]=i;
    174     }
    175     //
    176 /*
    177     for(i=1;i<=K;i++){
    178         if(mp[a[i].x+1][a[i].y+1]){
    179             insert(i,mp[a[i].x+1][a[i].y+1]);
    180         }
    181         if(mp[a[i].x-1][a[i].y+1]){
    182             insert(i,mp[a[i].x-1][a[i].y+1]);
    183         }
    184     }
    185 */
    186     for(i=1;i<=K;i++){
    187         if(a[i].x==1 && a[i].y==1){
    188             SPFA(i);break;
    189         }
    190     }
    191     int ans=0x3f3f3f3f;
    192     for(i=1;i<=K;i++){
    193 //        printf("i:%d f:%d
    ",i,f[i]);
    194         if(a[i].x==n && a[i].y==m)ans=min(ans,f[i]);
    195         if(a[i].x>=n-1 || a[i].y>=m-1)ans=min(ans,f[i]+1);
    196     }
    197     if(ans==0x3f3f3f3f)ans=-1;
    198     printf("%d
    ",ans);
    199     return 0;
    200 }
    D

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

    Okabe and El Psy Kongroo

    数学问题 递推 矩阵乘法

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

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

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #define LL long long
     7 using namespace std;
     8 const int mod=1e9+7;
     9 LL read(){
    10     LL x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 int sz=0;
    16 struct Mat{
    17     int x[16][16];
    18     void clear(){
    19         memset(x,0,sizeof x);return;
    20     }
    21     void init(int n){
    22         for(int i=0;i<=n;i++)x[i][i]=1;return;
    23     }
    24     Mat operator * (const Mat b){
    25         Mat res;
    26         for(int i=0;i<=sz;i++){
    27             for(int j=0;j<=sz;j++){
    28                 res.x[i][j]=0;
    29                 for(int k=0;k<=sz;k++){
    30                     res.x[i][j]=((LL)res.x[i][j]+(LL)x[i][k]*b.x[k][j]%mod)%mod;
    31                 }
    32             }
    33         }
    34         return res;
    35     }
    36     void debug(){
    37         for(int i=0;i<=sz;i++){
    38             for(int j=0;j<=sz;j++){
    39                 printf("%d ",x[i][j]);
    40             }
    41             puts("");
    42         }
    43         puts("");
    44         return;
    45     }
    46 };
    47 Mat ans,bas,aa;
    48 Mat ksm(Mat a,LL k){
    49     Mat res;res.clear();res.init(sz);
    50     while(k){
    51         if(k&1)res=res*a;
    52         a=a*a;
    53         k>>=1;
    54     }
    55     return res;
    56 }
    57 int n;LL K;
    58 void Build(int lim){
    59     bas.clear();
    60     for(int i=0;i<=lim;i++){
    61         bas.x[i][i]=1;
    62         if(i)bas.x[i][i-1]=1;
    63         if(i<lim)bas.x[i][i+1]=1;
    64     }
    65     return;
    66 }
    67 int main(){
    68     int i,j;
    69     n=read();K=read();
    70     ans.init(15);sz=15;
    71     LL a,b;int c;
    72     int last=0;
    73     for(i=1;i<=n;i++){
    74         a=read();b=read();c=read();
    75         if(a>=K)break;
    76         Build(c);
    77         b=min(b,K);
    78         aa=ksm(bas,b-a);
    79         ans=ans*aa;
    80     }
    81     printf("%d
    ",ans.x[0][0]);
    82     return 0;
    83 }
    E
  • 相关阅读:
    Tomcat 配置 项目 到tomcat目录外面 和 域名绑定访问(api接口、前端网站、后台管理网站)
    弹窗插件zDialog使用教程
    shiro+spring相关配置
    jQuery分页插件(jquery.page.js)的使用
    ueditor1.4.3配置过程(包含单独上传文件以及图片的使用),ueditor1.4.3上传配置(转 http://www.bkjia.com/webzh/1001016.html)
    ueditor1_4_3_3编辑器修改文章
    jquery获取当前select下拉选的属性值
    js点击标签时获取当前标签属性值
    mysql给root开启远程访问权限,修改root密码
    redis持久化配置
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/7082875.html
Copyright © 2011-2022 走看看