题解(自己悟吧qwq):
首先,看到这个题,我们显然会打一个暴力,然后比较大佬的人就会这样打(45分):
#include<bits/stdc++.h> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,m,q; char s[100010][31]; long long ans; inline void work(int l,int r) { ans=1; for(int t=1;t<=n;t++) { int flag1=0; int flag0=0; int flag=0; for(int j=l;j<=r;j++) { if(s[j][t]=='1') flag1=1; if(s[j][t]=='0') flag0=1; if(s[j][t]=='?') flag=1; } if(flag1==1&&flag0==1) { printf("0 "); return ; } else if(flag==0) continue; else if(flag1==0&&flag0==0&&flag==1) ans*=2; } printf("%lld ",ans); } int main() { freopen("lin.in","r",stdin); freopen("lin.out","w",stdout); n=read(),m=read(),q=read(); for(int i=1;i<=m;i++) { scanf("%s",s[i]+1); } int k,l,r; for(int i=1;i<=q;i++) { k=read(); if(k==1) { int t=read(); scanf("%s",s[t]+1); } if(k==0) { l=read(),r=read(); work(l,r); } } return 0; }
更大佬的人便会这样打(70分):
#include <bits/stdc++.h> using namespace std; template <class T> inline void read(T &num) { bool flag = 0; num = 0; char c = getchar(); while ((c < '0' || c > '9') && c != '-') c = getchar(); if (c == '-') { flag = 1; c = getchar(); } num = c - '0'; c = getchar(); while (c >= '0' && c <= '9') num = (num << 3) + (num << 1) + c - '0', c = getchar(); if (flag) num *= -1; } template <class T> inline void output(T num) { if (num < 0) { putchar('-'); num = -num; } if (num >= 10) output(num / 10); putchar(num % 10 + '0'); } template <class T> inline void outln(T num) { output(num); putchar(' '); } template <class T> inline void outps(T num) { output(num); putchar(' '); } const int N = 31, M = 100010; int n, m, q; struct segment { char val[M]; bool all1[M * 4]; bool all0[M * 4]; void init(int node, int nl, int nr) { if (nl < nr) { int mid = (nl + nr) >> 1; init(node * 2, nl, mid); init(node * 2 + 1, mid + 1, nr); all1[node] = all1[node * 2] & all1[node * 2 + 1]; all0[node] = all0[node * 2] & all0[node * 2 + 1]; } else { if (val[nl] == '?') all1[node] = all0[node] = 1; else { all1[node] = val[nl] == '1'; all0[node] = val[nl] == '0'; } } } void modify(int node, int nl, int nr, int x, char va) { if (val[x] == va) return; if (nl < nr) { int mid = (nl + nr) >> 1; if (x <= mid) { modify(node * 2, nl, mid, x, va); } else { modify(node * 2 + 1, mid + 1, nr, x, va); } all1[node] = all1[node * 2] & all1[node * 2 + 1]; all0[node] = all0[node * 2] & all0[node * 2 + 1]; } else { if (va == '?') all1[node] = all0[node] = 1; else { all1[node] = va == '1'; all0[node] = va == '0'; } val[x] = va; } } pair<bool, bool> query(int node, int nl, int nr, int l, int r) { if (l <= nl && r >= nr) { return make_pair(all1[node], all0[node]); } int mid = (nl + nr) >> 1; bool a1 = true, a0 = true; if (l <= mid) { auto lo = query(node * 2, nl, mid, l, r); a1 &= lo.first; a0 &= lo.second; } if (r >= mid + 1) { auto lo = query(node * 2 + 1, mid + 1, nr, l, r); a1 &= lo.first; a0 &= lo.second; } return make_pair(a1, a0); } void dfs(int node, int nl, int nr) { if (nl < nr) { int mid = (nl + nr) >> 1; dfs(node * 2, nl, mid); dfs(node * 2 + 1, mid + 1, nr); } outps(nl); outps(nr); outps(all1[node]); outln(all0[node]); } } segs[N]; int main() { freopen("lin.in", "r", stdin); freopen("lin.out", "w", stdout); read(n); read(m); read(q); char ch; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { do { ch = getchar(); } while (ch == ' ' || ch == ' ' || ch == ' ' || ch == ' ' || ch == '