題目
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 離終...