百度之星初赛B轮 hdu 6114 6118 6119

hdu 6114

思路:就是在max(n,m)中取min(n,m)个,(模板收好

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int MOD=1e9+7;
 5 const int N = 2000 + 5;
 6
 7 int F[N], Finv[N], inv[N];
 8 void init(){
 9     inv[1] = 1;
10     for(int i = 2; i < N; i ++){
11         inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
12     }
13     F[0] = Finv[0] = 1;
14     for(int i = 1; i < N; i ++){
15         F[i] = F[i-1] * 1ll * i % MOD;
16         Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD;
17     }
18 }
19 int comb(int n, int m){//comb(n, m)就是C(n, m)
20     if(m < 0 || m > n) return 0;
21     return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
22 }
23
24 int main(){
25     int t;
26     init();
27     scanf("%d",&t);
28     while(t--){
29         int n,m;
30         scanf("%d%d",&n,&m);
31         printf("%d\n",comb(max(n,m),min(n,m)));
32     }
33 }

hdu 6118

PS:来自大佬的费用流

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 const int N=1e3+100;
  5 const int inf=1e9;
  6 struct edge
  7 {
  8     int from,to;
  9     int c,w;
 10 };
 11 vector<edge>es;
 12 vector<int>G[N];
 13 int pre[N];
 14 int dist[N];
 15 void init(int n)
 16 {
 17     es.clear();
 18     for(int i=0;i<=n+200;i++) G[i].clear();
 19 }
 20 void addedge(int u,int v,int c,int w)
 21 {
 22     es.push_back((edge)
 23     {
 24         u,v,c,w
 25     });
 26     es.push_back((edge)
 27     {
 28         v,u,0,-w
 29     });
 30     int x=es.size();
 31     G[u].push_back(x-2);
 32     G[v].push_back(x-1);
 33 }
 34
 35 bool spfa(int s,int t)
 36 {
 37     queue<int> q;
 38     bool inq[N];
 39     for(int i=0; i<N; i++) dist[i]=inf,inq[i]=false;
 40     pre[s]=-1;
 41     dist[s]=0;
 42     q.push(s);
 43     while(!q.empty())
 44     {
 45         int u=q.front();
 46         q.pop();
 47         inq[u]=false;
 48         for(int i=0; i<G[u].size(); i++)
 49         {
 50             edge e=es[G[u][i]];
 51             if(e.c&&dist[e.to]>dist[u]+e.w)
 52             {
 53                 pre[e.to]=G[u][i];
 54                 dist[e.to]=dist[u]+e.w;
 55                 if(!inq[e.to]) q.push(e.to),inq[e.to]=true;
 56             }
 57         }
 58     }
 59     return dist[t]<0;
 60 }
 61
 62 void dinic(int s,int t)
 63 {
 64     int flow=0,cost=0;
 65     while(spfa(s,t))
 66     {
 67         int d=inf;
 68         for(int i=t; i!=s; i=es[pre[i]].from)
 69             d=min(d,es[pre[i]].c);
 70         flow+=d;
 71         cost+=d*dist[t];
 72         for(int i=t; i!=s; i=es[pre[i]].from)
 73         {
 74             es[pre[i]].c-=d;
 75             es[pre[i]^1].c+=d;
 76         }
 77     }
 78     printf("%d\n",-cost);
 79 }
 80 int main()
 81 {
 82     int n,m;
 83     while(~scanf("%d%d",&n,&m))
 84     {
 85         for(int i=1; i<=n; i++)
 86         {
 87             int a,b,c,d;
 88            scanf("%d%d%d%d",&a,&b,&c,&d);
 89             addedge(0,i,b,a);
 90             addedge(i,n+1,d,-c);
 91         }
 92         for(int i=1; i<=m; i++)
 93         {
 94             int u,v,w;
 95             scanf("%d%d%d",&u,&v,&w);
 96             if(u==v) continue;
 97             addedge(u,v,inf,w);
 98             addedge(v,u,inf,w);
 99         }
100         dinic(0,n+1);
101         init(n);
102     }
103     return 0;
104 }

hdu 6119

思路:处理好重叠区间,然后以当前这个区间往后跑,跑到不能跑为止,当前跑的需要的sum,那么下个区间就可以用sum-(a[i].l-a[i-1].r-1),然后重后面那个区间跑,k多的情况

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5
 6 struct node{
 7     int l,r;
 8 }a[N];
 9 bool cmp(node p,node q){
10     if(p.l==q.l) return p.r<q.r;
11     return p.l<q.l;
12 }
13 struct nn{
14     int  l,r;
15 }b[N];
16
17 int main(){
18     int n,k;
19     while(scanf("%d%d",&n,&k)!=EOF){
20         for(int i=1;i<=n;i++)
21             scanf("%d%d",&a[i].l,&a[i].r);
22         sort(a+1,a+1+n,cmp);
23         int x=0;
24         int  Maxr=a[1].r;
25         b[x].l=a[1].l;
26         for(int i=2;i<=n;i++){
27             if(a[i].l<=Maxr){
28                 Maxr=max(Maxr,a[i].r);
29             }
30             else {
31
32                 b[x++].r=Maxr;
33
34                 b[x].l=a[i].l;
35                 Maxr=a[i].r;
36             }
37         }
38         b[x++].r=Maxr;//得到不重叠的区间
39         int sum=0;
40         int t=0;
41         int ans=0;
42         for(int i=0;i<x;i++)
43         {
44             while(sum<=k&&t<x)
45             {
46                 t++;
47                 if(t<x)
48                 sum+=b[t].l-b[t-1].r-1;
49             }
50             if(sum>k)
51             {
52                 ans=max(ans,b[t].l-b[i].l-(sum-k));
53                 sum-=b[i+1].l-b[i].r-1;
54             }
55             else
56             {
57                 ans=max(ans,b[x-1].r-b[i].l+k-sum+1);//已经跑到最后一个了
58             }
59
60         }
61         printf("%d\n",ans);
62     }
63 }
时间: 2024-10-25 16:13:16

百度之星初赛B轮 hdu 6114 6118 6119的相关文章

百度之星初赛A轮 hdu 6108 6112 6113

hdu 6108 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 int main(){ 6 int t; 7 cin>>t; 8 while(t--){ 9 ll x; 10 scanf("%I64d",&x); 11 ll ans=0; 12 for(int i=1;i*i<=x;i++){ 13 if((x-1)%i==0) { 14 a

hdu 4832 百度之星初赛二B

把横的和竖的分开考虑 //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<ma

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

HDU 5698 瞬间移动 (2016&quot;百度之星&quot; - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

2014百度之星初赛(第二场)——Best Financing

2014百度之星初赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[i]天小A收入earnings[i]元(0<=i<n).银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start.finish和interest_rates, 若购买理财产品i(0<=i<m),需要

2014百度之星初赛(第二场)——JZP Set

2014百度之星初赛(第二场)--JZP Set Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S. 例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S.但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集 给定n,求JZP集的个数. Input 第一行为T,表示输入数据组数. 每组数据包含一行整数n. 限制条件 1<=T<=10^5

2014百度之星初赛(第二场)——Chess

2014百度之星初赛(第二场)--Chess Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2)

2016&quot;百度之星&quot; - 初赛(Astar Round2A)解题报告

此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" - 初赛(Astar Round2A)  Problem 1001 All X Accept: 0    Submit: 0 Time Limit: 2000/1000 mSec(Java/Others)    Memory Limit : 65536 KB  Problem Description F(x,

数学 2015百度之星初赛2 HDOJ 5255 魔法因子

题目传送门 1 /* 2 数学:不会写,学习一下这种解题方式:) 3 思路:设符合条件的数的最高位是h,最低位是l,中间不变的部分为mid,由题意可得到下面的公式(这里对X乘上1e6用a表示,b表示1e6) 4 (h*power+l+mid)*a = (l*power+h+mid)*b 5 可推得:mid = ((h*power+l) * a - (l*power+h) * b) / (a - b); 6 所以可以枚举h,l然后求mid,注意mid的最低位一定是0,因为留出最低位加l或者h 7