还没改完题,先留个坑。
放一下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; }
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; }