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:
调和级数: