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

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. 创建一个最简单的Linux随机启动服务

    转自: http://xiaoxia.org/2011/11/15/create-a-simple-linux-daemon/

  2. 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. volatile关键字

    [本文链接] http://www.cnblogs.com/hellogiser/p/volatile.html [分析] volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编 ...

  4. 【转】Solr从数据库导入数据(DIH)

    本文转自:http://blog.csdn.net/xiaoyu714543065/article/details/11849115 一. 数据导入(DataImportHandler-DIH) DI ...

  5. svn 切换默认用户名

    2015年1月19日 15:37:30\ 原文: http://www.2cto.com/os/201307/229325.html linux svn切换用户   1. 临时切换   在所有命令下强 ...

  6. 项目总结(五)--- 界面调试工具Reveal

    在开发中,我们也许会碰到以下需求:对于一些动态复杂的交互界面,手码去制定界面是常有的事情,然而我们在开发中想修改过一些参数后想看下实时效果,只能重新运行项目,进入到对应的页面来进行修改,是不是有点麻烦 ...

  7. [Linux] xargs的- n1参数

    起因在对一堆*.tar.gz文件解压缩时,发现tar xvfz *.tar.gz不管用,一查,原来是tar xvfz *.tar.gz会被shell给拆成tar xvfz a.tar.gz b.tar ...

  8. July 22nd, Week 30th Friday, 2016

    Love means never having to say you are sorry. 爱就是永远不必说对不起. Love means knowing each other deeply, the ...

  9. hdu 4005 双联通 2011大连赛区网络赛E *****

    题意: 有一幅图,现在要加一条边,加边之后要你删除一条边,使图不连通,费用为边的费用,要你求的是删除的边的最小值的最大值(每次都可以删除一条边,选最小的删除,这些最小中的最大就为答案) 首先要进行缩点 ...

  10. hdu 2594 Simpsons’ Hidden Talents KMP

    Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...