#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 10000100;
const int inf = 1e9;
int mod = 998244353;
int T;
typedef pair<int,int> P;
ll b[MAXN];
struct node{
ll val, sum, id;
}N[MAXN];
ll ans[MAXN];
int main()
{
memset(ans,0,sizeof(ans));
ll n, p, x, y, z, bf;
cin >> n >> p >> x >> y >> z >> bf;
N[1] = {bf,bf,1};
ans[1] = bf;
b[1] = bf;
ll top = 1;
for(ll i = 2;i <= n;i++)
{
b[i] = (x * ans[i-1] % p + y * b[i-1] % p + z % p) % p;
while(top && N[top].val > b[i]){
top--;
}
ll tmp = (N[top].sum + b[i]*(i-N[top].id)) % mod;
N[++top] = {b[i],tmp,i};
ans[i] = (ans[i-1]+tmp) % mod;
}
ll res = 0;
for(ll i = 1;i <= n;i++)
{
res ^= ans[i];
//printf("%d ",ans[i]);
}
//printf("\n");
printf("%lld\n",res);
return 0;
}
G 单调栈
题目给出b[i]的递推公式
利用单调栈维护某个区间内的最小值
每个N[i].val贡献为(i-N[top].val)这么多次,剩下的由N[top].sum贡献
D 最小生成树
注意先比较有向边的终点,在比较起点
用并查集判断回路
J 差分+分类讨论
题意:
给定一个长度为 n 的数列,n 为偶数,保证每个元素在 [ 1 , k ] 之间
每次操作可以把某个位置的数字变成 [ 1 , k ] 内的任意数字
要求让这个数列满足:对于所有的 i ∈ [ 1 , n/2 ],a[i] + a[n-i+1] 是一个定值
问最少的操作次数
枚举定值x
1.若x ∈ \in ∈[2,min(a[i],a[n+1-i])] || x ∈ \in ∈ [max(a[i],a[n+1-i]+k)+1,2*k] 需要改动两个数 这一范围内所有数+2
2.若x ∈ \in ∈[min(a[i],a[n+1-i])+1,max(a[i],a[n+1-i])+k] 需要改动一个数字,这一范围内所有数+1
3 若x == a[i]+a[n+1-i] 不改
b[i] = a[i]-a[i-1]
差分 区间改变:[l,r]区间内数+2 vis[l] += 2 vis[r+1] -= 2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5+100;
const int inf = 1e9;
ll mod = 998244353;
int T;
typedef pair<int,int> P;
ll b[MAXN];
int a[MAXN];
int vis[2*MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int n, k;
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
vis[1] = 0;
for(int i = 1;i <= n/2;i++)
{
int l = min(a[i],a[n+1-i]);
int r = max(a[i],a[n+1-i])+k;
int sum = a[i] + a[n+1-i];
vis[2] += 2; vis[l+1] -= 2;
vis[l+1]++; vis[r+1]--;
vis[r+1] += 2; vis[2*k+1] -= 2;
vis[sum]--; vis[sum+1]++;
}
int ans = 1e9;
for(int i = 2;i <= 2*k;i++)
{
vis[i] += vis[i-1];
ans = min(ans,vis[i]);
}
printf("%d\n",ans);
}
return 0;
}
L
一个长度大于等于2的十进制整数x,如果能整除某个非零个位数y,那么只需满足x的最后两位能整除y