存档个人简介
  • 板块灌水区
  • 楼主lijunxi20231818
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/2 17:39
  • 上次更新2024/9/2 18:37:13
查看原帖
存档个人简介
1070754
lijunxi20231818楼主2024/9/2 17:39

线性鸡

#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
#define int long long
int n, b[maxn] = {0};
void insert(int p){
	for(int i = 51; i >= 0; i--){
		if((p >> i) & 1){
			if(!b[i]){
				b[i] = p;
				return;
			}
			else p ^= b[i];
		}
	}
}
signed main(){
	cin >> n;
	for(int i = 1, p; i <= n; i++){
		cin >> p;
		insert(p);
	}
//	for(int i = 51; i >= 0; i--) cout << b[i] << endl;
	int num = 0;
	for(int i = 51; i >= 0; i--){
		num = max(num, num ^ b[i]);
//		cout << i << " " << num << endl;
	}
	cout << num;
	return 0;
}

https://www.luogu.com.cn/paste/yzikg4q9

G. 着色方案

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod  = 1e9 + 7;
int k, A[6], dp[16][16][16][16][16][6];
bool vis[16][16][16][16][16][6];
int dfs(int a, int b, int c, int d, int e, int x){
   if(vis[a][b][c][d][e][x]) return dp[a][b][c][d][e][x];
   vis[a][b][c][d][e][x] = true;
   if(!a && !b && !c && !d && !e) return dp[a][b][c][d][e][x] = 1;
   int ans = 0;
   if(a) ans = (ans + (a - (x == 2)) * dfs(a - 1, b, c, d, e, 1)) % mod;
   if(b) ans = (ans + (b - (x == 3)) * dfs(a + 1, b - 1, c, d, e, 2)) % mod;
   if(c) ans = (ans + (c - (x == 4)) * dfs(a, b + 1, c - 1, d, e, 3)) % mod;
   if(d) ans = (ans + (d - (x == 5)) * dfs(a, b, c + 1, d - 1, e, 4)) % mod;
   if(e) ans = (ans + e * dfs(a, b, c, d + 1, e - 1, 5)) % mod;
   return dp[a][b][c][d][e][x] = ans;
}
signed main(){
   cin >> k;
   for(int i = 1, x; i <= k; i++){
   	cin >> x;
   	A[x] += 1;
   }
   dfs(A[1], A[2], A[3], A[4], A[5], 0);
   cout << dp[A[1]][A[2]][A[3]][A[4]][A[5]][0];
   return 0;
}

Bad Hair Day 乱发节

#include<bits/stdc++.h>
using namespace std;
const int maxn = 8e4 + 5;
int n, a[maxn];
long long ans = 0;
int s[maxn];
int top = 0;
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	for(int i = 1; i <= n; i++){
		if(a[i] < s[top]){
			ans += top;
		}else{
			while(a[i] >= s[top] && top) top--;
			ans += top;
		}
		s[++top] = a[i];
	}
	cout << ans;
	return 0;
}

滑动窗口

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
struct node{
	int val, id;
};
int N, K;
int A[maxn];
int mx[maxn], mn[maxn];
node q[maxn];
int main(){
	cin >> N >> K;
	for(int i = 1; i <= N; i++){
		cin >> A[i];
	}
	int head = 1, tail = 0;
	for(int i = 1; i <= N; i++){
		while(head <= tail && q[tail].val >= A[i]) tail--;
		q[++tail] = (node){A[i], i};
		if(i >= K){
			while(head <= tail && q[head].id <= i - K) head++;
//			mn[i] = q[head].val;
			cout << q[head].val << " ";
		}
	}
	cout << endl;
	head = 1, tail = 0;
	for(int i = 1; i <= N; i++){
		while(head <= tail && q[tail].val <= A[i]) tail--;
		q[++tail] = (node){A[i], i};
		if(i >= K){
			while(head <= tail && q[head].id <= i - K) head++;
//			mx[i] = q[head].val;
			cout << q[head].val << " ";
		}
	}
	memset(q, 0, sizeof(q));
	return 0;
}

最大数

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5 + 5;
int m, mod, t;
int st[2][maxn], top, cnt;
int q[maxn];
void add(int x){
	cnt += 1;
	while(x > st[1][top] && top) top -= 1;
	st[0][++top] = cnt;
	st[1][top] = x;
}
void query(int mx){
	int l = 1, r = top;
    while(l < r){
        int mid = (l + r) / 2;
        if(st[0][mid] < mx) l = mid + 1;
        else r=mid;
    }
	t = st[1][r];
    cout << t << endl;
}
signed main(){
	cin >> m >> mod;
    while(m--){
        char ch;
        cin >> ch;
        if(ch == 'A') {
        	int x;
        	cin >> x;
        	add((t + x) % mod);
		}
        else {
        	int x;
        	cin >> x;
			query(cnt - x + 1);
		}
    }
	return 0;
}

最大连续和

#include<bits/stdc++.h>
#define fo(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
const int maxn = 2e5 + 5;
int n, m, top, l = 1, r = 0, sum[maxn];
int ans = INT_MIN;
int a[maxn];
struct node{
	int sum, id;
};
node q[maxn];
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		sum[i] = sum[i - 1] + a[i];
	}
	q[++r] = (node){0, 0};
	fo(i, 1, n){
		while(l <= r && q[r].sum >= sum[i]) r -= 1;
		while(l <= r && q[l].id < i - m) l += 1;
		ans = max(ans, sum[i] - q[l].sum);
		q[++r] = (node){sum[i], i};
	}
	cout << ans;
	return 0;
} 

烽火传递

#include<bits/stdc++.h>
#define fo(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
struct node{
	int val, id;
};
const int maxn = 2e5 + 5;
int n, m, top, l = 0, r = 0, dp[maxn];
int ans = INT_MAX;
int a[maxn];
node q[maxn];
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	fo(i, 1, m) dp[i] = a[i];
	fo(i, 1, n){
		while(l <= r && q[l].id < i - m) l += 1;
		while(l < r && q[r].val >= a[i] + q[l].val) r -= 1;
		dp[i] = a[i] + q[l].val;
		q[++r] = (node){dp[i], i};
	}
	fo(i, n - m + 1, n){
		ans = min(ans, dp[i]);
	}
	cout << ans;
	return 0;
} 

游历

#include<bits/stdc++.h>
#define int long long
#define maxn 500005
using namespace std;
int n, m, a, dep[maxn], fa[maxn][45], now, nex, tot = 0;
int head[maxn];
long long ans = 0, val[maxn];
struct node{
	int to, nex, one, two;
} E[maxn << 1];
void add(int u, int v, int o, int t){
	E[++tot].to = v;
	E[tot].nex = head[u];
	E[tot].one = o;
	E[tot].two = t;
	head[u] = tot;
}
void dfs(int x, int f) {
    dep[x] = dep[f] + 1;
    fa[x][0] = f;
    for(register int i = 1; (1 << i) <= dep[x]; i++){
    	fa[x][i] = fa[fa[x][i - 1]][i - 1];
	}
	for(register int i = head[x]; i; i = E[i].nex){
		if(E[i].to != f){
			dfs(E[i].to, x);
		}
	}
}
int lca(int x, int y)
{
	if(dep[x] < dep[y]) x ^= y ^= x ^= y;
	for(register int i = 40; i >= 0; i--)
	{
		if(dep[fa[x][i]] >= dep[y]) x = fa[x][i];
		if(x == y) return y;
	}
	for(register int i = 40; i >= 0; i--)
		if(fa[x][i] != fa[y][i]) {x = fa[x][i]; y = fa[y][i];}
	return fa[x][0];
}
void solve(int x)
{
	int u;
	for(register int i = head[x]; i; i = E[i].nex){
		if(E[i].to != fa[x][0])
		{
			solve(E[i].to);
			val[x] += val[E[i].to];
		}
		else u = i;
	}
	if(E[u].one * val[x] < E[u].two) ans += E[u].one * val[x];
	else ans += E[u].two;
	return;
}
signed main(){
	scanf("%d", &n);
	for(register int i = 1, u, v, c1, c2; i < n; i++)
	{
		scanf("%d %d %d %d", &u, &v, &c1, &c2);
		add(u, v, c1, c2); add(v, u, c1, c2);
	}
	dfs(1, 0);
	for(register int i = 1; i < n; i++)
	{
		val[i]++; val[i + 1]++;
		val[lca(i, i + 1)] -= 2;
	}
	solve(1);
	printf("%lld", ans);
	return 0;
}
2024/9/2 17:39
加载中...