HDU - 3577 Fast Arrangement

Chinese always have the railway tickets problem because of its‘ huge amount of passangers and stations. Now goverment need you to develop a new tickets query system.
One train can just take k passangers. And each passanger can just buy one ticket from station a to station b. Each train cannot take more passangers any time. The one who buy the ticket earlier which can be sold will always get the ticket.
InputThe input contains servel test cases. The first line is the case number. In each test case:
The first line contains just one number k( 1 ≤ k ≤ 1000 ) and Q( 1 ≤ Q ≤ 100000 )
The following lines, each line contains two integers a and b, ( 1 ≤ a < b ≤ 1000000 ), indicate a query.
Huge Input, scanf recommanded.OutputFor each test case, output three lines:
Output the case number in the first line.
If the ith query can be satisfied, output i. i starting from 1. output an blank-space after each number.
Output a blank line after each test case.Sample Input

1
3 6
1 6
1 6
3 4
1 5
1 2
2 4

Sample Output

Case 1:
1 2 3 5线段树,每一个区间内的点加一,且不能超过k,注意乘车区间是【l,r-1】.
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define ls o<<1
 5 #define rs o<<1|1
 6 #define lson L,mid,ls
 7 #define rson mid+1,R,rs
 8 #define middnf int mid=(L+R)>>1;
 9 #define ll long long
10
11 using namespace std;
12
13 const int maxn=1000005;
14 int mx[maxn<<2],lazy[maxn<<2],ou[100005];
15 int n,m,x,y,z;
16
17 int max(int a,int b)
18 {
19     return a>b?a:b;
20 }
21
22 void pushup(int o)
23 {
24     mx[o]=max(mx[ls],mx[rs]);
25 }
26
27 void pushdown(int o)
28 {
29     if(!lazy[o]) return;
30     lazy[ls] += lazy[o];
31     lazy[rs] += lazy[o];
32     mx[ls]+=lazy[o];
33     mx[rs]+=lazy[o];
34     lazy[o] = 0;
35 }
36
37 void update(int l,int r,int L,int R,int o,int v){//区间更新
38     if(l<=L&&R<=r)
39     {
40         mx[o] += v;
41         lazy[o] += v;
42         return;
43     }
44     pushdown(o);
45     middnf;
46     if(l<=mid) update(l,r,lson,v);
47     if(r>mid) update(l,r,rson,v);
48     pushup(o);
49 }
50
51 int query(int l,int r,int L,int R,int o)
52 {
53     if(l<=L&&R<=r)
54         return mx[o];
55     pushdown(o);
56     middnf;
57     int ret = 0;
58     if(l<=mid)
59         ret = max(ret,query(l,r,lson));
60     if(r>mid)
61         ret = max(ret,query(l,r,rson));
62     return ret;
63 }
64
65 int main()
66 {
67     char c[5];
68     int T,s=0;
69     scanf("%d",&T);
70     while(T--)
71     {
72         int ss=0;
73         memset(mx,0,sizeof(mx));
74         memset(lazy,0,sizeof(lazy));
75         scanf("%d%d",&n,&m);
76         for(int i=1;i<=m;i++)
77         {
78             scanf("%d%d",&x,&y);
79             int num=query(x,y-1,1,1000005,1);
80             if(num<n)
81             {
82                 ou[ss++]=i;
83                 update(x,y-1,1,1000005,1,1);
84             }
85         }
86         printf("Case %d:\n",++s);
87         for(int i=0;i<ss;i++)
88         {
89             printf("%d ",ou[i]);
90         }
91         printf("\n\n");
92     }
93
94
95     return 0;
96 }
时间: 2024-10-14 18:22:43

HDU - 3577 Fast Arrangement的相关文章

HDU 3577 Fast Arrangement (线段树区间更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车时间,每个人按次序上车,问哪些人能上车输出他们的序号. 这题用线段树的成段更新,把每个人的上下车时间看做一个线段,每次上车就把这个区间都加1,但是上车的前提是这个区间上的最大值不超过k.有个坑点就是一个人上下车的时间是左闭右开区间,可以想到要是一个人下车,另一个人上车,这个情况下这个点的大小还是不变

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题目链接:hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N: 矩阵C = A*B 矩阵M=CN?N 将矩阵M中的所有元素取模6,得到新矩阵M' 计算矩阵M'中所有元素的和 解题思路:因为矩阵C为N*N的矩阵,N最大为1000,就算用快速幂也超时,但是因为C = A*B, 所以CN?N=ABAB-AB=AC′N?N?1B,C' = B*A, 为K*K的矩阵,K最大为6,完全可以接受. #include <cstdio> #inc

HDU 4965 Fast Matrix Calculation(矩阵快速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次,可以变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个只有6x6,就可以用矩阵快速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N]

HDU 4965 Fast Matrix Calculation(矩阵高速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个仅仅有6x6.就能够用矩阵高速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N

HDU 2409 Team Arrangement (结构体排序)

题目链接:HDU 2409 Team Arrangement 题意:给出22个人(编号,名字,踢的位置,在队里的时间),让我们选DD-MM-SS的阵型+一个守门员.在选出队长(时间在最久的就是队长,时间相同编号大为队长),选人的顺序是从编号小的开始. 结构体排序就好了,注意出输出是按队长,D,M,S的顺序,选队长记录队长的编号(而不是下标,我的代码之后还要排序). AC代码: #include<stdio.h> #include<string.h> #include<algo

HDU 4572 Bottles Arrangement(找规律,仔细读题)

题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1,m-2,m-2,……,2,2,1,1求出前m个数字的和就是答案. //发现案例符合(之前的代码第二天发现案例都跑不对,真不知道我当时眼睛怎么了) #include <iostream> #include<stdio.h> #include<string.h> #inclu

HDU 1227 Fast Food (DP)

题目链接 题意 : 有n个饭店,要求建k个供应点,要求每个供应点一定要建造在某个饭店的位置上,然后饭店都到最近的供应点拿货,求出所有饭店到最近的供应点的最短距离. 思路 : 一开始没看出来是DP,后来想想就想通了.预处理,如果要在下标为 i 到 j 的饭店建一个供应点,那一定是在下标为(i+j)/2的位置建造的,状态转移方程:dp[i][j] = dp[i-1][k-1]+dis[k][j](i <= k <= j) ,dp[i][j]代表的是在前 j 个饭店中建了 i 个供应点的最小距离.方

hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场

Fast Matrix Calculation                                                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description One day, Alice and Bob felt bored again, Bob knows Ali