代码:
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int n;
int A[M];
bool Check(int now,int x) {
int j=0;
while(now+j<=n&&A[now+j]>=x)++j;
return (j+1)&1;
}
int main() {
n=rd();
for(int i=1; i<=n; ++i)A[i]=rd();
sort(A+1,A+n+1,greater<int>());
for(int i=1; i<=n+1; ++i)
if(A[i]<i) {
int x=i-1;
if(((A[x]-x-1)&1)&&Check(i,x))puts("Second");
else puts("First");
exit(0);
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=5005;
int n,Move_R,Move_L;
int A[M];
LL dp[M];
int main(){
memset(dp,63,sizeof dp);
n=rd(),Move_R=rd(),Move_L=rd();
for(int i=1; i<=n; ++i)A[i]=rd();
dp[0]=0;A[n+1]=n+1;
for(int i=1; i<=n+1; ++i) {
int l=0,r=0;
for(int j=i-1; ~j; --j) {
if(A[i]>A[j])Min(dp[i],dp[j]+1LL*l*Move_L+1LL*r*Move_R);
if(A[j]>A[i])r++;
if(A[j]<A[i])l++;
}
}printf("%lld",dp[n+1]);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
bool f1;
const int M=505;
int n,P;
int vis[M];
int prime[]= {2,3,5,7,11,13,17,19};
vector<int>Q[M];
void add(int u,int v) {
Q[u].push_back(v);
}
void Pre() {
for(int i=2; i<=n; ++i) {
int x=i;
for(int j=0; j<8; ++j) {
if(x%prime[j])continue;
while(x%prime[j]==0)x/=prime[j];
vis[i]|=1<<j;
}
add(x,i);
}
}
int dp[305][1<<8][1<<8];
int tmp[25][1<<8][1<<8];
int cnt;
void Add(int &x,int y) {
x+=y;(x>=P)&&(x-=P);
}
bool f2;
int main(){
n=rd(),P=rd();Pre();dp[0][0][0]=1;
for(int i=1; i<=n; ++i) {
if(i==1) {
for(int x=0; x<Q[i].size(); ++x) {
int To=Q[i][x];++cnt;
for(int j=0; j<256; ++j)
for(int k=0; k<256; ++k) {
if(!dp[cnt-1][j][k])continue;
Add(dp[cnt][j|vis[To]][k],dp[cnt-1][j][k]);
Add(dp[cnt][j][k|vis[To]],dp[cnt-1][j][k]);
Add(dp[cnt][j][k],dp[cnt-1][j][k]);
}
}
}else {
if(!Q[i].size())continue;
int now=0;
memcpy(tmp[0],dp[cnt],sizeof dp[cnt]);
for(int x=0; x<Q[i].size(); ++x) {
int To=Q[i][x];++now;
memset(tmp[now],0,sizeof tmp[now]);
for(int j=0; j<256; ++j)
for(int k=0; k<256; ++k) {
Add(tmp[now][j|vis[To]][k],tmp[now-1][j][k]);
Add(tmp[now][j][k],tmp[now-1][j][k]);
}
}
for(int j=0; j<256; ++j)
for(int k=0; k<256; ++k) {
Add(dp[cnt+1][j][k],tmp[now][j][k]);
tmp[0][j][k]=dp[cnt][j][k];
}
now=0;
for(int x=0; x<Q[i].size(); ++x) {
int To=Q[i][x];++now;
memset(tmp[now],0,sizeof tmp[now]);
for(int j=0; j<256; ++j)
for(int k=0; k<256; ++k) {
Add(tmp[now][j][k|vis[To]],tmp[now-1][j][k]);
Add(tmp[now][j][k],tmp[now-1][j][k]);
}
}
for(int j=0; j<256; ++j)
for(int k=0; k<256; ++k) {
Add(dp[cnt+1][j][k],tmp[now][j][k]);
Add(dp[cnt+1][j][k],P-dp[cnt][j][k]);
}
++cnt;
}
}
int Ans=0;
for(int i=0; i<256; ++i)
for(int j=0; j<256; ++j)
if(!(i&j)&&dp[cnt][i][j])Add(Ans,dp[cnt][i][j]);
printf("%d",Ans);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
const LL inf=1e15;
int n,cnt;
int prime[M];
bool vis[M];
LL A[505][505];
LL gcd(LL a,LL b) {
return !b?a:gcd(b,a%b);
}
LL lcm(LL a,LL b) {
return a/gcd(a,b)*b;
}
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int main(){
n=rd();
if(n==2) {return printf("4 7\n23 10"),0;}
for(int i=2; cnt<=n+n; ++i) {
if(!vis[i])prime[++cnt]=i;
for(int j=1; j<=cnt&&prime[j]*i<M; ++j) {
vis[prime[j]*i]=true;
if(i%prime[j]==0)break;
}
}
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if((i+j-1)&1)A[i][j]=prime[(i+j)/2]*prime[(j-i+n-1)/2+n+1];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j) {
if(A[i][j])continue;
A[i][j]=1;
for(int d=0; d<4; ++d) {
int sx=i+dx[d],sy=j+dy[d];
if(sx<1||sx>n||sy<1||sy>n)continue;
A[i][j]=lcm(A[i][j],A[sx][sy]);
}A[i][j]++;
}
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j)
printf("%lld ",A[i][j]);
cout<<"\n";
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
int main(){
n=rd(),k=rd();
printf("%d\n",(n*6-1)*k);
for(int i=0; i<n; ++i) {
int now=i*6*k+k;
printf("%d %d %d %d\n",now,now+k,now+k+k,now+k*4);
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e4+5;
int T,n,m;
vector<int>Q[M];
int in[M];
struct info {
int idx;
bool operator <(const info &_)const {
return in[idx]>in[_.idx];
}
};
priority_queue<info>tp;
int stk_1[M],top_1,L;
int stk_2[M],top_2,Mx;
bool vis[M];
void Clear(int now) {
vis[now]=true;
for(int i=0; i<Q[now].size(); ++i)--in[Q[now][i]];
}
void Solve() {
for(int i=1; i<=n; ++i)in[i]=vis[i]=0;
for(int i=1; i<=n; ++i)Q[i].clear();
for(int i=1; i<=m; ++i) {
int u=rd(),v=rd();
Q[u].push_back(v);in[v]++;
Q[v].push_back(u);in[u]++;
}top_1=top_2=Mx=0;
for(int i=1; i<=n; ++i)tp.push((info)<%i%>);
while(!tp.empty()) {
int a=tp.top().idx;tp.pop();
stk_1[++top_1]=a;
if(vis[a])continue;
if(Mx<in[a])Mx=in[a],L=top_1;
stk_2[++top_2]=a;
for(int i=0; i<Q[a].size(); ++i) {
int To=Q[a][i];in[To]=0;
if(!vis[To])Clear(To);
}
}printf("%d ",top_1-L+1);
for(int i=L; i<=top_1; ++i)printf("%d ",stk_1[i]);
printf("\n%d ",top_2);
for(int i=1; i<=top_2; ++i)printf("%d ",stk_2[i]);
printf("\n");
}
int main(){
T=rd();
while(T--) {
n=rd(),m=rd();
Solve();
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int P=998244353;
const int Mx=3e5;
LL fpow(LL a,int cnt) {
LL res=1;
for(;cnt;cnt>>=1,a=a*a%P)if(cnt&1)res=res*a%P;
return res;
}
int n;
int a[Mx];
LL f[Mx+5];
LL A;
int main(){
n=rd();
for(int i=1; i<=n; ++i)a[i]=rd(),A+=a[i];
f[0]=f[1]=0;
for(int i=1; i<Mx; ++i) {
f[i+1]=((A*(n-1)-(A-i)*(n-2))%P*f[i]-f[i-1]*i%P*(n-1)+1LL*i*(n-1))%P*fpow(A-i,P-2)%P;
if(f[i+1]<0)f[i+1]+=P;
}
LL Ans=f[A];
for(int i=1; i<=n; ++i)Ans-=f[a[i]];
Ans%=P;Ans+=P;Ans%=P;
printf("%lld",Ans);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int n;
int X[M],Y[M];
int lstX[M],lstY[M];
int col[M];
vector<int>Q[M];
void add(int u,int v) {
Q[u].push_back(v);
Q[v].push_back(u);
}
void dfs(int now) {
for(int i=0; i<Q[now].size(); ++i) {
int To=Q[now][i];
if(~col[To])continue;
col[To]=col[now]^1;
dfs(To);
}
}
int main() {
n=rd();
memset(col,-1,sizeof col);
for(int i=1; i<=n; ++i) {
X[i]=rd(),Y[i]=rd();
if(lstX[X[i]])add(lstX[X[i]],i),lstX[X[i]]=0;
else lstX[X[i]]=i;
if(lstY[Y[i]])add(lstY[Y[i]],i),lstY[Y[i]]=0;
else lstY[Y[i]]=i;
}
for(int i=1; i<=n; ++i)
if(col[i]==-1)col[i]=1,dfs(i);
for(int i=1; i<=n; ++i)printf("%c",col[i]?'r':'b');
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=5e5+5;
int n,q;
char S[M];
int Ed[M],tot;
int Trie[26][M],fa[M];
string s[M];
int Ins(int Len) {
int now=0;
for(int i=1; i<=Len; ++i) {
int nxt=S[i]-'a';
if(!Trie[nxt][now])fa[Trie[nxt][now]=++tot]=now;
now=Trie[nxt][now];
}return now;
}
int fail[M];
int que[M],Lx=1,Rx;
void build() {
for(int i=0; i<26; ++i)
if(Trie[i][0])que[++Rx]=Trie[i][0];
while(Lx<=Rx) {
int now=que[Lx++];
for(int i=0; i<26; ++i)
if(Trie[i][now]) {
fail[Trie[i][now]]=Trie[i][fail[now]];
que[++Rx]=Trie[i][now];
}else Trie[i][now]=Trie[i][fail[now]];
}
}
int Tot;
int hd[M],to[M],nx[M];
void add(int u,int v) {
nx[++Tot]=hd[u];
to[Tot]=v;
hd[u]=Tot;
}
int L[M],R[M],dfn_tot;
void dfs(int now) {
L[now]=++dfn_tot;
for(int i=hd[now]; i; i=nx[i]) {
int To=to[i];
dfs(To);
}R[now]=dfn_tot;
}
void Pre() {
for(int i=1; i<=tot; ++i)add(fail[i],i);
dfs(0);
}
struct info {
int idx,k,op;
};
vector<info>Q[M];
LL ans[M];
struct Seg{
int Tree[M];
void add(int x,int y) {
for(int i=x; i<=dfn_tot; i+=i&-i)Tree[i]+=y;
}
LL Query(int x) {
LL res=0;
for(int i=x; i; i-=i&-i)res+=Tree[i];
return res;
}
}BIT;
int main(){
n=rd(),q=rd();
for(int i=1; i<=n; ++i) {
scanf("%s",S+1);
int len;
Ed[i]=Ins(len=strlen(S+1));
for(int j=1; j<=len; ++j)s[i]+=S[j];
}build();Pre();
for(int i=1; i<=q; ++i) {
int l=rd(),r=rd(),k=rd();
Q[r].push_back((info)<%i,k,1%>);
Q[l-1].push_back((info)<%i,k,-1%>);
}
for(int i=1; i<=n; ++i) {
int now=0;
for(int j=0; j<s[i].size(); ++j) {
int p=s[i][j]-'a';
now=Trie[p][now];
BIT.add(L[now],1);
}
for(int j=0; j<Q[i].size(); ++j) {
int k=Q[i][j].k;
ans[Q[i][j].idx]+=Q[i][j].op*(BIT.Query(R[Ed[k]])-BIT.Query(L[Ed[k]]-1));
}
}
for(int i=1; i<=q; ++i)printf("%lld\n",ans[i]);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=5e5+5;
vector<int>Q[M];
int n,m,k;
bool flag[M];
bool vis[M];
void dfs(int now,int dep) {
flag[now]=true;
if(~dep)vis[now]=true;
if(dep<0)return;
for(int i=0; i<Q[now].size(); ++i) {
int To=Q[now][i];
if(vis[To])continue;
dfs(To,dep-1);
}
}
int stk[M];
int main(){
n=rd(),m=rd(),k=rd();
for(int i=1; i<=m; ++i) {
int u=rd(),v=rd();
Q[u].push_back(v);
Q[v].push_back(u);
}
int top=0;
for(int i=1; i<=n; ++i)
if(!flag[i])dfs(i,1),stk[++top]=i;
cout<<top<<endl;
for(int i=1; i<=top; ++i)printf("%d ",stk[i]);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=55;
int n,a,b;
char S[M][M];
int mx[M][M],mi[M][M];
int main(){
n=rd(),a=rd(),b=rd();
for(int i=1; i<=n; ++i) {
scanf("%s",S[i]+1);
for(int j=1; j<=n; ++j) {
if(S[i][j]=='='||i==j)mx[i][j]=mi[i][j]=0;
else if(S[i][j]=='+')mx[i][j]=2,mi[i][j]=1;
else if(S[i][j]=='-')mx[i][j]=-1,mi[i][j]=-2;
else mx[i][j]=2,mi[i][j]=-2;
}
}
for(int k=1; k<=n; ++k)
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j) {
Min(mx[i][j],mx[i][k]+mx[k][j]);
Max(mi[i][j],mi[i][k]+mi[k][j]);
}
int c1=0,c2=0,c3=0;
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j) {
if(i==a||i==b||j==a||j==b)continue;
if((mx[i][a]<mi[b][j])||(mx[i][b]<mi[a][j]))c1++;
if((mx[a][i]<mi[j][b])||(mx[b][i]<mi[j][a]))c3++;
if((mx[i][a]==mi[i][a]&&mx[b][j]==mi[b][j]&&mx[i][a]==mx[b][j])||
(mx[i][b]==mi[i][b]&&mx[a][j]==mi[a][j]&&mx[i][b]==mx[a][j]))c2++;
}
printf("%d %d %d\n",c1,c2,c3);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
const int M=1e5+5;
const int inf=1e9;
map<int,int>Mp[M];
vector<int>Q[2][M];
int n;
int A[2][M];
struct node {
int l,r,x;
};
queue<node>Limit[2];
int Ans_x[M],Ans_y[M],cnt;
void add(int u,int v) {
Ans_x[++cnt]=u;
Ans_y[cnt]=v;
}
int Del(int now,int op) {//删除now这个点
int Sz=Q[op][A[op][now]].size();
int x=0;
for(int i=0; i<Sz; ++i)
if(Q[op][A[op][now]][i]!=now)x=Q[op][A[op][now]][i];
Q[op][A[op][now]].resize(0);
if(x) {Q[op][A[op][now]].push_back(x);return x;}
return -1;
}
int tot;
bool Mk[M<<1];
bool vis[M<<1];
void find_path(int now,int op) {//op:0 连的是横线 1 连的是竖线
if(Q[op^1][A[op^1][now]].size()==1) {puts("NE");exit(0);}//若这个点找不到与它匹配的点
Del(now,0);Del(now,1);
int Match=Q[op^1][A[op^1][now]][0];//与now这个点相匹配的点
Del(Match,op^1);
Limit[op].push((node)<%min(A[op][now],A[op][Match]),max(A[op][now],A[op][Match]),A[op^1][now]%>);//多了一条限制的线
add(now,Match);Mk[Mp[now][Match]]=true;
int nxt=Del(Match,op);
if(nxt==-1)return;
vis[Mp[Match][nxt]]=true;
find_path(nxt,op);
}
struct Seg {
struct info {
int x,y,idx,pos;
bool operator <(const info &_)const {
if(pos^_.pos)return pos<_.pos;
return x<_.x;
}
}Tmp;
multiset<info>S[M<<2];
multiset<info>:: iterator it,it2,it3;
void Insert(int p,int l,int r,int lx,int rx,int numx,int numy,int idx,int pos) {
if(l==lx&&r==rx) {
S[p].insert((info)<%numx,numy,idx,pos%>);
return;
}
int mid=l+r>>1;
if(rx<=mid)Insert(ls,l,mid,lx,rx,numx,numy,idx,pos);
else if(lx>mid)Insert(rs,mid+1,r,lx,rx,numx,numy,idx,pos);
else Insert(ls,l,mid,lx,mid,numx,numy,idx,pos),Insert(rs,mid+1,r,mid+1,rx,numx,numy,idx,pos);
}
void Erase(int p,int l,int r,int pos,int x,int y,int op) {
it=S[p].lower_bound((info)<%-1,-1,-1,x%>);
it2=S[p].upper_bound((info)<%inf,inf,inf,y%>);
while(it!=it2) {
Tmp=*it;
if(!vis[Tmp.idx]) {
if(Mk[Tmp.idx]){puts("NE");exit(0);}
Del(Tmp.x,op);Del(Tmp.y,op);
find_path(Tmp.x,op);
vis[Tmp.idx]=true;
}
it3=it;++it3;
S[p].erase(it);
it=it3;
}
if(l==r)return;
int mid=l+r>>1;
if(pos<=mid)Erase(ls,l,mid,pos,x,y,op);
else Erase(rs,mid+1,r,pos,x,y,op);
}
}Tree[2];
void Solve() {//现在需要处理被限制的环
while(!Limit[0].empty()||!Limit[1].empty()) {
int op=Limit[0].empty();
node x=Limit[op].front();Limit[op].pop();
Tree[op].Erase(1,1,M-5,x.x,x.l,x.r,op);
}
}
int main(){
n=rd();
for(int i=1; i<=n; ++i) {
int x=rd(),y=rd();
Q[0][x].push_back(i);A[0][i]=x;
Q[1][y].push_back(i);A[1][i]=y;
}
for(int i=0; i<M; ++i)
for(int k=0; k<2; ++k)
if(Q[k][i].size()==2) {
Tree[k].Insert(1,1,M-5,min(A[k^1][Q[k][i][0]],A[k^1][Q[k][i][1]]),
max(A[k^1][Q[k][i][0]],A[k^1][Q[k][i][1]]),Q[k][i][0],Q[k][i][1],++tot,i);
Mp[Q[k][i][0]][Q[k][i][1]]=tot;
Mp[Q[k][i][1]][Q[k][i][0]]=tot;
}
for(int i=0; i<M; ++i)//将独立点都删除.
for(int k=0; k<2; ++k)
if(Q[k][i].size()==1)find_path(Q[k][i][0],k);
Solve();
for(int i=0; i<M; ++i)//如果没有限制的边,可以都连竖着或横着
if(Q[0][i].size()==2)add(Q[0][i][0],Q[0][i][1]);
puts("DA");
for(int i=1; i<=cnt; ++i)printf("%d %d\n",Ans_x[i],Ans_y[i]);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5;
int n,m;
int A[M];
int main(){
n=rd(),m=rd();--n;
int nn=n;
while(~n) {
int lst=m;
while((m&n)!=n)++m;
for(int i=m; i>=lst; --i)A[n--]=i;++m;
}for(int i=0; i<=nn; ++i)printf("%d %d\n",i,A[i]);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
const int M=2e5+5;
int Mx[M<<2];
int lazy[M<<2];
void build(int p,int l,int r) {
if(l==r) {
Mx[p]=-l;
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
Mx[p]=max(Mx[ls],Mx[rs]);
}
void Down(int p) {
if(!lazy[p])return;
int &pp=lazy[p];
lazy[ls]+=pp,lazy[rs]+=pp;
Mx[ls]+=pp,Mx[rs]+=pp;
pp=0;
}
void Update(int p,int l,int r,int lx,int rx,int val) {
if(l==lx&&r==rx) {
lazy[p]+=val;
Mx[p]+=val;
return;
}Down(p);
int mid=l+r>>1;
if(rx<=mid)Update(ls,l,mid,lx,rx,val);
else if(lx>mid)Update(rs,mid+1,r,lx,rx,val);
else Update(ls,l,mid,lx,mid,val),Update(rs,mid+1,r,mid+1,rx,val);
Mx[p]=max(Mx[ls],Mx[rs]);
}
int Query(int p,int l,int r) {
if(l==r)return l;
int mid=l+r>>1;
Down(p);
if(Mx[ls]==0)return Query(ls,l,mid);
return Query(rs,mid+1,r);
}
int MAX(int a,int b,int c) {return a>b?max(a,c):max(b,c);}
int Mxans;
int n,q;
int A[4][M],pos[4][M];
int main() {
n=rd(),q=rd();
for(int k=1; k<=3; ++k)for(int i=1; i<=n; ++i)A[k][i]=rd(),pos[k][A[k][i]]=i;
build(1,1,n);
for(int i=1; i<=n; ++i)Update(1,1,n,MAX(pos[3][i],pos[1][i],pos[2][i]),n,1);
Mxans=Query(1,1,n);
while(q--) {
int opt=rd();
if(opt==1) {
int x=rd();
if(pos[1][x]<=Mxans)puts("DA");
else puts("NE");
}else {
int k=rd(),x=rd(),y=rd();
Update(1,1,n,MAX(pos[3][x],pos[1][x],pos[2][x]),n,-1);
Update(1,1,n,MAX(pos[3][y],pos[1][y],pos[2][y]),n,-1);
swap(pos[k][x],pos[k][y]);
Update(1,1,n,MAX(pos[3][x],pos[1][x],pos[2][x]),n,1);
Update(1,1,n,MAX(pos[3][y],pos[1][y],pos[2][y]),n,1);
Mxans=Query(1,1,n);
}
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=3005;
int id;
int n;
int A[M][M];
namespace P100 {
int fa[M],tmp[M];
int find(int g) {return fa[g]==g?fa[g]:fa[g]=find(fa[g]);}
int X[M],Y[M],ans;
void add(int u,int v) {X[++ans]=u,Y[ans]=v;}
vector<int>Q[M];
void Merge(int x,int y,int opt) {
int sx=find(x),sy=find(y);
if(sx==sy)return;
fa[sx]=sy;
if(~opt) {
add(x,y);
Q[y].push_back(x);
Q[x].push_back(y);
}
}
int stk[M],top;
bool Check(int now,int Fa) {
return A[now][stk[1]]==A[now][stk[2]]&&A[stk[1]][now]==A[stk[1]][Fa]
&&A[now][stk[1]]==A[Fa][stk[2]]+1;
}
void dfs(int now,int Fa) {
if(top>=2&&Check(now,Fa))Merge(now,stk[1],-1);
// if(now==3&&stk[1]==1)cout<<now<<" "<<stk[2]<<" "<<Check(now,Fa)<<endl;
stk[++top]=now;
for(int i=0; i<Q[now].size(); ++i) {
int To=Q[now][i];
if(To!=Fa)dfs(To,now);
}--top;
}
void Solve() {
for(int i=1; i<=n; ++i)fa[i]=i;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if(A[i][j]==1)Merge(i,j,0);
memcpy(tmp,fa,sizeof tmp);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if(A[i][j]==2)Merge(i,j,0);
memcpy(fa,tmp,sizeof fa);
for(int i=1; i<=n; ++i)dfs(i,0);
for(int i=1; i<=n; ++i)printf("%d ",find(i));cout<<endl;
for(int i=1; i<=ans; ++ i)
printf("%d %d\n",X[i],Y[i]);
}
}
int main(){
id=rd();n=rd();
for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)A[i][j]=rd();
P100::Solve();
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
const int P=1e9+7;
int A[M];
int n;
void add(int &x,int y) {
x+=y;(x>=P)&&(x-=P);
}
struct node {
int Mx,sum;
void Get(node y) {
if(y.Mx>Mx)Mx=y.Mx,sum=y.sum;
else if(y.Mx==Mx)add(sum,y.sum);
}
}res,ans;
struct SEG {
node Tree[M];
void add(int x,node y) {
for(int i=x; i<=n; i+=i&-i)Tree[i].Get(y);
}
node Query(int x) {
res=(node)<%0,0%>;
for(int i=x; i; i-=i&-i)res.Get(Tree[i]);
return res;
}
}BIT[2];
int B[M];
int main(){
n=rd();
for(int i=1; i<=n; ++i)A[i]=rd(),B[i]=A[i];
sort(B+1,B+n+1);int cnt=unique(B+1,B+n+1)-B-1;
for(int i=n; i; --i) {
A[i]=lower_bound(B+1,B+cnt+1,A[i])-B;
node x=BIT[0].Query(A[i]-1),y=BIT[1].Query(cnt-A[i]);
x.Mx++,y.Mx++;
if(x.Mx==1)x.sum=1;
if(y.Mx==1)y.sum=1;
BIT[0].add(A[i],x);BIT[1].add(cnt-A[i]+1,y);
if(x.Mx+y.Mx-1>ans.Mx)ans.Mx=x.Mx+y.Mx-1,ans.sum=1LL*x.sum*y.sum%P;
else if(x.Mx+y.Mx-1==ans.Mx)ans.sum=(ans.sum+1LL*x.sum*y.sum)%P;
}
for(int i=ans.Mx; i<n; ++i)ans.sum=(ans.sum+ans.sum)%P;
printf("%d %d",ans.Mx,ans.sum);
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e3+5;
int n,m;
int A[M][M],B[M][M];
int x[M*M],y[M*M];
int full[M];
int Tot;
int hd[M],to[M*M*2],nx[M*M*2];
void add(int u,int v) {
nx[++Tot]=hd[u];
to[Tot]=v;hd[u]=Tot;
}
int Hv[M];
int stk[M];
bool all_full=true,all_hv;
bool vis[M];
int ans,xxx,done;
void dfs(int now) {
if(vis[now])return;
vis[now]=true;xxx&=full[now];done|=Hv[now];
for(int i=hd[now]; i; i=nx[i])dfs(to[i]);
}
void Solve() {
for(int i=1; i<=n; ++i) {
if(vis[i])continue;
done=false;xxx=true;dfs(i);
if(done&&xxx)++ans;//说明有一本书应该先拿到别的地方
}printf("%d",ans);
}
int main() {
n=rd(),m=rd();
for(int i=1; i<=n; ++i)for(int j=1; j<=m; ++j)A[i][j]=rd();
for(int i=1; i<=n; ++i)for(int j=1; j<=m; ++j)B[i][j]=rd(),x[B[i][j]]=i,y[B[i][j]]=j;
for(int i=1; i<=n; ++i) {
full[i]=true;int cnt=0;
for(int j=1; j<=m; ++j) {
if(A[i][j]==0) {full[i]=false;continue;}
if(x[A[i][j]]!=i)add(i,x[A[i][j]]),add(x[A[i][j]],i);
cnt++;
}int top=0;
for(int j=1; j<=m; ++j) {
if(!A[i][j]||x[A[i][j]]!=i)continue;
A[i][j]=y[A[i][j]];
int p=lower_bound(stk+1,stk+top+1,A[i][j])-stk;
if(p>top)stk[++top]=A[i][j];
else stk[p]=A[i][j];
}Hv[i]=cnt-top;
all_full&=full[i];
all_hv|=Hv[i];ans+=Hv[i];
}
if(all_full) {
if(all_hv)puts("-1");
else puts("0");
}else Solve();
return 0;
}