这套题我只会写第二题。。。我。。。

T1:给出一个含有向边和无向边的混合图,如何确定无向边的方向使得图中不存在环。保证有解。多解情况输出任意解。

=>我往最大流的残量网络的方向去想了。。。因为混合图求欧拉回路用的就是最大流。。。然而什么都想不出来。。。

正解:

原图是个有向无环图,也就是说是个拓扑图,如果加完边后依然是拓扑图,也就是依然无环。

对原图做拓扑排序,得到每个点的入队时间,加边的时候把边定向为从入队时间早的点到晚的点,原来的入队顺序就依然成立,就无环了。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f;
struct edge{
int to;edge *next;
};edge es[nmax],*pt=es,*head[nmax];
void add(int u,int v){
pt->to=v;pt->next=head[u];head[u]=pt++;
}
int q[nmax],in[nmax],qe[nmax];
int main(){
freopen("dizzy.in","r",stdin);freopen("dizzy.out","w",stdout);
int n=read(),m=read(),tm=read(),u,v;
rep(i,1,m) u=read(),v=read(),add(u,v),in[v]++;
int cur=0;
rep(i,1,n) if(!in[i]) q[i]=++cur,qe[cur]=i;
rep(i,1,cur) qwq(qe[i]) if(!--in[o->to]) q[o->to]=++cur,qe[cur]=o->to;
//rep(i,1,n) printf("%d ",q[i]);printf("\n");
rep(i,1,tm) {
u=read(),v=read();
if(q[u]>q[v]) swap(u,v);
printf("%d %d\n",u,v);
}
fclose(stdin);fclose(stdout);
return 0;
}
/*
4 5 3
1 2
1 3
2 3
2 4
3 4
*/

T2:给出一个500*500的矩阵。可横着切A刀,竖着切B刀。求最小块的最大值。

=>二分答案。。。发现尽量的弄到函数里面清晰好多啊T_T

//特别奇怪。输出ans的时候我写成了%lld就全WA。。。还以为没有什么关系的TAT
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define ll long long
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=505;
const int inf=0x7f7f7f7f;
int a[nmax][nmax],n,m,A,B;
bool pd(int r,int l,int x){
int pre=0,ans=0,tp=0;
rep(i,1,m) if((tp+=a[r][i]-a[l][i])>=x) pre=i,++ans,tp=0;
return ans>=B;
}
bool check(int x){
int pre=0,ans=0;
rep(i,1,n) if(pd(i,pre,x)) pre=i,++ans;
return ans>=A;
}
int main(){
freopen("browine.in","r",stdin);freopen("browine.out","w",stdout);
n=read(),m=read(),A=read(),B=read();int sm=0;
rep(i,1,n) rep(j,1,m) a[i][j]=read(),sm+=a[i][j];
rep(j,1,m) rep(i,1,n) a[i][j]+=a[i-1][j];
int l=0,r=sm,ans=0,mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
fclose(stdin);fclose(stdout);
return 0;
}
/*
5 4 4 2
1 2 2 1
3 1 1 1
2 0 1 3
1 1 1 1
1 1 1 1
*/

T3:给出一个500*500的矩阵,要求在同一条直线上取n个点,点的间距>=d。求有多少中方案?

=>maya确定两个端点后这根本不能无法确定有多少种方案啊。。。

正解

枚举一个点(x,y),先算出(0,0)——>(x,y)这条直线上放N个点,(0,0)处一定放第一个点,(x,y)处一定放最后一个点的方案数,把最后一个点平移(其他N-1个点跟着整体平移)到以(x,y)为左上角,(w+1,h+1)为右下角的矩形中的任何一个格点又是不重复的新的方案。

第一步的方案可以这样计算:

设g=gcd(x,y),则(0,0)——>(x,y)的线段上共有g+1个相邻的距离相同的格点,把这些点从1到g+1编号。设比i点编号大的点中离i最近且距离不小于d的点是i+k,我们要在这g-1个点(开头结尾已定)中取n-2个点,满足编号

Xi-Xi-1>=k。此问题等价于

1+k(n-1)<=X2+k(n-2)<=……<=Xn-1+k<=g+1的解的方案数

上面这个问题又等价于

1+k(n-1)+1<=X2+k(n-2)+1<X3+k(n-3)+2<……

<Xn-1+k+(n-2)<=g+1+n-2 的解的方案数

这样方案数就显然了,首先开头结尾都定了,我们要在[1+k(n-1)+1,g+1+n-2]这g-(k-1)(n-1)-1个数中选出n-2个数,方案数就是原问题的方案数。

时间复杂度O(WH)

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=505;
const int inf=0x7f7f7f7f;
const int mod=1e9;
int c[nmax][nmax],g[nmax][nmax];
void M(int &a){
if(a>=mod) a-=mod;
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
void init(){
c[1][0]=1;c[1][1]=1;
rep(i,0,500) c[i][0]=1;
rep(i,2,500) rep(j,1,i) M(c[i][j]=c[i-1][j]+c[i-1][j-1]);
rep(i,1,500) rep(j,1,500) g[i][j]=gcd(i,j);
rep(i,1,500) g[i][0]=i,g[0][i]=i;g[0][0]=0;
}
int cal(int n,int m,int A,int D){
if(A==1) return (n+1)*(m+1);
int ans=0,k;
rep(i,0,n) rep(j,0,m){
k=(int)((double)D*(g[i][j])/sqrt((double)i*i+j*j)+0.999999);
if(g[i][j]-1<A-2||g[i][j]-(k-1)*(A-1)-1<0) continue;
M(ans+=1ll*(!i||!j?1:2)*c[g[i][j]-(k-1)*(A-1)-1][A-2]*(n-i+1)%mod*(m-j+1)%mod);
}
return ans;
}
int main(){
freopen("backyard.in","r",stdin);freopen("backyard.out","w",stdout);
int T=read();init();
rep(_T,1,T){
int A=read(),n=read(),m=read(),D=read();
printf("%d\n",cal(n,m,A,D));
}
fclose(stdin);fclose(stdout);
return 0;
}
/*
6
2 4 4 1
13 36 48 5
5 5 5 1
50 49 49 1
6 5 5 2
10 55 75 5
*/

  

noip模拟赛#24的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. Openjudge jubeeeeeat

    jubeeeeeat 题目链接 总时间限制:  1000ms 内存限制:  256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐 ...

  2. Objective-C对象的申请空间与初始化

    对象分配空间与初始化 对象分配空间与初始化 使用Objective-C语言创建一个对象有两个步骤,你必须: 为新对象动态分配内存空间 初始化新分配的内存,并赋初值 不经过如上两步,一个对象就没有完全功 ...

  3. scrapy框架爬取蜂鸟网的人像图片

    今天有点无聊,本来打算去蜂鸟网爬点图片存起来显得自己有点内涵,但是当我点开人像的时候就被里面的小姐姐所吸引了,下面就是整个爬图片的思路和过程了 第一步:先创建一个爬虫项目 scrapy startpr ...

  4. CentOS 6.6 x64安装TensorFlow

    CentOS 6.6 x64安装TensorFlow升级Python到2.7(系统自带Python版本为2.6) // 安装编译工具 $ yum -y install gcc automake aut ...

  5. 洛谷P2812校园网络【Network of Schools加强版】

    题目背景 浙江省的几所\(OI\)强校的神犇发明了一种人工智能,可以\(AC\)任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被\(♂\)掏\(♂\)空,他 ...

  6. Java基础笔记(十三)——面向对象

    类和对象 类是具有相同属性和方法的一组对象的集合,好比一个虚拟的轮廓(抽象的概念),确定对象将会拥有的特征(属性)和行为(方法). 对象是类的实例表现,是一个具体的东西(一个看得到.摸得着的具体实体) ...

  7. Luogu P2455 [SDOI2006]线性方程组 真•高斯消元板子

    果然如Miracle学长所说...调了一天...qwq..还是过不了线下的Hack upd after 40min:刚刚过了 就是多了一个判无解的操作... 当系数都为0,且常数项不为0时,即为无解. ...

  8. 高并发web系统优化总结

    1.背景 因为业务需要,搭建了一个系统,系统主要由两部分组成,web页面和数据库. mysql大概2万条数据,其中有一个字段是click_num点击次数,php页面会取点击次数最小的一条记录去进行操作 ...

  9. 自定义xml spring bean

    一. xml中bean解析过程 扫描META-INF下面的 spring.schemas  bean定义对应的xsd位置,在IDEA中可以辅助校验) spring.handlers   xmlns对应 ...

  10. python_魔法方法(五):描述符和定制序列

    描述符(property的原理) 描述符(descripto),用一句话来解释,描述符就是某种特殊的类的实例指派给另一个类的属性.那么什么是特殊类型的类呢?就是至少要在这个类中定义__get__(). ...