本以为会是三道小强与阿米巴,结果打开题目一看发现了这个:

T1:

恩先写着一道

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define rep(s,t) for(int i=s;i<=t;i++)
using namespace std;
inline int read() {
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
const int maxn=;
const int maxnode=;
int A[maxn],B[maxn],root[maxn];
int ls[maxnode],rs[maxnode],s[maxnode],ToT;
void build(int& y,int x,int l,int r,int pos) {
s[y=++ToT]=s[x]+;if(l==r) return;
int mid=l+r>>;ls[y]=ls[x];rs[y]=rs[x];
if(pos<=mid) build(ls[y],ls[x],l,mid,pos);
else build(rs[y],rs[x],mid+,r,pos);
}
int query(int y,int x,int l,int r,int k) {
if(l==r) return l;
int k2=s[ls[y]]-s[ls[x]],mid=l+r>>;
if(k<=k2) return query(ls[y],ls[x],l,mid,k);
return query(rs[y],rs[x],mid+,r,k-k2);
}
int main() {
freopen("kth.in","r",stdin);
freopen("kth.out","w",stdout);
int n=read(),q=read();
rep(,n) A[i]=B[i]=read();
sort(B+,B+n+);
rep(,n) build(root[i],root[i-],,n,lower_bound(B+,B+n+,A[i])-B);
rep(,q) {
int l=read(),r=read(),k=read();
printf("%d\n",B[query(root[r],root[l-],,n,r-l-k+)]);
}
return ;
}

T2:

无脑爆搜+调整顺序,只搞出来5个点。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
using namespace std;
inline int read() {
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
int cnt;
char s[][];
int rr[],ry[];
int id(int x,int y) {return (((y-)/)*+(x-)/)+;}
int r[][],c[][],sq[][],num[][],use[];
struct Point {
int x,y,s;
bool operator < (const Point& ths) const {
return rr[x]+ry[num[x][y]]>rr[ths.x]+ry[num[x][y]];//s>ths.s;
}
}A[];
void dfs(int cur) {
if(cur==cnt+) {
rep(i,,) {
rep(j,,) putchar(s[i][j]);
puts("");
}
exit();
}
else {
int x=A[cur].x,y=A[cur].y,z=num[x][y];
for(int d=;d<=;d++) if(!r[x][d]&&!c[y][d]&&!sq[z][d]){
r[x][d]=c[y][d]=sq[z][d]=;use[d]++;
s[x][y]=(d<=?d-+'':d-+'A');dfs(cur+);
r[x][d]=c[y][d]=sq[z][d]=;use[d]--;
}
}
}
int sc[];
int main() {
srand(time());
rr[]=;rr[]=;rr[]=;rr[]=;ry[]=;ry[]=;
freopen("sixteen7.in","r",stdin);
freopen("sixteen7.out","w",stdout);
sc['']=;sc['']=;sc['']=;sc['']=;
sc['']=;sc['']=;sc['']=;sc['']=;
sc['']=;sc['']=;sc['A']=;sc['B']=;
sc['C']=;sc['D']=;sc['E']=;sc['F']=;
rep(i,,) scanf("%s",s[i]+);
rep(i,,) rep(j,,) {
num[i][j]=id(i,j);
if(s[i][j]=='.') {
A[++cnt]=(Point){i,j,};
rep(k,,) if(s[i][k]!='.') A[cnt].s++;
rep(k,,) if(s[k][j]!='.') A[cnt].s++;
rep(k,,) rep(k2,,) if(s[k][k2]!='.'&&id(k,k2)==id(i,j)) A[cnt].s++;
if(i==||i==||i==) A[cnt].s+=;
}
else {
r[i][sc[s[i][j]]]=;c[j][sc[s[i][j]]]=;
sq[num[i][j]][sc[s[i][j]]]=;
}
}
/*for(int i=1;i<cnt;i++)
for(int j=i+1;j<=cnt;j++)
if(A[j].x==6&&(A[i].x!=7)) swap(A[i],A[j]);
else if(A[j].x==7) swap(A[i],A[j]);
else if(A[j].x==10&&(A[i].x!=7)) swap(A[i],A[j]);*/
sort(A+,A+cnt+);
//rep(i,1,cnt) printf("%d %d\n",A[i].x,A[i].y);
dfs();
return ;
}

T3:

恩让我回忆回忆2333

-------------------

似乎记得要二分答案,那就先二分答案吧。

考虑如何判定x是否可行,将|E|/|V|>k变形成|E|-k*|V|>0,发现这是个裸的最大权闭合子图。因为选中一条边能贡献1的权,但同时要依赖于两个端点也必须选,而这两个端点的贡献每个都是-k。那么跑一边最大流,算一下是否为m即可。

等等,这道题要你输出分数啊!那么最后再计算一下最优解,在网络中找那些指向汇点且被割断的边,这些边的另一端就是选择的点。

注意特判m=0

#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#include<algorithm>
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
const int maxn=;
const int maxm=;
const double eps=1e-;
int n,m,u[],v[],A[],is[],cnt,ans;
struct Dinic {
int n,m,s,t;
int vis[maxn],cur[maxn],d[maxn],first[maxn],next[maxm];
struct Edge {int from,to;double flow;}edges[maxm];
void init(int n) {
this->n=n;m=;
fill(first+,first+n+,-);
}
void AddEdge(int u,int v,double cap) {
edges[m]=(Edge){u,v,cap};next[m]=first[u];first[u]=m++;
edges[m]=(Edge){v,u,0.0};next[m]=first[v];first[v]=m++;
}
int BFS() {
fill(vis+,vis+n+,);
queue<int> q;q.push(s);d[s]=;vis[s]=;
while(!q.empty()) {
int x=q.front();q.pop();cur[x]=first[x];
ren {
Edge& e=edges[i];
if(!vis[e.to]&&e.flow>eps) {
vis[e.to]=;
d[e.to]=d[x]+;
q.push(e.to);
}
}
}
return vis[t];
}
double DFS(int x,double a) {
if(x==t||a<eps) return a;
double flow=0.0,f;
for(int& i=cur[x];i!=-;i=next[i]) {
Edge& e=edges[i];
if(d[e.to]==d[x]+&&(f=DFS(e.to,min(a,e.flow)))>eps) {
e.flow-=f;edges[i^].flow+=f;
flow+=f;a-=f;if(a<eps) break;
}
}
return flow;
}
double MaxFlow(int s,int t) {
double ans=0.0;this->s=s;this->t=t;
while(BFS()) ans+=DFS(s,1e50);
return ans;
}
void solve() {
rep(,m-) if(edges[i].to==t&&edges[i].flow<eps) A[++cnt]=edges[i].from;
}
}sol;
int check(double mid) {
sol.init(n+m+);
int s=n+m+,t=n+m+;
rep(,m) sol.AddEdge(s,i,1.0),sol.AddEdge(i,u[i]+m,1e50),sol.AddEdge(i,v[i]+m,1e50);
rep(,n) sol.AddEdge(i+m,t,mid);
return m-sol.MaxFlow(s,t)>eps;
}
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
int main() {
freopen("density.in","r",stdin);
freopen("density.out","w",stdout);
n=read(),m=read();
if(!m) {puts("0/1");return ;}
rep(,m) u[i]=read(),v[i]=read();
double l=0.0,r=m;
while(r-l>eps) {
double mid=(l+r)*0.5;
if(check(mid)) l=mid;
else r=mid;
}
check(l);sol.solve();
rep(,cnt) is[A[i]-m]=;
rep(,m) if(is[u[i]]&&is[v[i]]) ans++;
printf("%d/%d\n",ans/gcd(ans,cnt),cnt/gcd(ans,cnt));
return ;
}

交上去WA了一个点,FHQ带大家测了半天,最后发现最小割不唯一会WA。于是暴力枚举分子分母的过了23333

BJOI2015 Day1的更多相关文章

  1. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  2. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  3. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

  6. 团队项目——站立会议 DAY1

    团队项目--站立会议 DAY1        团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱        今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...

  7. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

  8. Day1 login

    使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...

  9. contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve

    http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...

随机推荐

  1. 【转】android中Uri.parse()用法

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  2. Watering the Fields(irrigation)

    #include <cstdio> #include <algorithm> struct edge{ int f,t,w; } ed[5000000]; int pl,n,c ...

  3. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

  4. 【Docker】来自官方映像的 6 个 Dockerfile 技巧

    本文将根据我从官方镜像学到的经验,讲解编写Dockerfile的技巧.   1. 选择Debian  官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的.Dock ...

  5. A + B Problem

    Write a function that add two numbers A and B. You should not use + or any arithmetic operators. 分析: ...

  6. ubuntu apt-get update 失败解决

    在执行 sudo apt-get update 之后  会出现如下错误 这是要检测网络是否有问题 因为我之前只使用nfs挂载的时候,在虚拟机  编辑-> 虚拟网络编辑器里面->更改设置里面 ...

  7. 【转】maven命令背后是如何工作的

    转载自:http://yinny.iteye.com/blog/1883488 Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),它有三套相互独立的生命周期,请注意 ...

  8. Cocos2d-JS场景树

    场景树概念(Scene Graph) 场景树是Cocos2d-JS中用来管理场景中所有元素的一个数据结构,场景树之所以被称为一棵树是因为它将一个场景的所有子结点以树状图的形式组织在一起. Cocos2 ...

  9. MyEclipse内存溢出问题解决方法

    tomcat从1.7换到1.6,一直报这个错:java.lang.reflect.InvocationTargetException 解决方法: 加入: -server -Xms512m -Xmx20 ...

  10. HTML5-------元素使用

    HTML5的元素使用