校队选拔
http://10.8.128.203:7217/contest.php?cid=1065
总rank :11
19级rank:5
校区rank:3
给自己以警醒吧。
A:
签到题;
B:
感谢衣老师不厌其烦地帮我查错。
用线段树维护即可,注意在pushdown的时候先加后乘。
在乘数的时候,乘的标记和加的标记都要乘,同时在pushdown的时候,加的标记要乘;
C:
紫书上的原题。
不要在意树,想填充区间那样填充正方形就行了。
注意由于是先序遍历,所以同深度的子结点位置并不挨着,需要用tot来记访问到第几个。
x,y记录当前正方形左上角的坐标,如果是p的话可以继续划分。
D:
模拟即可;
H:
排序即可;
I:
lower_bound 和 upper_bound
注意D操作用upper_bound
K:
tong[i],表示数i出现的次数;
由于p很小的时候,满足条件的数可能很多,于是我们提前将p <= sqrt(n)时的表打好;
num[p][x],模p为x的数的个数;
每次修改时只要扫一遍修改num数组即可;
可能是oj的原因
scanf读入2个数,然后再读入一个数
这样写会T;
一次性读入3个数就A掉了。
所以以后就要注意啊,还是沿用下面的写法,以防万一。
L:
单调栈
一行行地进行处理,L[i]表示第i个矩形向左延伸,最远延伸到第列,R[i]表示表示向右。
单调栈是单调递增的,如果当前的比栈顶低,一直弹栈直到比栈顶高,则L[i]就是栈顶的位置。
满足单调性。
M:
KMP预处理Next数组,然后判断就行了。
其实不用这么麻烦,只要i与i + n不同就不是……
N:
分解质因数,然后统计2和5的个数,输出小的个数就是0的个数。
代码:
B:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const ll mod = 10007,MAXN = 200001; struct hh{ ll jia,ch,sum,l,r,pf,lf; }tree[MAXN << 3]; ll a[MAXN],n,m; ll ksm(ll a,ll b){ ll ans = 1; while(b){ if(b & 1) ans = (ans * a) % mod; b >>= 1,a = (a * a) % mod; } return ans % mod; } void up(ll now){ tree[now].sum = (tree[now << 1].sum + tree[now << 1 | 1].sum) % mod; tree[now].pf = (tree[now << 1].pf + tree[now << 1 | 1].pf) % mod; tree[now].lf = (tree[now << 1].lf + tree[now << 1 | 1].lf) % mod; return; } void build(ll now,ll l,ll r){ ll mid = (l + r) >> 1; tree[now].ch = 1,tree[now].l = l,tree[now].r = r; if(l == r){ tree[now].sum = a[l] % mod; tree[now].pf = (a[l] * a[l]) % mod; tree[now].lf = (a[l] * a[l] * a[l]) % mod; return; } build(now << 1,l,mid); build(now << 1 | 1,mid + 1,r); up(now); return; } void pushdown(ll now){ ll jia = tree[now].jia; ll chang1 = tree[now << 1].r - tree[now << 1].l + 1; ll chang2 = tree[now << 1 | 1].r - tree[now << 1 | 1].l + 1; tree[now << 1].lf = (tree[now << 1].lf * ksm(tree[now].ch,3) ) % mod; tree[now << 1].pf = (tree[now << 1].pf * ksm(tree[now].ch,2) ) % mod; tree[now << 1].sum = (tree[now << 1].sum * tree[now].ch) % mod; tree[now << 1 | 1].lf = (tree[now << 1 | 1].lf * ksm(tree[now].ch,3)) % mod; tree[now << 1 | 1].pf = (tree[now << 1 | 1].pf * ksm(tree[now].ch,2)) % mod; tree[now << 1 | 1].sum = (tree[now << 1 | 1].sum * tree[now].ch) % mod; tree[now << 1].ch = (tree[now << 1].ch * tree[now].ch) % mod; tree[now << 1 | 1].ch = (tree[now << 1 | 1].ch * tree[now].ch) % mod; tree[now << 1].jia = (tree[now << 1].jia * tree[now].ch) % mod; tree[now << 1 | 1].jia = (tree[now << 1 | 1].jia * tree[now].ch) % mod; tree[now].ch = 1; tree[now << 1].lf = (tree[now << 1].lf + chang1 * ksm(jia,3) + (3 * jia * tree[now << 1].pf) % mod + 3 * ksm(jia,2) * tree[now << 1].sum) % mod; tree[now << 1 | 1].lf = (tree[now << 1 | 1].lf + chang2 * ksm(jia,3) + 3 * jia * tree[now << 1 | 1].pf + 3 * ksm(jia,2) * tree[now << 1 | 1].sum) % mod; tree[now << 1].pf = (tree[now << 1].pf + chang1 * ksm(jia,2) + 2 * jia * tree[now << 1].sum) % mod; tree[now << 1 | 1].pf = (tree[now << 1 | 1].pf + chang2 * ksm(jia,2) + 2 * jia * tree[now << 1 | 1].sum) % mod; tree[now << 1].sum = (tree[now << 1].sum + chang1 * jia) % mod; tree[now << 1| 1].sum = (tree[now << 1 | 1].sum + chang2 * jia) % mod; tree[now << 1].jia = (tree[now << 1].jia + jia) % mod; tree[now << 1 | 1].jia = (tree[now << 1 | 1].jia + jia) % mod; tree[now].jia = 0; return; } void change_jia(ll now,ll l,ll r,ll v){ if(tree[now].l >= l && tree[now].r <= r){ ll chang = tree[now].r - tree[now].l + 1; tree[now].jia = (tree[now].jia + v) % mod; tree[now].lf = (tree[now].lf + chang * ksm(v,3) + 3 * v * tree[now].pf + 3 * ksm(v,2) * tree[now].sum) % mod; tree[now].pf = (tree[now].pf + chang * ksm(v,2) + 2 * tree[now].sum * v) % mod; tree[now].sum = (tree[now].sum + chang * v) % mod; return; } pushdown(now); ll mid = (tree[now].r + tree[now].l) >> 1; if(l <= mid) change_jia(now << 1,l,r,v); if(r >= mid + 1) change_jia(now << 1 | 1,l,r,v); up(now); return; } void change_ch(ll now,ll l,ll r,ll v){ if(tree[now].l >= l && tree[now].r <= r){ ll chang = tree[now].r - tree[now].l + 1; tree[now].lf = (tree[now].lf * ksm(v,3)) % mod; tree[now].pf = (tree[now].pf * ksm(v,2)) % mod; tree[now].sum = (tree[now].sum * v) % mod; tree[now].jia = (tree[now].jia * v) % mod; tree[now].ch = (tree[now].ch * v) % mod; return; } pushdown(now); ll mid = (tree[now].r + tree[now].l) >> 1; if(l <= mid) change_ch(now << 1,l,r,v); if(r >= mid + 1) change_ch(now << 1 | 1,l,r,v); up(now); return; } ll query(ll now,ll l,ll r){ if(tree[now].l >= l && tree[now].r <= r) return tree[now].lf % mod; ll ans = 0,mid = (tree[now].r + tree[now].l) >> 1; pushdown(now); if(l <= mid) ans = (ans + query(now << 1,l,r)) % mod; if(r >= mid + 1) ans = (ans + query(now << 1 | 1,l,r)) % mod; return ans % mod; } void solve(){ ll f,l,r,v; scanf("%lld%lld",&n,&m); for(ll i = 1;i <= n;i ++) scanf("%lld",&a[i]),a[i] %= mod; build(1,1,n); for(ll i = 1;i <= m;i ++){ scanf("%lld%lld%lld",&f,&l,&r); if(f == 1){ scanf("%lld",&v); change_jia(1,l,r,v); } else if(f == 2){ scanf("%lld",&v); if(v != 1) change_ch(1,l,r,v); } else printf("%lld\n",query(1,l,r) % mod); } return; } int main(){ solve(); return 0; }
C:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; char s[10001]; int d[44][44]; int n,ans,T,tot; void dfs(int x,int y,int len){ if(s[tot] == 'p'){ tot ++; dfs(x,y + len / 2,len / 2); dfs(x,y,len / 2); dfs(x + len / 2,y,len / 2); dfs(x + len / 2,y + len / 2,len / 2); return; } else if(s[tot] == 'f'){ tot ++; for(int i = x;i < x + len;i ++) for(int j = y;j < y + len;j ++) if(!d[i][j]) d[i][j] = 1,ans ++; } else if(s[tot] == 'e') tot ++; return; } void solve(){ ans = 0; memset(d,0,sizeof(d)); for(int i = 1;i <= 2;i ++){ tot = 0; scanf("%s",s); dfs(0,0,32); } printf("There are %d black pixels.\n",ans); return; } int main(){ cin >> T; while(T --) solve(); return 0; }
L:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int MAXN = 2000 + 155; int n,m,top,l,r; int ma[MAXN][MAXN]; int h[MAXN],S[MAXN],R[MAXN],L[MAXN]; void solve(){ long long ans = 0; scanf("%d%d",&n,&m); for(int i = 1;i <= n;i ++) for(int j = 1;j <= m;j ++) scanf("%d",&ma[i][j]); for(int i = 1;i <= n;i ++){ for(int j = 1;j <= m;j ++){ if(ma[i][j] == ma[i - 1][j]) h[j] ++; else h[j] = 1; R[j] = L[j] = 0; } top = 0,l = 1; for(int j = 1;j <= m;j ++){ bool flag = 0; while(top && ma[i][j] != ma[i][j - 1]) top --,flag = 1; while(top && h[S[top]] >= h[j]) top --; if(flag) l = j; if(!top) L[j] = l; else L[j] = S[top] + 1; S[++ top] = j; } r = m,top = 0; for(int j = m;j >= 1;j --){ bool flag = 0; while(top && ma[i][j] != ma[i][j + 1]) top --,flag = 1; while(top && h[S[top]] >= h[j]) top --; if(flag) r = j; if(!top) R[j] = r; else R[j] = S[top] - 1; S[++ top] = j; } for(int j = 1;j <= m;j ++) ans = max(ans,1LL * (R[j] - L[j] + 1) * h[j] * ma[i][j]); } cout << ans << endl; return; } int main(){ solve(); return 0; }

浙公网安备 33010602011771号