B
题目链接
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 3e6 + 5;
ll quick(ll a, ll b){
ll ans = 1;
while(b){
if(b&1) ans = ans * a%mod;
a = a * a%mod;
b >>= 1;
}
return ans;
}
ll a[N];
int main()
{
int n,m;scanf("%d%d",&n,&m);
ll ans = 0;
ll y = quick(2, mod - 2);
for(int i = 1; i <= n; i ++) a[i] = i;
for(ll j = 1; j <= n; j ++){
int cnt = 1;
for(ll i = j; i <= n; ){
ll g = min(j, n - i + 1) ;
ans = (ans + 1LL*a[cnt ++]*(i + i + g - 1)%mod*g%mod*y%mod)%mod;
i += g;
}
for(ll i = 1; i <= n/j +1; i ++){
a[i] = a[i]*i%mod;
}
}
printf("%lld\n",ans);
}
C
题目链接
#include <bits/stdc++.h>
using namespace std;
char s[1005][1005];
char s1[1005],s2[1005];
bitset<1005> c[1005];
bitset<1005> a;
bitset<1005> b;
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i = 0; i < n; i ++){
scanf("%s",s[i]);
for(int j = 0;j < m; j ++){
if(s[i][j] == '1')
c[i][j] = 1;
else c[i][j] = 0;
}
}
int q;
scanf("%d",&q);
for(int i = 0; i < q; i ++){
scanf("%s",s1);
for(int j = 0; j < m; j ++){
if(s1[j] == '1') a[j] = b[j] = 1;
if(s1[j] == '0') a[j] = 0,b[j] = 1;
if(s1[j] == '_') a[j] = b[j] = 0;
}
int ans = 0;
for(int j = 0; j < n; j ++){
if((c[j]&b) == a) ans ++;
}
printf("%d\n",ans);
}
}
E
题目链接
线段树离线区间最小值
#include <bits/stdc++.h>
using namespace std;
#define ls rt << 1
#define rs rt << 1|1
#define int long long
typedef long long ll;
const int maxn = 5e5 + 5;
ll tree[maxn << 2];
int pos[maxn],pre[maxn << 2];
ll ans[maxn];
struct node{
int l, r,id;
}T[maxn];
bool cmp(node a, node b){
return a.r < b.r;
}
void update(int l, int r, int rt,ll val, int pos){
if(l == r){
tree[rt] = min(tree[rt], val);
return ;
}
int mid = (l + r) >> 1;
if(pos <= mid) update(l, mid, ls,val, pos);
else update(mid + 1, r ,rs,val, pos);
tree[rt] = min(tree[rs], tree[ls]);
}
ll query(int L, int R,int l, int r ,int rt ){
if(L <= l && r <= R) return tree[rt];
int mid = (l + r) >> 1;
ll ans = 0x3f3f3f3f;
if(L <= mid) ans = min(query(L, R , l, mid, ls),ans);
if(mid < R) ans = min(ans, query(L, R , mid + 1, r ,rs));
return ans;
}
signed main()
{
int n,Q;
scanf("%lld%lld",&n,&Q);
int sum = 0;
for(int i = 0; i<= 4*500000; i ++){
pre[i] = -1;
tree[i] = 0x3f3f3f3f;
}
pre[0] = 0;
for(int i = 1; i <= n; i ++){
int x;
scanf("%lld",&x);
sum ^= x;
if(pre[sum] == -1) pos[i] = -1;
else pos[i] = pre[sum] + 1;
pre[sum] = i;
}
for(int i = 1; i <= Q; i ++){
scanf("%lld%lld",&T[i].l,&T[i].r);
T[i].id = i;
}
sort(T + 1, T + Q + 1, cmp);
int len = 1;
for(int i = 1; i <= n;i ++){
if(pos[i] != -1) update(1, n ,1, i - pos[i] + 1, pos[i]);
while(i == T[len].r){
ans[T[len].id] = query(T[len].l, T[len].r, 1, n, 1);
len ++;
}
}
for(int i = 1; i <= Q; i ++){
if(ans[i] > n) printf("-1\n");
else printf("%lld\n",ans[i]);
}
}