2019.8.5 NOIP模拟测试12 反思总结

还没改完题,先留个坑。

放一下AC了的代码,其他东西之后说…

T1:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,k,x,y;
const int mod=1000000007;
long long h[1000010],l[1000010],tag1[1000010],tag2[1000010],sum1,sum2,sum;
char c[5];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    while(k--){
        scanf("%s%d%d",c,&x,&y);
        if(c[0]=='R'){
            if(!tag1[x]){
                tag1[x]=1;
                h[x]=1;
            }
            h[x]=h[x]*y%mod;
        }
        else{
            if(!tag2[x]){
                tag2[x]=1;
                l[x]=1;
            }
            l[x]=l[x]*y%mod;
        }
    }
    for(int i=1;i<=m;i++)sum1=(sum1+i*(tag2[i]==0?1:l[i])%mod)%mod,sum2=(sum2+(tag2[i]==0?1:l[i]))%mod;//sj*j
    for(int i=1;i<=n;i++){
        sum=(sum+(tag1[i]==0?1:h[i])*sum1%mod+(tag1[i]==0?1:h[i])*m%mod*(i-1)%mod*sum2%mod)%mod;
    }
    printf("%lld",sum%mod);
    return 0;
}
View Code

T2:

还没改

T3:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int n,a[402010],m,pos[402010],N,dfn[402010],low[402010];
int stack[402010],st,tim,cnt,c[402010],vis[402010],vis1[402010];
vector<int>s1[402010],s2[402010];
struct node{
    int l,r;
}t1[402010],t2[402010];
node work(node x,node y){
    node e;
    if(x.l>0&&y.l>0)e.l=min(x.l,y.l);
    else if(x.l>0)e.l=x.l;
    else e.l=y.l;
    e.r=max(x.r,y.r);
    return e;
}
struct tree{
    node t[402010];
    void change(int p,int x,node y,int l,int r){
        if(l==r){
            t[p]=y;
            return;
        }
        int mid=(l+r)/2;
        if(x<=mid){
            change(p*2,x,y,l,mid);
        }
        else{
            change(p*2+1,x,y,mid+1,r);
        }
        t[p]=work(t[p*2],t[p*2+1]);
    }
    node query(int p,int l,int r,int L,int R){
        if(l<=L&&R<=r){
            return t[p];
        }
        int mid=(L+R)/2;
        if(l<=mid&&r>mid){
            node e;
            e=work(query(p*2+1,l,r,mid+1,R),query(p*2,l,r,L,mid));
            return e;
        }
        else if(l<=mid)return query(p*2,l,r,L,mid);
        else if(r>mid)return query(p*2+1,l,r,mid+1,R);
    }
}seg[2];
void build(int p,int l,int r){
    if(l==r){
        pos[l]=p;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    s1[p].push_back(p*2);
    s1[p].push_back(p*2+1);
}
void addedge(int p,int l,int r,int L,int R,int nod){
    if(l<=L&&R<=r){
        s1[nod].push_back(p);
        return;
    }
    int mid=(L+R)/2;
    if(l<=mid)addedge(p*2,l,r,L,mid,nod);
    if(r>mid)addedge(p*2+1,l,r,mid+1,R,nod);
}
void tarjan(int x){
    dfn[x]=low[x]=++tim;
    stack[++st]=x;
    vis1[x]=1;
    for(int i=0;i<s1[x].size();i++){
        int y=s1[x][i];
        if(!dfn[y]){
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(vis1[y])low[x]=min(low[x],dfn[y]);
    }
    if(low[x]==dfn[x]){
        int p;
        cnt++;
        do{
            p=stack[st--];
            vis1[p]=0;
            c[p]=cnt;
        }while(p!=x);
    }
}
void dfs(int x){
    if(vis[x])return;
    vis[x]=1;
    for(int i=0;i<s2[x].size();i++){
        int y=s2[x][i];
        dfs(y);
        t2[x]=work(t2[x],t2[y]);
    }
}
int main()
{
    scanf("%d",&n);
    N=4*n+1000;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=n;i++){
        node y;
        y.l=i,y.r=i;
        seg[0].change(1,a[i],y,1,n);
    }
    for(int i=2;i<=n;i++){
        int x=min(a[i-1],a[i]),y=max(a[i-1],a[i]);
        t1[pos[i]]=seg[0].query(1,x,y,1,n);
        addedge(1,t1[pos[i]].l+1,t1[pos[i]].r,1,n,pos[i]);
    }
    for(int i=1;i<N;i++){
        if(!dfn[i])tarjan(i);
    }
    for(int i=1;i<N;i++){
        for(int j=0;j<s1[i].size();j++){
            int y=s1[i][j];
            if(c[i]!=c[y]){
                s2[c[i]].push_back(c[y]);
            }
        }
    }
    for(int i=1;i<N;i++){
        t2[c[i]]=work(t2[c[i]],t1[i]);
    }
    for(int i=1;i<=cnt;i++)dfs(i);
    for(int i=2;i<=n;i++){
        seg[1].change(1,i,t2[c[pos[i]]],1,n);
    }
    scanf("%d",&m);
    while(m--){
        int x,y;
        scanf("%d%d",&x,&y);
        if(x==y){
            printf("%d %d\n",x,y);
            continue;
        }
        node ans=seg[1].query(1,x+1,y,1,n);
        printf("%d %d\n",ans.l,ans.r);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/chloris/p/11304955.html