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:

调和级数:

posted on 2017-05-24 10:15  whz2002  阅读(129)  评论(0编辑  收藏  举报