2019 杭電多校(第一場)

2021-09-25 16:52:50 字數 2959 閱讀 9238

題目

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]>=l就代表b[r][j]這一線性基是在[l,r]之間獲得的,從高位到低位對可用的線性基進行貪心。

**

#include using namespace std;

typedef long long ll;

const int base = 30;

const int n = 500005;

int n,q,b[n][base+5],pos[n][base+5];//b a[1] - a[i] 第j位線性基

//pos 最小的[i]使b[i][j] 有值

void get(int x,int r)

if(pos[r][i] < id)

x ^= b[r][i];}}

}int query(int l,int r)

}return ans;

}int main()

int lastans = 0;

while(q--)

else}}

return 0;

}

1004 vacation

(思維)

題意給你n輛車 告訴你車長 速度 距離終點距離 。 不能超車 問最後一輛到達終點需要時間

思路思維

可以求出每輛車按原速度到達應該到達的地方所需要的時間,取最大值,最大值前面的都能提前到,後面的可以理解為都撞到了這輛車,以相同速度行駛,該車到達時,所有車都能到達指定位置

**

#include using namespace std;

typedef long long ll;

struct node

a[1000006];

bool cmp(node a,node b)

int main()

for(int i = 0; i <= n; i++)

for(int i = 0; i <= n; i++)

sum -= a[0].l;

double time = 0.0;

for(int i = n;i >= 0;i--)}}

printf("%.10lf\n",time);

}return 0;

}

1005 path (網路流)

題意給你n個點 m條邊,問去掉那些邊後,最短路會變大

思路最短路變大,即最短路的dag圖不連通,即最小割,即最大流

對於每一條邊u->v 如果dist[v] - dist[u] == w 這條邊就在最短路的dag圖里

**

#include using namespace std;

typedef long long ll;

#define inf 0x3f3f3f3f

ll head[100006],headp[100006];

struct code

edge[200006],path[200006];

ll top,top1;

void addpath(ll s,ll e,ll v)

ll dist[100005],vis[100005];

void spfa(ll n)}}

}}void add(ll s,ll e,ll v)

ll dap[100006];

bool bfs(ll s,ll e)}}

if(dap[e]!=0)

return true;

else

return false;

}ll dfs(ll u,ll e,ll f)

}if(temp==f)

dap[u]=inf;//就這乙個剪枝卡超時

return f-temp;

}ll max_flow(ll s,ll e)

int main()

spfa(n);

for(ll i=1; i<=n; i++)}}

cout<1009 string (貪心)

題意給你乙個字串,問符合要求的字典序最小的字長是什麼

要求 1 長度為k 2 把個字母在某乙個範圍

思路求字尾和 貪心列舉每一位,驗證

**#include using namespace std;

typedef long long ll;

const int maxn = 100005;

char s[maxn];

int num[maxn][30],pos[30],nxt[maxn][30];

int n,k,l[30],r[30],top;

char b[maxn];

int used[maxn];

void init()

for(int i = n;i >= 1;i--)

pos[s[i]-'a'] = i;

num[i][s[i] - 'a']++;

}for(int i = 0;i <26;i++)

}int ok(int x)

else

}if(qw > k - top - 1) return 0;

return 1;

}int main()

init();

int flag = 1, p = 0;

while(1)

}if(flagg == 0)

if(top == k)

}if(flag==0) printf("-1\n");

else printf("%s\n",b);

}return 0;

}

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杭電多校第一場

從右到左分別為0 n輛車,每輛車有長度l,起始位置s和速度v,0座標在左邊,不能超車,單車道,問0號車到達0座標的最短時間。最短時間考慮二分時間,然後按這個時間從左邊第一輛車開始依次計算最終位置,最後判斷0號車的位置即可。include using namespace std const int n...

2019 杭電多校 第一場

2019 multi university training contest 1 給定包含 n 個數的序列,m 個詢問。詢問有兩種操作,操作 0 表示在陣列最後新增乙個新元素,操作 1 表示查詢區間 l,r 的子集的異或最大值。線性基 貪心一條路上有 n 1 輛車。第 i 輛車的長度為 l i 離終...