P1546 最短网络(codevs | 2627村村属)

1291 火车线路

 

 时间限制: 1 s

 空间范围: 128000 KB

 题目等级 : 大师 Master

 

 

P1546 最短网络 Agri-Net

问题叙述 Description

某列火车采取在C个都市次(出发的城编号也1,结束达到的都会的号码吧C),假而该列火车出S单坐席,现在生R笔预订票之作业。现在纪念对这R笔业务拓展拍卖,看怎么预定能满足,哪些不可知满足。

无异于笔预定由O、D、N三只整数组成,表示从今起点站O到对象站D需要预定N个座位。一画预定能满足是借助该笔业务在路途范围外发会满足的空座位,否则就算未克满足。一画业务不能够拆分,也不怕是起点和终点站不克更改,预定的座位数目也不克改。所有的预约要求仍给有先后顺序进行处理。

求您编写程序,看那些预定业务会满足,那些休克满足。

问题背景

农民约翰于增选为她们始终的镇长!他其中一个竞选承诺就是于镇上建立起互联网,并一连至有的农场。当然,他需而的援。

输入描述 Input Description

     
 输入文件中的第一行为三个整数``C``、``S``、``R``,(1<=c<=60
000, 1<=s<=60 000, 1<=r<=60
000)他们之间用空隔分开。接下来的``R``行每行为三个整数O、D、N,(1<=o<d<=c,
1<=n<=s),分别表示每一样笔画预定业务。

输出描述 Output Description

     
 对第I笔画业务,如果能满足,则于输出文件的第I行输出“T”,否则输出“N”

问题叙述

约翰已为他的农场安排了一如既往长便捷的纱线,他思念拿立即漫长路线共享为其他农场。为了用极端小的费,他想铺设最缺的光纤去老是有的农场。

您以获取相同卖各农场内连接费用之列表,你要寻找来会接二连三有农场并所用光纤最短缺的方案。每半独农场内的离不会见跳100000

样例输入 Sample Input

4 6 4

1 4 2

1 3 2

2 4 3

1 2 3

输入输出格式

输入格式:

先是实践: 农场的个数,N(3<=N<=100)。

其次行..结尾:
后来底行包含了一个N*N的矩阵,表示每个农场中的偏离。理论及,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80只字符,因此,某些行会紧接着另一些推行。当然,对角线将见面是0,因为无会见有路由第i独农场交它们自己。

出口格式:

唯有来一个输出,其中包含连接至每个农场的光纤的绝小长。

样例输出 Sample Output

T

T

N

N

输入输出样例

输入样例#1:

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

出口样例#1:

28

分析

经验:先动手明白思路在做题,思路使科学。

原思路:区间查询以及,查询区间内发出稍许空座位以及用之席于(比较艺术,a站暨b站外剩余座位和同a站至b站用之席位和),但诸如此类做肯定不对,如果座位都在结尾给之站,而我们不能够拿于后面要之所以前方的空缺处找到并行使这些,“一笔业务不可知拆分,也就是是起点和终点站不克改”就是这句话。

毋庸置疑思路:操作明显是好线段树护的,注意一个区间[l,r]中r并不需要计算,所以才需要操作[l,r-1]不畏可以了(到r站就下车了)。我们仅需要查询区间的极致小价就是可了,因为只要这区间的极小价都得以满足的说话,显然整个区间是可满足的,线段树功能:区间维护最小值、区间查询最小价。

 

说明

题目翻译来自NOCOW。

USACO Training Section 3.1

思路:Krukal算法;

 1 #include<iostream>
 2 using namespace std;
 3 #define N 10010
 4 #include<algorithm>
 5 struct point 
 6 {
 7     int a,b,l;
 8 }farm[N];
 9 int n,k;
10 int top;
11 int sum;
12 int far[N];
13 bool cmp(point a,point b)
14 {
15     return a.l<b.l;
16 }
17 int find(int a)
18 {
19     if(far[a]!=a)far[a]=find(far[a]);
20     return far[a];
21 }
22 int main()
23 {
24     cin>>n;
25     for(int i=1;i<=n;++i)
26         for(int j=1;j<=n;++j)
27         {
28             int x; 
29             cin>>x;
30             if(x!=0)
31             {
32                 top++;
33                 farm[top].a=i;farm[top].b=j;farm[top].l=x;
34             }
35         }
36     for(int i=1;i<=n;++i)far[i]=i;
37     sort(farm+1,farm+top+1,cmp);
38     for(int i=1;i<=top;++i)
39     {
40         int aa=find(farm[i].a);
41         int bb=find(farm[i].b);
42         if(aa!=bb)
43         {
44             far[aa]=bb;
45             sum+=farm[i].l;
46             ++k;
47         }
48         if(k==n-1)break;
49     }
50     cout<<sum;
51     return 0;
52 }

 

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define lson l,m,rt<<1
 5 #define rson m+1,r,rt<<1|1
 6 #define MAXN 60010
 7 
 8 int mn[MAXN<<2];
 9 int col[MAXN<<2];
10 int n,s,t,d;    //n城市,s座位,t订单 
11 void putup(int rt)
12 {
13     mn[rt] = min(mn[rt<<1],mn[rt<<1|1]);
14 }
15 void putdown(int rt)
16 {
17     if (col[rt])
18     {
19         col[rt<<1] += col[rt];
20         col[rt<<1|1] += col[rt];
21         mn[rt<<1] -= col[rt];
22         mn[rt<<1|1] -= col[rt];
23         col[rt] = 0;
24     }
25 }
26 void build(int l,int r,int rt)
27 {
28     if (l==r) 
29     {
30         mn[rt] = s;
31         return ;
32     }
33     int m = (l+r)>>1;
34     build(lson);
35     build(rson);
36     putup(rt);    
37 }
38 void update(int l,int r,int rt,int L,int R,int sc)
39 {
40     if (L<=l && r<=R)
41     {
42         col[rt] += sc;
43         mn[rt] -= sc;
44         return ;
45     }
46     putdown(rt);
47     int m = (l+r)>>1;
48     if (L<=m) update(lson,L,R,sc);
49     if (R>m)  update(rson,L,R,sc);
50     putup(rt);
51 }
52 int query(int l,int r,int rt,int L,int R)
53 {
54     if (L<=l && r<=R)
55     {
56         return mn[rt];
57     }
58     putdown(rt);
59     int ret = s;
60     int m = (l+r)>>1;
61     if (L<=m) ret = min(ret,query(lson,L,R));
62     if (R>m)  ret = min(ret,query(rson,L,R));
63     return ret;
64 }
65 int main()
66 {
67     scanf("%d%d%d",&n,&s,&t);
68     build(1,n,1);
69     for (int a,b,c,i=1; i<=t; ++i)
70     {
71         scanf("%d%d%d",&a,&b,&c);
72         d = query(1,n,1,a,b-1);
73         if (d>=c)
74         {
75             printf("T\n");
76             update(1,n,1,a,b-1,c);
77         }
78         else printf("N\n");
79     }
80     return 0;
81 }