zoukankan      html  css  js  c++  java
  • 17-05-21模拟赛

    T1:

    读入后从右到左维护单调栈的单调递增性。每次维护后答案+=t-2即可。

    Code:

     1 #include<cstdio> 
     2 #define MN 1000005 
     3 #define ll long long 
     4 using namespace std; 
     5 int n,top=0,a[MN],q[MN]; 
     6 ll ans=0; 
     7 int main() 
     8 { 
     9     scanf("%d",&n); 
    10     for (int i=1;i<=n;++i) scanf("%d",&a[i]); 
    11     for (int i=n;i;--i){ 
    12         while (top&&q[top]<a[i]) --top; 
    13         q[++top]=a[i];if (top>2) ans+=top-2ll; 
    14     } 
    15     printf("%lld",ans); 
    16 }

    T2:Floyd求各个点间的最短路并用bitset提速。时间效率O(n3/32)。

    Code:

     1 #include<bitset> 
     2 #include<cstdio> 
     3 #define MN 2002 
     4 using namespace std; 
     5 int n,ans; 
     6 bool t; 
     7 bitset<2001>f[MN]; 
     8 int main() 
     9 { 
    10     scanf("%d",&n); 
    11     for (int i=1;i<=n;++i) 
    12     for (int j=1;j<=n;++j) scanf("%d",&t),f[i][j]=(t|(i==j)); 
    13     for (int k=1;k<=n;++k) 
    14     for (int i=1;i<=n;++i) if (f[i][k]) f[i]|=f[k]; 
    15     for (int i=1;i<=n;++i) ans+=f[i].count(); 
    16     printf("%d",ans);return 0; 
    17 }

     T3:网络流。

    建图:将划水的人向源S连容量为1的边,做题的人向汇T连容量为1的边。有朋友关系的人互相连容量为1的边。

    题目即求该图的最小割。根据最小割=最大流,跑最大流即可。

    Code:

     1 #include<iostream> 
     2 #include<cmath> 
     3 #include<cstdio> 
     4 #include<cstdlib> 
     5 #include<cstring> 
     6 #include<algorithm> 
     7 #define inf 0x7fffffff 
     8 #define MN 302 
     9 using namespace std; 
    10 struct edge{ 
    11     int to,next,val; 
    12 }e[95005]; 
    13 int n,m,s,t,tmp,a,b,cnt=1; 
    14 int q[MN],head[MN],iter[MN],lev[MN]; 
    15 void ins(int x,int y,int v){ 
    16     e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;e[cnt].val=v; 
    17     e[++cnt].to=x;e[cnt].next=head[y];head[y]=cnt;e[cnt].val=0; 
    18 } 
    19 void insf(int x,int y,int v){ 
    20     e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;e[cnt].val=v; 
    21     e[++cnt].to=x;e[cnt].next=head[y];head[y]=cnt;e[cnt].val=v; 
    22 } 
    23 bool bfs(){ 
    24     memset(lev,-1,sizeof(lev)); 
    25     int qh=0,qt=1;q[0]=s;lev[s]=0; 
    26     while(qh<qt){ 
    27         int u=q[qh++]; 
    28         for (int i=head[u];i;i=e[i].next){ 
    29             int v=e[i].to; 
    30             if (lev[v]==-1&&e[i].val) lev[v]=lev[u]+1,q[qt++]=v; 
    31         } 
    32     } 
    33     memcpy(iter,head,sizeof(head));return lev[t]!=-1; 
    34 } 
    35 int dfs(int u,int f){ 
    36     if (u==t) return f;int used=0; 
    37     for (int &i=iter[u];i;i=e[i].next){ 
    38         int v=e[i].to; 
    39         if (e[i].val&&lev[u]+1==lev[v]){ 
    40             int w=dfs(v,min(f-used,e[i].val)); 
    41             e[i].val-=w;e[i^1].val+=w;used+=w; 
    42             if (used==f) return f; 
    43         } 
    44     }if (!used) lev[u]=-1;return used; 
    45 } 
    46 int main() 
    47 { 
    48     scanf("%d%d",&n,&m);s=0,t=n+1; 
    49     for (int i=1;i<=n;++i){scanf("%d",&tmp);if (tmp) ins(s,i,1);else ins(i,t,1);} 
    50     for (int i=1;i<=m;++i) scanf("%d%d",&a,&b),insf(a,b,1);int fl=0; 
    51     while (bfs()){int d=dfs(s,inf);while (d) fl+=d,d=dfs(s,inf);} 
    52     printf("%d",fl);return 0; 
    53 } 

    T4:

    调和级数:

  • 相关阅读:
    转:MVC分页
    转:更新Android SDK之后Eclipse提示ADT版本过低的一个简易解决办法
    DataGridView 添加鼠标右键选择行
    WinForm 中使用ScintillaNet
    C#获取当前程序运行路径的方法集合
    Winform DataGridView鼠标右键选择列
    EF 数据查询(更改默认排序)
    使用lambda表达式进行对象结合的筛选操作
    使用SSIS生成数据导出为Excel文件的模板
    Sql server 数据库中计算每天的开始结束时间
  • 原文地址:https://www.cnblogs.com/codingutopia/p/test170521.html
Copyright © 2011-2022 走看看