Codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
来源:互联网 发布:mysql disable索引 编辑:程序博客网 时间:2024/06/06 01:38
C. Bear and Up-Down
当不满足要求的数超过4个的时候,肯定是无解的,否则用每个数和这4个数交换,然后check。。比赛的时候写了很繁琐的分类讨论,竟然没挂。。
#include <bits/stdc++.h>#include <unordered_map>#define ll long long using namespace std;int a[150010];int err[150010];int n;bool judge(){ for(int i=1;i<n;i++){ if(i&1){ if(a[i]>=a[i+1]){ return 0; } }else{ if(a[i]<=a[i+1]){ return 0; } } } return 1;}int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int cnt= 0; for(int i=1;i<n;i++){ if(i&1){ if(a[i]>=a[i+1]){ err[cnt++] = i; } }else{ if(a[i]<=a[i+1]){ err[cnt++] = i; } } } int ans = 0; if(cnt>4){ }else if(cnt==4){ if(err[0]+1==err[1] && err[2]+1==err[3]){ swap(a[err[1]],a[err[3]]); ans+=judge(); swap(a[err[1]],a[err[3]]); }else{ } }else if(cnt==3){ if(err[0]+2==err[2]){ swap(a[err[1]],a[err[2]]); ans+=judge(); swap(a[err[1]],a[err[2]]); swap(a[err[1]],a[err[2]+1]); ans+=judge(); swap(a[err[1]],a[err[2]+1]); swap(a[err[0]],a[err[2]]); ans+=judge(); swap(a[err[0]],a[err[2]]); }if(err[0]+1==err[1]){ swap(a[err[1]],a[err[2]]); ans+=judge(); swap(a[err[1]],a[err[2]]); swap(a[err[1]],a[err[2]+1]); ans+=judge(); swap(a[err[1]],a[err[2]+1]); }else if(err[1]+1==err[2]){ swap(a[err[0]],a[err[2]]); ans+=judge(); swap(a[err[0]],a[err[2]]); swap(a[err[0]+1],a[err[2]]); ans+=judge(); swap(a[err[0]+1],a[err[2]]); }else{ } }else if(cnt==2){ if(err[0]+1==err[1]){ swap(a[err[0]],a[err[1]+1]); ans+=judge(); swap(a[err[0]],a[err[1]+1]); for(int i=1;i<=n;i++){ swap(a[i],a[err[1]]); bool ok = 1; for(int j=i-3;j<=i+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } for(int j=err[1]-3;j<=err[1]+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } swap(a[i],a[err[1]]); ans+=ok; } }else{ swap(a[err[0]],a[err[1]]); ans+=judge(); swap(a[err[0]],a[err[1]]); swap(a[err[0]],a[err[1]+1]); ans+=judge(); swap(a[err[0]],a[err[1]+1]); swap(a[err[0]+1],a[err[1]]); ans+=judge(); swap(a[err[0]+1],a[err[1]]); swap(a[err[0]+1],a[err[1]+1]); ans+=judge(); swap(a[err[0]+1],a[err[1]+1]); } }else if(cnt==1){ for(int i=1;i<=n;i++){ swap(a[i],a[err[0]]); bool ok = 1; for(int j=i-3;j<=i+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } for(int j=err[0]-3;j<=err[0]+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } swap(a[i],a[err[0]]); ans+=ok; } for(int i=1;i<=n;i++){ if(i==err[0])continue; swap(a[i],a[err[0]+1]); bool ok = 1; for(int j=i-3;j<=i+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } for(int j=err[0]-3;j<=err[0]+3;j++){ if(j<1)continue; if(j>=n)continue; if(j&1){ if(a[j]>=a[j+1]){ ok = 0; } }else{ if(a[j]<=a[j+1]){ ok = 0; } } } swap(a[i],a[err[0]+1]); ans+=ok; } } cout<<ans<<endl; return 0;}
D. Delivery Bears
这是一道好题!解法是二分答案,然后跑最大流判是否可行。判断方法是将边的流量改为它除以答案的值,向下取整,如果最大流不小于x就是合法。
另外要注意,二分写成循环固定次数会比较好。
#include <bits/stdc++.h>#include <unordered_map>#define ll long long using namespace std;int n,m;double x;const int inf=0xfffff; const int N = 55; int pre[N];double maxflow,dp[N][N];double tmp[N][N];void Edmonds_Karp(int start, int end, int m){ while(1){ queue<int> p; double minflow = inf; p.push(1); memset(pre, 0, sizeof(pre)); while(!p.empty()){ int u = p.front(); p.pop(); if(u == end) break; for(int i = 1;i <= m;i++) if(dp[u][i] > 0&&pre[i] == 0){ pre[i] = u; p.push(i); } } if(pre[end] == 0) break; for(int i = end;i != start;i = pre[i]) minflow = min(minflow, dp[pre[i]][i]); for(int i = end;i != start;i = pre[i]) { dp[pre[i]][i] -= minflow; dp[i][pre[i]] += minflow; } maxflow+=minflow; } } int main(){ cin>>n>>m>>x; for(int i=1;i<=m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); dp[a][b]+=c; } memcpy(tmp,dp,sizeof(dp)); double l=0; double r=1000000; double mid = 0; //注意这个二分的姿势 for(int tt=0;tt<66;tt++){ mid = (l+r)/2; memcpy(dp,tmp,sizeof(dp)); for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ dp[i][j] = floor(dp[i][j]/mid); } } maxflow = 0; Edmonds_Karp(1,n,n); if(maxflow>=x){ l=mid; }else{ r=mid; } } printf("%.10f\n",mid*x); return 0;}
0 0
- Codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls
- CodeForces 653 A. Bear and Three Balls——(IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2))
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing 暴力
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
- CF# IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C - Bear and Up-Down
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)B. Bear and Compressing
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A B C
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) 653C Bear and Up-Down(暴力)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D - Delivery Bears,二分+最大流问题
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) 653B Bear and Compressing(dfs + stl)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-A - Bear and Three Balls-水题
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-B - Bear and Compressing-暴力DP
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-C - Bear and Up-Down-暴力枚举
- 2015 Sichuan Province Contest (Carries)
- Qt QToolBar上间距控制
- STM8L HSE时钟配置
- Apple官方文档翻译之iOS 文件管理系统
- java学习笔记3--类与对象的基础
- Codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- CSS的width:100%和width:auto区别
- java学习笔记4--对象的初始化与回收
- 归并排序的几种变形
- Windows命令查看文件MD5
- java学习笔记5--类的方法
- Android中RecyclerView的使用
- 查某年某月有几天
- java学习笔记6--类的继承、Object类