校队选拔


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;
} 

 

posted @ 2019-12-11 19:30  cgold  阅读(116)  评论(0)    收藏  举报