2019HDU多校第一場

2022-08-19 13:33:10 字數 3104 閱讀 6829

1002.operation

傳送:題意:給定乙個長度為$n$的數列,$m$次操作,每次操作如下:

$0 l r$:查詢區間$[l,r]$內若干個數的最大異或和。

$1 x$:給數列末尾新增乙個數$x$。

資料範圍:$1<=n,m<=5e5,1<=a_i<=2^$。

分析:開始直接考慮用線段樹維護區間線性基的並,然後每次查詢求區間線性基,再求最大。(但是tle

貪心考慮答案。區間$[1,i]$的線性基一定是由$[1,i-1]$的線性基插入$a_i$後得到的。那麼可以通過維護線性基的字首和來得到答案。

(qaq,指路網友部落格:

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

const

int maxn=5e5+10;5

struct

linear_basis

13for (int i=32;i>=0;i--)

20else

25 x^=b[tot][i];26}

27}28}

29}30 ll query(int l,int

r)35

return

res;36}

37void clear(int

n)40

}lb;

41int

main()

50 ll lastans=0;51

while (m--)

61else66}

67}68return0;

69 }

1002

1004.vacation

傳送:題意:乙個路口,你前面有$n$輛車,給出每輛車的車長,距離路口的距離,以及每輛車的最大車速。要求這$n+1$輛車依此通過,問你的車頭通過路口的時間花費了多少。

資料範圍:$1<=n<=10^5,1<= s_i, v_i, l_i <=10^9$。

分析:

1 #include2

#define ll long long

3using

namespace

std;

4const

int maxn=1e5+7;5

struct node p[maxn];

6int

main()722

return0;

23 }

1004

1005.path

傳送:題意:有$n$點,$m$條路,要求切斷一些路,使得從$1-n$的路比最短路大的最小花費。切斷每一條路的花費就是每一條路的長度。

資料範圍:$1<=n,m<=10^5,1<=c<=10^9$。

分析:題目要求就是要去掉一些路,使得最短路不成立。跑最短路選取出所有的最短路的邊,然後用這些邊跑最小割即可。

1 #include2 #include3 #include4 #include5 #include6

#define en '\n'

7#define low(x) (x)&(-x)

8#define m(a,b) memset(a,b,sizeof a)

9using

namespace

std;

10 typedef long

long

ll;11

const

int n=2e4+10,m=n;

12const ll inf=1e18;

13struct edgee[m],edge[m<<1

];14

struct nodep[m];

15int

head[n],tot,head2[n],ttt,n,m;

16void add(int

from,int

to,ll len)

17;head[from]=tot;

19 edge[++tot]=(edge);head[to]=tot;20}

21void add_edge(int

from,int

to,ll len);head2[from]=ttt;23}

24 priority_queueint>>q;

25ll d[n],da[n],db[n];

26void dijkstra(int

s)2741}

42}43}

44int

s,t;

45 queueq;

46bool

bfs()

4762}63

}64return0;

65}66 ll dinic(int

x,ll flow)

6777 edge[i].len-=k,edge[i^1].len+=k,res-=k;78}

79}80return flow-res;81}

82int

main()

8395 dijkstra(1

);96

if(d[n]==inf)

97for (int i=0;i<=n;i++) da[i]=d[i],head2[i]=0

;98 ttt=0;99

for(int i=1;i<=m;++i) add_edge(p[i].y,p[i].x,p[i].c);

100dijkstra(n);

101for (int i=1;i<=n;i++) db[i]=d[i];

102for(int i=1;i<=m;++i)

103107

for (int i=0;i<=n;i++) d[i]=0

;108 s=1,t=n;

109 ll maxflow=0

;110

while(bfs()) maxflow+=dinic(s,inf);

111 printf("

%lld\n

",maxflow);

112}

113 }

1005

2019HDU多校第一場 BLANK DP

題意 有四種數字,現在有若干個限制條件 每個區間中不同的數字種類必須是多少種,問合法的方案數。思路 定義 dp i j k t 代表填完前 t 個位置後,這 4 個數字最後一次出現的位置,排序後為 i,j,k,t i j k t 的方案數目,則按照第 t 1 位的數字的四種選擇,可以得 到四種轉移。...

2019杭電多校第一場

dp i j k t dp i j k t dp i j k t 表示0 1 2,3 0,1,2,3 0,1,2,3出現的位置排序後為i,j k,t i,j,k,t i,j,k,t的方案數 列舉第t 1 t 1t 1位的情況進行轉移 對於限制情況,固定右端點,暴力列舉所有狀態,把所有非法狀態清零 i...

2019 杭電多校(第一場)

題目 1002 operation 線性基 題意給你n個數 兩個操作,查詢l r區間異或最大值 在陣列最後麵加一數 思路維護兩個陣列 1 b i j 儲存a 1 到a i 之間的第j位線性基。2 pos i j 儲存最大的l a l 使得b i j 有值。對於每一次詢問 l,r 如果pos r j ...