代码集合

代码区(按照题目中代码列的数字)

1

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans[200001],s[200001];
vector<int>g[200001];
void dfs(int x,int f,int len){
	ans[1]+=len;
	for(int v:g[x])
		if(f!=v){
			dfs(v,x,len+1);
			s[x]+=s[v];
		}
	++s[x];
}
void Dfs(int x,int f){
	ans[x]=ans[f]+n-s[x]-s[x];
	for(int v:g[x])
		if(f!=v)
			Dfs(v,x);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<n;++i){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0,0);
	for(int v:g[1])
		Dfs(v,1);
    for(int i=1;i<=n;++i)
        cout<<ans[i]<<endl;
	return 0;
} 

2

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool can[1000][1000];
int n,k,ans,i,j,t1,l,a[1000],tot,dp[11][1000][101],p[1000];
bool pos(int x,int y){
	if(x&y)
		return 0;
	if(x&(y>>1))
		return 0;
	if((x>>1)&y)
		return 0;
	return 1;
}
int get(int x){
	int s=0;
	while(x){
		if(x&1)
			s++;
		x>>=1;
	}
	return s;
}
signed main(){
	cin>>n>>k;
	for(i=0;i<(1<<n);i++){
		if((i&(i>>1))==0){
			a[++tot]=i;
			p[tot]=get(i);
		}
	}
	for(i=1;i<=tot;i++)
		for(j=1;j<=tot;j++)
			can[i][j]=pos(a[i],a[j]);
	dp[0][1][0]=1;
	for(i=0;i<n;i++)
		for(j=1;j<=tot;j++)
			for(t1=0;t1<=k;t1++){
				if(!dp[i][j][t1])
					continue;
				for(l=1;l<=tot;l++)
					if(can[j][l])
						dp[i+1][l][t1+p[l]]+=dp[i][j][t1];
			}
	for(i=1;i<=tot;i++)
		ans+=dp[n][i][k];
	cout<<ans;
	return 0;
}

3

#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[1<<20];
int sum[20],n;
vector<pair<int,int> >p[20];
int m,x,y,z,d[1<<20],ok[1<<20];
bool calc(int x){
	int cnt=0;
	sum[0]=0;
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1];
		if(x&(1<<(i-1))){
			sum[i]++;
			cnt++;
		}
	}
	for(int i=0;i<p[cnt].size();i++){
		int y=p[cnt][i].first;
		int z=p[cnt][i].second;
		if(sum[y]>z)
			return 0;
	}
	return 1;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		p[x].push_back(make_pair(y,z));
	}
	ok[0]=1;
	for(int i=1;i<(1<<n);i++)
		ok[i]=calc(i);
	f[0]=1;
	for(int i=0;i<(1<<n);i++){
		if(!ok[i])
			continue;
		for(int j=0;j<n;j++)
			if(i&(1<<j))
				f[i]+=f[i-(1<<j)];
	}
	cout<<f[(1<<n)-1];
	return 0;
}

4

#include<bits/stdc++.h>
using namespace std;
int n,a[501],i,f[501][501],j,len,k;
int main(){
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			f[i][j]=INT_MAX/3;
	for(i=1;i<=n;i++)
		f[i][i]=1;
	for(len=2;len<=n;len++)
		for(i=1;i<=n;i++){
			int j=i+len-1;
			if(j>n)
				continue;
			if(a[i]==a[j]){
				if(len==2)
					f[i][j]=1;
				else
					f[i][j]=f[i+1][j-1];
			}
			for(k=i;k<j;k++)
				f[i][j]=min(f[i][k]+f[k+1][j],f[i][j]);
		}
	cout<<f[1][n];
	return 0;
}

5

#include <bits/stdc++.h>
using namespace std;
long long n,k,ans,a[1001],n2,i,f[1001][1001],j,len,value;
int main(){
    cin>>n;
    n2=2*n;
    for(i=1;i<=n;i++)
    	cin>>a[i];
    if(n==1)
    	cout<<1;
	else if(n==2)
		cout<<2+min(a[1],a[2]);
	else{
		for(i=1;i<=n;i++)
			a[n+i]=a[i];
		a[0]=a[n2];
		a[n2+1]=a[1];
		for(i=0;i<=n2;i++)
			for(j=0;j<=n2;j++)
				f[i][j]=1e18;
		for(i=1;i<=n2;i++){
			f[i][i]=1+a[i-1]+a[i+1];
			f[i][i-1]=0;	
		}
		for(len=2;len<=n;len++){
			for(i=1;i<=n2;i++){
				j=i+len-1;
				if(j>n2)
					continue;
				if(len==n)
					value=1;
				else if(len==n-1)
					value=1+a[i-1];
				else
					value=1+a[i-1]+a[j+1]; 
				for(k=i;k<=j;k++)
					f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+value);
			}
		}
	}
	ans=1e18;
	for(i=1;i<=n;i++)
		ans=min(ans,f[i][i+n-1]);
	cout<<ans;
    return 0;
}

6

#include<bits/stdc++.h>
using namespace std;
const int P=998244353;
long long n,a[100001],f[100001][10];
int main(){
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	f[1][a[1]]=1;
	for(int i=1;i<n;++i)
		for(int j=0;j<=9;++j){
			if(f[i][j]){
				f[i+1][(j+a[i+1])%10]+=f[i][j];
				f[i+1][(j+a[i+1])%10]%=P;
				f[i+1][j*a[i+1]%10]+=f[i][j];
				f[i+1][j*a[i+1]%10]%=P;
			}
		}
	for(int i=0;i<=9;++i)
		cout<<f[n][i]<<endl;
	return 0;
}

7

#include<bits/stdc++.h>
using namespace std;
int t,n,a[101],cnt,j;
void slove(){
	bool f[25001]={};
	int i;
	cin>>n;
	cnt=n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	f[0]=1;
	for(i=1;i<=n;i++){
		if(f[a[i]]){
			cnt--;
			continue;
		}
		for(j=a[i];j<=a[n];j++)
			f[j]|=f[j-a[i]];
	}
	cout<<cnt<<endl;
}
int main(){
	cin>>t;
	while(t--)
		slove();
	return 0;
}

8

#include<bits/stdc++.h>
using namespace std;
int n,a[501],sum[501],f[501][100001];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
		sum[i]=sum[i-1]+a[i];
	for(int i=0;i<=n;i++)
		for(int j=0;j<=sum[i];j++)
			f[i][j]=-1;
	f[0][0]=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=sum[i-1];j++){
			if(f[i-1][j]!=-1){
				f[i][j]=max(f[i][j],f[i-1][j]);
				int x=f[i-1][j];
				int y=x+j;
				int d=abs(x+a[i]-y);
				f[i][d]=max(f[i][d],min(x+a[i],y));
				d=abs(x-(y+a[i]));
				f[i][d]=max(f[i][d],min(x,y+a[i]));
			}
		}
	}
	cout<<f[n][0];
	return 0;
}

9

#include<bits/stdc++.h>
using namespace std;
int n,m,f[41][41][41][41],a[351],i,x,tot[5];
int dfs(int t1,int t2,int t3,int t4,int deep){
	if(t1+t2+t3+t4==0)
		return f[0][0][0][0]=0;
	if(f[t1][t2][t3][t4])
		return f[t1][t2][t3][t4];
	int ans=0;
	if(t1)
		ans=max(ans,dfs(t1-1,t2,t3,t4,deep+1)+a[deep+1]);
	if(t2)
		ans=max(ans,dfs(t1,t2-1,t3,t4,deep+2)+a[deep+2]);
	if(t3)
		ans=max(ans,dfs(t1,t2,t3-1,t4,deep+3)+a[deep+3]);
	if(t4)
		ans=max(ans,dfs(t1,t2,t3,t4-1,deep+4)+a[deep+4]);
	return f[t1][t2][t3][t4]=ans;
}
int main(){
	cin>>n>>m;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=m;i++){
		cin>>x;
		tot[x]++;
	}
	cout<<a[1]+dfs(tot[1],tot[2],tot[3],tot[4],1);
	return 0;
}

10

#include<bits/stdc++.h>
using namespace std;
int n,m,a[200][200],i,j,mp[200][200],ans;
void dfs(int x,int y){
	if(mp[x][y])
		return;
	mp[x][y]=1;
	if(a[x-1][y]<a[x][y]){
		dfs(x-1,y);
		mp[x][y]=max(mp[x][y],mp[x-1][y]+1);
	}
	if(a[x+1][y]<a[x][y]){
		dfs(x+1,y);
		mp[x][y]=max(mp[x][y],mp[x+1][y]+1);
	}
	if(a[x][y-1]<a[x][y]){
		dfs(x,y-1);
		mp[x][y]=max(mp[x][y],mp[x][y-1]+1);
	}
	if(a[x][y+1]<a[x][y]){
		dfs(x,y+1);
		mp[x][y]=max(mp[x][y],mp[x][y+1]+1);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	for(i=1;i<=n;i++)
		a[i][0]=INT_MAX;
	for(i=1;i<=m;i++)
		a[0][i]=INT_MAX;
	j=m+1;
	for(i=1;i<=n;i++)
		a[i][j]=INT_MAX;
	j=n+1;
	for(i=1;i<=m;i++)
		a[j][i]=INT_MAX;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			dfs(i,j);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			ans=max(ans,mp[i][j]);
	printf("%d",ans);
	return 0;
}

11

#include<bits/stdc++.h>
using namespace std;
int n,a[10][10],i,j,n2,x,y,z,f[20][10][10];
int main(){
	cin>>n;
	n2=2*n;
	while(cin>>x>>y>>z){
		if(!x&&!y&&!z)
			break;
		a[x][y]=z;
	}
	f[2][1][1]=a[1][1];
	for(int k=3;k<=n2;k++){
		for(int x1=1;x1<=n;++x1)
			for(int x2=1;x2<=n;++x2){
				f[k][x1][x2]=INT_MIN/3;
				int y1=k-x1,y2=k-x2,value;
				if(y1<1||y2<1)
					continue;
				if(x1==x2)
					value=a[x1][y1];
				else
					value=a[x1][y1]+a[x2][y2];
				if(x1>1&&x2>1)
					f[k][x1][x2]=max(f[k][x1][x2],f[k-1][x1-1][x2-1]+value);
				if(x1>1&&y2>1)
					f[k][x1][x2]=max(f[k][x1][x2],f[k-1][x1-1][x2]+value);
				if(y1>1&&x2>1)
					f[k][x1][x2]=max(f[k][x1][x2],f[k-1][x1][x2-1]+value);
				if(y1>1&&x2>1)
					f[k][x1][x2]=max(f[k][x1][x2],f[k-1][x1][x2]+value);			
			}
	}
	cout<<f[n2][n][n];
	return 0;
}

12

#include<bits/stdc++.h>
using namespace std;
long long n,m,x[1001][1001],a[1001],b[1001],i,j;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			cin>>x[i][j];	
	for(i=2;i<=n;i++)
		x[i][1]+=x[i-1][1];
	for(i=2;i<=m;i++){
		a[n]=x[n][i-1]+x[n][i];
		for(j=n-1;j>=1;j--)
			a[j]=max(x[j][i-1],a[j+1])+x[j][i];
		b[1]=x[1][i-1]+x[1][i];
		for(j=2;j<=n;j++)
			b[j]=max(x[j][i-1],b[j-1])+x[j][i];
		for(j=1;j<=n;j++)
			x[j][i]=max(a[j],b[j]);
	}
	cout<<x[n][m];
	return 0;
}

13

#include<bits/stdc++.h>
using namespace std;
int n,f[501][201],m,t[501],ans=INT_MAX/3;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d",&t[i]);
	sort(t+1,t+1+n);
	for(int i=1;i<=n;i++)
		for(int j=0;j<=2*m;j++)
			f[i][j]=INT_MAX/3;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=2*m;j++)
			for(int k=0;k<=2*m;k++)
				if((t[i-1]+k==t[i]+j)||(t[i-1]+k+m<=t[i]+j))
					f[i][j]=min(f[i][j],f[i-1][k]+j);
	for(int i=0;i<=2*m;i++)
		ans=min(f[n][i],ans);
	cout<<ans;
	return 0;
}

14

#include<bits/stdc++.h>
using namespace std;
int t,n,m,p[101][101],f[10001],a[101],i,j,k,b[101];
int main(){
	cin>>t>>n>>m;
	for(i=1;i<=t;i++)
		for(j=1;j<=n;j++)
			cin>>p[i][j];
	for(i=1;i<t;i++){
		for(j=1;j<=m;j++)
			f[j]=0;//初始化
		for(k=1;k<=n;k++)
			for(j=p[i][k];j<=m;j++)
				f[j]=max(f[j],f[j-p[i][k]]+p[i+1][k]-p[i][k]);
		m+=f[m];
	}
	cout<<m;
	return 0;
}

15

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,k,e,q[N],hh,tt;
long long sum[N],f[N];
long long get(int j){
	return f[j-1]-sum[j];
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;++i){
		scanf("%d",&e);
		sum[i]=sum[i-1]+e;
		while(hh<=tt&&q[hh]<i-k)++hh;
		while(hh<=tt&&get(q[tt])<=get(i))--tt;
		q[++tt]=i;
		f[i]=f[q[hh]-1]+sum[i]-sum[q[hh]];
	}
	printf("%lld",f[n]);
	return 0;
}

16

#include<bits/stdc++.h>
using namespace std;
long long n,k,W,w[1000],s[1000],i,j;
long double ss[1000][1000],g[1000],x=60;
int main(){
	scanf("%lld%lld%lld",&W,&k,&n);
	for(i=1;i<=n;i++)
		scanf("%lld%lld",&w[i],&s[i]);
	for(i=1;i<=n;i++){
		w[i]+=w[i-1];
		for(j=i;j<=n;j++)
			ss[i][j]=max(ss[i][j-1],k*x/s[j]);
	}
	for(i=1;i<=n;i++) {
		g[i]=1e18;
		for(j=0;j<i;j++)
			if(w[i]-w[j]<=W)//这一段的所有车的重量不超过 W
				g[i]=min(g[i],g[j]+ss[j+1][i]);//用时取决于最慢的车,ss[][]表示这一组车中过桥最慢的车的用时
    }
    cout<<fixed<<setprecision(1)<<g[n];
	return 0;
}

17

#include<bits/stdc++.h>
using namespace std;
int n,s[100001],f[100001],v,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>v;
		s[i]=s[i-1];
		if(v==1)
			++s[i];
		else
			--s[i];
		f[i]=1e6;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=i;++j)
			if(abs(s[i]-s[j-1])==i-j+1||abs(s[i]-s[j-1])<=m)
				f[i]=min(f[i],f[j-1]);
		++f[i];
	}
	cout<<f[n];
	return 0;
}

18

#include<bits/stdc++.h>
using namespace std;
int n,i,k,t,u[100001],v[100001];
char c[100001],ans[200001];
stack<char>s; 
int main(){
	scanf("%d",&n);
	scanf("%s",c);
	ans[++k]='.';
	for(i=0;c[i];++i){
		if(c[i]=='('||c[i]=='*')
			s.push(c[i]);
		if(c[i]=='+'){
			while(!s.empty()&&s.top()=='*'){
				ans[++k]=s.top();
				s.pop();
			}
			s.push(c[i]);
		}
		if(c[i]==')'&&!s.empty()){
			while(!s.empty()&&s.top()!='('){
				ans[++k]=s.top();
				s.pop();
			}
			s.pop();
		}
		if(c[i]!='('&&c[i]!=')')
			ans[++k]='.';
	}
	while(!s.empty()){
		ans[++k]=s.top();
		s.pop();
	}
	for(i=1;i<=k;++i){
		if(ans[i]=='.'){
			u[++t]=1;
			v[t]=1;
		}
		else if(ans[i]=='*'){
			--t;
			u[t]=(u[t+1]*v[t]+u[t]*v[t+1]+u[t]*u[t+1])%10007;
			v[t]=v[t]*v[t+1]%10007;
		}
		else{
			--t;
			v[t]=(u[t+1]*v[t]+u[t]*v[t+1]+v[t]*v[t+1])%10007;
			u[t]=u[t]*u[t+1]%10007;
		}
	}
	cout<<u[1];
	return 0;
}

19

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,a[5001],s[5001],i,j,f[5001][5001];
int main(){
	cin>>n>>m>>k;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n;i++)
		s[i]=s[i-1]+a[i];
	for(i=1;i<=n;i++)
		for(j=1;j<=k;j++)
			if(i>=m)
				f[i][j]=max(f[i-1][j],f[i-m][j-1]+s[i]-s[i-m]);
	cout<<f[n][k];
	return 0;
}

20

#include<bits/stdc++.h>
using namespace std;
const int mod=2015;
int n,k;
long long f[1001][1001];
int main(){
    cin>>n>>k;
    f[1][0]=1;
    for(int i=2;i<=n;++i)
        for(int j=0;j<i;++j)
            f[i][j]=(f[i-1][j-1]*(i-j)%mod+f[i-1][j]*(j+1)%mod)%mod;
    cout<<f[n][k];
    return 0;
}

21

#include<bits/stdc++.h>
#define l long long
using namespace std;
l n,x,a[61],i=1,r=1e18;
map<l,l>m[61];
void dfs(l n,l x,l s){
	if(m[n].find(x)!=m[n].end())
		if(m[n][x]<=s)
			return;
	if(!x){
		r=min(r,s);
		return;
	}
	if(!n)
		return;
	m[n][x]=s;
	dfs(n-1,x%a[n],s+x/a[n]);
	if(x%a[n])
		dfs(n-1,a[n]-x%a[n],s+x/a[n]+1);
}
int main(){
	cin>>n>>x;
	for(;i<=n;++i)
		cin>>a[i];
	dfs(n,x,0);
	cout<<r;
	return 0;
}

22

#include<bits/stdc++.h>
using namespace std;
int R[100],H[100],n,m,ans=INT_MAX/3;
void dfs(int n,int x,int s){
	if(x<m&&2*n/(R[x+1])+s+R[m]*R[m]>=ans)//这里是最优性剪枝,一共包含两条
		return;
	if(x==0){
		if(n==0)
			ans=s+R[m]*R[m];
		return;	
	}
	for(int r=R[x+1]-1;r>=x;--r)
		for(int h=min(n/(r*r)+1,H[x+1])-1;h>=x;--h){//外循环是顺序剪枝,把下面的if条件拿上来也是剪枝
			H[x]=h;
			R[x]=r;
			dfs(n-r*r*h,x-1,s+2*r*h);
		}
}
int main(){
    cin>>n>>m;
    R[m+1]=sqrt(n/m)+1;
    H[m+1]=n/(m*m)+1;//边界的处理
    dfs(n,m,0);
    cout<<ans;
    return 0;
}

23

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,dm,ans[100001],f[100001];
bool flag;
int gcd(int a,int b){
	int t;
	while(t=a%b){
		a=b;
		b=t;
	}
	return b;
}
void dfs(int a,int b,int x,int last){
	if(x==dm){
		if(a!=1)
			return;
		ans[x]=b;
		if(ans[x]<=ans[x-1])
			return;
		if(!flag||f[x]>ans[x]){
			for(int i=1;i<=x;i++)
				f[i]=ans[i];
		}
		flag=1;
		return;
	}
	for(int i=max(last+1,b/a);i<b*(dm-x+1)/a;++i){
		ans[x]=i;
		int g=gcd(a*i-b,b*i);
		int aa=(a*i-b)/g;
		int bb=b*i/g;
		dfs(aa,bb,x+1,i);
	}
}
signed main(){
	cin>>a>>b;
	ans[0]=1;
	flag=0;
	for(dm=1;;dm++){
		dfs(a,b,1,b/a);
		if(flag)break;
	}
	for(int i=1;i<=dm;i++)
		cout<<f[i]<<' ';
	return 0;
}

24

#include<bits/stdc++.h>
using namespace std;
bool row[10][10],col[10][10],nine[10][10];
int a[10][10],ans=-1,cnt,num[10][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,6,6,6,6,6,6,6,6,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,9,10,9,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,6,6,6,6,6,6,6,6}//把每个点的分值打表
};
struct node{
	int x,y;
}t[82];
int get(int x,int y){
	if(x<=3&&y<= 3)
        return 1;
    if(x<=3&&y<=6)
        return 2;
    if(x<=3&&y<=9)
        return 3;
    if(x<=6&&y<=3)
        return 4;
    if(x<=6&&y<=6)
        return 5;
    if(x<=6&&y<=9)
        return 6;
    if(x<=9&&y<=3)
        return 7;
    if(x<=9&&y<=6)
        return 8;
    return 9;//判到底在哪个九宫
}
void dfs(int deep){
	int i,j,x,y;
	x=t[deep].x;
	y=t[deep].y;
	if(!deep){
		int sum=0;
		for(i=1;i<=9;i++)
			for(j=1;j<=9;j++)
				sum+=a[i][j]*num[i][j];
		ans=max(ans,sum);//计算答案
	}
	bool f[10]={};
	for(i=1;i<=9;i++){
		if(!row[x][i]&&!col[y][i]&&!nine[get(x, y)][i]){//判断是否存在重复
			row[x][i]=1;
            col[y][i]=1;
            nine[get(x,y)][i]=1;
            a[x][y]=i;
            dfs(deep-1);
            row[x][i]=0;
            col[y][i]=0;
            nine[get(x,y)][i]=0;
		}
	}
}
int main(){
	int i,j;
	for(i=1;i<=9;i++)
		for(j=1;j<=9;j++){
			cin>>a[i][j];
			if(a[i][j]){
				row[i][a[i][j]]=1;
				col[j][a[i][j]]=1;
				nine[get(i,j)][a[i][j]]=1;//打标记
			}
			else{
				cnt++;
				t[cnt].x=i;
				t[cnt].y=j;	//筛空格
			}
		}
	dfs(cnt);
	cout<<ans;//出解
	return 0;
}

25

#include<bits/stdc++.h>
using namespace std;
int n,m,a[65],num,len,sum,gc,gs,mx,ans;
bool used[65],flag;
void dfs(int l,int num,int p){
    if(flag)return;
	if(num==gs-1){
		cout<<gc;
		flag=1;
	}
	if(l==gc){
		dfs(0,num+1,1);
		return;
	}
	int last=-1;
	for(int i=p;i<=n;i++){
		if(!used[i]&&l+a[i]<=gc&&last!=a[i]){
			used[i]=1;
			dfs(l+a[i],num,i+1);
			used[i]=0;
			last=a[i];
			if(l==0||l+a[i]==gc)
				break;
		}
	}
}
int main(){
	int i;
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
		len=max(len,a[i]);
	}
	sort(a+1,a+1+n,greater<int>());
	for(i=len;i<=sum/2;i++){
		if(sum%i==0){
			gc=i;
			gs=sum/i;
			for(int j=1;j<=n;j++)
				used[j]=0;
			dfs(0,0,1);
		}
	}
	if(!flag)cout<<sum;
}

26

#include<bits/stdc++.h>
using namespace std;
int n,i,j,num;
bool f[200011][10],x,y;
string a,b;
int main(){
	cin>>n>>a>>b;
	f[n][0]=1;
	for(i=n;i>=1;i--){
		num=a[i-1]-48;
		for(j=0;j<7;j++){
			x=f[i][(j*10+num)%7];
			y=f[i][j*10%7];
			if(b[i-1]=='T')
				f[i-1][j]=x|y;
			else
				f[i-1][j]=x&y; 
		}
	}
	if(f[0][0])
		cout<<"Takahashi";
	else
		cout<<"Aoki";
	return 0;
} 

27

#include<bits/stdc++.h>
using namespace std;
struct p{
	int t,v;
}U[200001],V[200001];//分别表示更改和最新值,t表示更新时间戳,v表示更新值。
int n,m,q;
vector<int>g[200001],G[200001];//g表示关注关系图,G表示关注大v关系的图。
int main(){
	cin>>n>>m>>q;
	const int B=sqrt(2*m);
	for(int i=1;i<=m;++i){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;++i)
		for(int v:g[i])
			if(g[v].size()>=B)
				G[i].push_back(v);//把关注的大v筛出来。
	for(int i=1;i<=n;++i)
		V[i]=U[i]={-1,i};//设定初值
	for(int i=1;i<=q;++i){
		int x;
		cin>>x;
		for(int v:G[x]){//同for(int j=0;j<G[x].size();++j),int v=G[x][j];
			if(U[v].t>V[x].t)
				V[x]=U[v];//确定点x的值
		}
		int len=g[x].size();
		if(g[x].size()<B)//小v直接更新
			for(int v:g[x])
				V[v]={i,V[x].v};
		else//大v先打标记
			U[x]={i,V[x].v};
	}
	for(int i=1;i<=n;++i)
		for(int v:G[i])
			if(U[v].t>V[i].t)//关注的大v是否有更新
				V[i]=U[v];
	for(int i=1;i<=n;++i)
		cout<<V[i].v<<' ';
	return 0;
}

28

#include<bits/stdc++.h>
using namespace std;
const int N=300002;
int n,l,r,s[N],pre=1;
bool v[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		int l,r;
		scanf("%d%d",&l,&r);
		v[l-1]=1,v[r]=1,++s[l],--s[r+1];
	}
	long long sum=0,ans=0;
	for(int i=1;i<N;++i){
		sum+=s[i];
		if(v[i])ans=max(ans,sum*(i-pre)),pre=i+1;
	}
	printf("%lld",ans);
	return 0;
} 

29

#include<bits/stdc++.h>
using namespace std;
int n,m,ans1,a[1000032],len,ans;
char s[1000000];
int main(){
	cin>>n>>m>>s;
	for(int i=0;i<n;++i)
		s[i]-='0';
	n+=30;
	while(m--){
		int x;
		cin>>x;
		++s[x];
		++ans1;
		while(s[x]>=2)
			a[x]=1,++s[x+1],s[x]-=2,++x,++ans1;
	}
	for(int i=0;i<n;++i){
		if(a[i]){
			++len;
			if(len>ans)
				ans=len;
		}
		else
			len=0;
	}
	cout<<ans1<<endl<<ans+1;
	return 0;
}

30

#include<bits/stdc++.h>
using namespace std;
int n,m,i,a[100001],l,r,zuo[100001],you[100001],zz[100001],yy[100001],minn=INT_MAX;
bool check(long long x){
	int cnt=0,sum=0,maxn=0;
	for(i=n;i>=1;i--){
		if(sum+a[i]<=x)sum+=a[i];
		else{
			maxn=max(sum,maxn);
			cnt++;
			zuo[cnt]=i+1;//表示左右端点
			you[cnt]=zuo[cnt-1]-1;
			sum=a[i];
		}
	}
	if(sum){
		cnt++;
		zuo[cnt]=i+1;
		you[cnt]=zuo[cnt-1]-1;
	}
	if(cnt==m&&maxn<minn){//恰好有 m 个人抄时统计答案
		minn=maxn;
		memcpy(zz,zuo,sizeof(zz));//zz,yy 表示答案的左右端点
		memcpy(yy,you,sizeof(yy));
	}
	return cnt<=m;
}
int main(){
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		r+=a[i];
		l=max(l,a[i]);
	}
	zuo[0]=n+1;
	while(l+1<r){
		long long mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid; 
	}
	if (!check(l)) check(r);//边界处理
	for(i=m;i>=1;i--)printf("%d %d\n",zz[i],yy[i]);
	return 0;
}

31

#include<bits/stdc++.h>
using namespace std;
double a[1000001],l,r;
int i,n,m;
bool check(double x){
	long long s=0;
	for(i=1;i<=n;i++)
		s+=int(a[i]/x);
	if(s>=m)
		return true;
	return false;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	l=0;
	r=a[n];
	while(r-l>1e-10){
		double mid=(l+r)/2;
		if(check(mid))
			l=mid;
		else
			r=mid;
	}
	if(check(l))
		printf("%.2f",int(l*100 + 0.0001)/100.0);
	else
		printf("%.2f",int(r*100 + 0.0001)/100.0);
	return 0;
}

32

#include<bits/stdc++.h>
using namespace std;
long double x[200001],y[200001],s[200001],l=1,r=1e15;
int n,i;
bool check(long double v){
	long double now=0;
	for(i=1;i<=n;i++){
		now+=s[i]/v;
		if(now>y[i])
			return 0;
		now=max(x[i],now);
	}
	return 1;
}
int main(){
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>x[i]>>y[i]>>s[i];
	while(r-l>0.00001){
		long double mid=(l+r)/2;
		if(check(mid))
			r=mid;
		else
			l=mid;
	}
	cout<<fixed<<setprecision(2)<<r;
	return 0;
}

33

#include<bits/stdc++.h>
using namespace std;
long long n,m,w[200001],v[200001],l[200001],r[200001],s1,s2,ll=1,rr=1e6,i,j,s,sum,a[200001],b[200001],ans1,ans2;
bool check(long long W,long long is){
	sum=0;
	for(i=1;i<=n;i++){
		a[i]=a[i-1];
		b[i]=b[i-1];
		if(w[i]>=W){
			a[i]+=v[i];
			b[i]++;
		}	
	}
	for(i=1;i<=m;i++){
		s2=b[r[i]]-b[l[i]-1];
		s1=a[r[i]]-a[l[i]-1];
		sum+=s1*s2;
	}
	if(is==1)
		ans1=sum;
	else if(is==2)
		ans2=sum;
	if(sum>s)
		return 0;
	return 1;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&s);
	for(i=1;i<=n;i++)
		scanf("%lld%lld",&w[i],&v[i]);
	for(i=1;i<=m;i++)
		scanf("%lld%lld",&l[i],&r[i]);
	while(ll+1<rr){
		int mid=(ll+rr)/2;
		if(check(mid,0))
			rr=mid;
		else
			ll=mid;
	}
	check(ll,1);
	check(rr,2);
	cout<<min(abs(ans1-s),abs(ans2-s));
	return 0;
}

34

#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int>p[20001];
int c[20001],l,r,n,m;
bool flag;
struct R{
	int u,v,z;
}e[100001];
void dfs(int x,int f){
	c[x]=f;
	if(!flag)
		return;
	int len=p[x].size();
	for(int i=0;i<len;i++){
		int y=p[x][i];
		if(!c[y])
			dfs(y,3-f);
		else if(c[y]==f){
			flag=0;
			return;	
		}
	}
}
bool check(int v){
	int i;
	flag=1;
	for(i=1;i<=n;i++){
		c[i]=0;
		p[i].clear();
	}
	for(i=1;i<=m;i++)
		if(e[i].z>v){
			p[e[i].u].push_back(e[i].v);
			p[e[i].v].push_back(e[i].u);
		}
	for(i=1;i<=n;i++)
		if(!c[i])
			dfs(i,1);
	return flag;
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].z);
	l=0,r=1e18;
	while(l+1<r){
		int mid=l+r>>1;
		if(check(mid))
			r=mid;
		else
			l=mid;
	}
	if(check(l))
		cout<<l;
	else if(check(r))
		cout<<r;
	else
		cout<<0;
	return 0;
}

35

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],d[100001],i,l,r,mid,f[100001];
bool check(int all){
	int cnt=0,day=0;
	for(i=1;i<=m;i++)
		f[i]=0;
	for(i=1;i<=all;i++){
		if(!f[a[i]]&&a[i])
			cnt++;
		f[a[i]]=i;
	}
	if(cnt<m)
		return 0;
	for(i=1;i<=all;i++){
		if(a[i]&&i==f[a[i]]){
			day-=d[a[i]];
			if(day<0)
				return 0;
		}
		else
			day++;
	}
	return 1;
}
int main(){
	cin>>n>>m;
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=m;i++)
		scanf("%d",&d[i]);
	l=0;
	r=n;
	while(l+1<r){
		mid=l+r>>1;
		if(check(mid))
			r=mid;
		else
			l=mid;
	}
	if(check(l))
		cout<<l;
	else if(check(r))
		cout<<r;
	else
		cout<<-1;
	return 0;
}

36

#include<bits/stdc++.h>
using namespace std;
int l,r,n,m;
bool check(int h){
	if(h/2>=n&&h/3>=m&&h/2+h/3-h/6>=m+n)
		return 1;
	return 0;
}
int main(){
	cin>>n>>m;
	l=0;
	r=6000000;
	while(l+1<r){
		int mid=l+r>>1;
		if(check(mid))
			r=mid;
		else
			l=mid;
	}
	if(check(l))
		cout<<l;
	else
		cout<<r;
	return 0;
}

37

#include<bits/stdc++.h>
using namespace std;
int n,a[100001],b[100001],sa[100001],sb[100001],ans;
bool cmp(int x,int y){
	return x>y;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i]>>b[i];
	sort(a+1,a+1+n,cmp);
	sort(b+1,b+1+n,cmp);//按价值排序
	for(int i=1;i<=n;++i){
		sa[i]=sa[i-1]+a[i];
		sb[i]=sb[i-1]+b[i];//前缀和
	}
	for(int i=1;i<=n;++i){
		int t=lower_bound(sb+1,sb+1+n,sa[i])-sb;//找到>=sa[i]的第1个位置
		int t1=min(sa[i],sb[t])-(i+t)*10;
		--t;//找到<sa[i]的最后位置
		int t2=min(sa[i],sb[t])-(i+t)*10;
		ans=max(ans,max(t1,t2));//取值
	}
	cout<<ans;
	return 0;
}

38

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000001],b[1000001],cnt[1000001],ccnt[1000001],x,tot,ans,l=INT_MAX,c[1000001];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	l=n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	for(int i=1;i<=n;++i)
		cin>>b[i];
	for(int i=n;i>=1;--i){
		x=a[i+1];
		--ccnt[cnt[x]];
		if(ccnt[cnt[x]]==0&&cnt[x]==ans)
			--ans;
		--cnt[x];
		++ccnt[cnt[x]];
		int t=b[i]-b[i+1]+1,j;
		for(j=l;j>0;--j){
			x=a[j];
			--ccnt[cnt[x]];
			++cnt[x];
			++ccnt[cnt[x]];
			if(ccnt[cnt[x]]==1)
				ans=max(ans,cnt[x]);
			--t;
			if(!t)
				break;
		}
		c[++tot]=ans;
		l=j-1;
	}
	for(int i=tot;i>=1;--i)
		cout<<c[i]<<endl;
	return 0;
}

39

#include<bits/stdc++.h>
using namespace std;
const int N=200001;
int T,n,res,f[N],rest[N];
vector<int>g[N];
int find(int x){
	return x==f[x]?x:f[x]=find(f[x]);
}
void solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)f[i]=i,rest[i]=1,g[i].clear();res=0;
	for(int i=1;i<n;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		g[max(x,y)].push_back(min(x,y));
	}
	for(int k=1;k<=n;++k){
		int c=0;
		for(auto v:g[k]){
			c+=!!rest[find(v)];
			rest[k]+=rest[find(v)];
			f[find(v)]=k;
		}
		if(c>1)rest[k]-=3,++res;
	}
	printf("%d\n",res);
}
int main(){
	scanf("%d",&T);
	while(T--)solve();
	return 0;
}

40

#include<bits/stdc++.h>
using namespace std;
int t,n,a[200001],i;
bool f;
int main(){
	cin>>t;
	while(t--){
		f=false;
		cin>>n;
		for(i=1;i<=n;i++)
			cin>>a[i];
		for(i=n;i>0;i--){
			if(a[i]>a[i-1])
				f=true;
			if(a[i]<a[i-1]&&f){
				i--;
				break;	
			}
		}
		cout<<i<<endl;
	}
	return 0;
}

41

#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,ans;
multiset<int>s;//multiset维护上次攻击时间最近的豌豆射手
struct zombie{
	int l,r;
}z[200001];
bool cmp(zombie x,zombie y){
	return x.r<y.r;
}
int main(){
	multiset<int>::iterator it;
	scanf("%d%d",&n,&m);
	if(m>=n){
		printf("0");
		return 0;
	}
	for(i=1;i<=n;i++)
		scanf("%d%d",&z[i].l,&z[i].r);
	sort(z+1,z+1+n,cmp);
	for(i=1;i<=n;i++){
		it=s.upper_bound(z[i].l);
		if(it!=s.begin()){
			it--;
			s.erase(it);
			s.insert(z[i].r);
		}
		else{
			if(s.size()+1>m)//打不死的情况
				ans++;
			else
				s.insert(z[i].r);	
		}
	}
	printf("%d",ans);
	return 0;
}

42

#include<bits/stdc++.h>
using namespace std;
int n,m,q,l,r,i,j;
struct w{
	int a,b;
}x[51],box[51];
bool cmp(w c,w d){
	return c.b>d.b;
}
bool cmp1(w c,w d){
	return c.b<d.b;
}
int main(){
	cin>>n>>m>>q;
	for(i=1;i<=n;i++)
		cin>>x[i].a>>x[i].b;
	for(i=1;i<=m;i++){
		cin>>box[i].b;
		box[i].a=i;
	}
	sort(x+1,x+1+n,cmp);
	sort(box+1,box+1+m,cmp1);
	while(q--){
		int f[51]={},ans=0;
		cin>>l>>r;
		for(j=1;j<=n;j++)
			for(i=1;i<=m;i++){
				if(box[i].a>=l&&box[i].a<=r)
					continue;
				if(!f[i]&&box[i].b>=x[j].a){
					ans+=x[j].b;
					f[i]=1;
					break;
				}
			}
		cout<<ans<<endl;
	}
}

43

#include<bits/stdc++.h>
using namespace std;
long long t,n,a[200001],b,i,l,j,k,ans[200001];
vector<long long>s[200001];
int main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(i=1;i<=n;i++){
			s[i].clear();//每轮结束清空
			ans[i]=0;//清零
			scanf("%lld",&a[i]);		
		}
		for(i=1;i<=n;i++){
			scanf("%lld",&b);
			s[a[i]].push_back(b);//把学生放到学校里
			
		}
		for(i=1;i<=n;i++)
			if((l=s[i].size())>0){
				sort(s[i].begin(),s[i].end(),greater<int>());//排序每个学校的学生
				for(j=1;j<l;j++)
					s[i][j]+=s[i][j-1];//计算前缀
			}
		for(i=1;i<=n;i++)
            if((l=s[i].size())!=0)//学校有人则执行,其实也可以去掉
                for(k=1;k<=l;k++)
                    ans[k]+=s[i][l/k*k-1];//计算在k人一组的情况下,该学校最多可以派出多少学生,这样写也不会让k超过该学校学生总数
		for(i=1;i<=n;i++)printf("%lld ",ans[i]);
		putchar('\n');
	}
	return 0;
}

44

#include<bits/stdc++.h>
using namespace std;
int n,y,p,c,ans,i;
multiset<int>s;
int main(){
	multiset<int>::iterator it;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d%d",&p,&c);
		y+=p;
		if(y>=c){
			y-=c;
			ans++;
			s.insert(c);
		}//如果可以,则满足订单,并把需求值存到容器中
		else if(!s.empty()&&*s.rbegin()>c){
			int a=*s.rbegin();
			s.erase(s.find(a));
			y+=a-c;
			s.insert(c);
		}//如果不行,则查看当前订单需求最大值,如果比当前订单需求大,则反悔订单,拿回牛奶,应用于该订单
	}
	cout<<ans;
	return 0;
}

45

#include<bits/stdc++.h>
using namespace std;
int n,c[10001],ans,x;
vector<int>g[10001];
void dfs(int x,int cc){
	if(c[x]!=cc)
		ans++;
	int len=g[x].size();
	for(int i=0;i<len;i++){
		int v=g[x][i];
		dfs(v,c[x]);
	}
}
int main(){
	cin>>n;
	for(int i=2;i<=n;i++){
		scanf("%d",&x);
		g[x].push_back(i);
	}
	for(int i=1;i<=n;i++)
		scanf("%d",&c[i]);
	dfs(1,-1);
	cout<<ans;
	return 0;
}

46

#include<bits/stdc++.h>
using namespace std;
struct N{
	int t,m;
}c[1000001];
int n,i,ans;
priority_queue<int,vector<int>,greater<int> >q;//改变优先级
bool cmp(N x,N y){
	return x.t<y.t||x.t==y.t&&x.m>y.m;//排序先按照时间从小到大排,再按照学分从大到小排
}
int main(){
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>c[i].t>>c[i].m;
	sort(c+1,c+1+n,cmp);
	for(i=1;i<=n;i++){
		q.push(c[i].m);//push学分
		if(q.size()>c[i].t)//判断如果不合法了,删除队首元素
			q.pop();
	}
	while(!q.empty()){
		ans+=q.top();//求和
		q.pop();
	}
	cout<<ans;
	return 0;
}

47

#include<bits/stdc++.h>
using namespace std;
stack<int>S;
string s;
vector<int>g;
int v; 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>s;
	for(char c:s)
		S.push(c&15);
	while(S.size()>1){
		int f=S.top();
		S.pop();
		if(f<5||f==5&&S.top()<5)
			v+=f;
		else{
			v+=(10-f);
			++S.top();
		}
	}
	int f=S.top();
	v+=min(f,11-f);
	cout<<v;
	return 0;
}

48

#include<bits/stdc++.h>
#define B long long
using namespace std;
B n,i=1,v;
unordered_set<B>s[100001];//代替f[i][j]
unordered_map<B,bool>V;//记录是否有这个数
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(;i<=n;++i){
		cin>>v;
		V[v]=1;
		s[1].insert(v);
	}
	for(i=1;i<=n;++i){
		for(auto it=s[i].begin();it!=s[i].end();++it){
			if(V[(*it)*2])
				s[i+1].insert((*it)*2);
			if((*it)%3==0&&V[(*it)/3])//判断转移是否合法
				s[i+1].insert((*it)/3);
		}
		if(!s[i+1].size()){
			cout<<i;
			return 0;
		}
	}
}

49

#include<bits/stdc++.h>
using namespace std;
const int N=30001;
int n,m,x,y;
string s="z";
unordered_map<string,int>mp;
string rev(string s){
	for(int i=0;i<m;++i)
		if(s[i]=='N')s[i]='Y';
		else s[i]='N';
	return s;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>x>>y;
	for(int i=1;i<=n;++i){
		string s;
		cin>>s;
		++mp[s];
	}
	if(x){
		for(auto it:mp)
			if(it.second==x&&mp[rev(it.first)]==y&&it.first<s)s=it.first;
		if(s=="z")s="-1";
		cout<<s;
		return 0;
	}
	else if(y){
		s="-1";
		for(auto it:mp)
			if(mp[it.first]==y&&!mp[rev(it.first)]&&it.first>s)s=it.first;
		cout<<rev(s);
		return 0;
	}
	else{
		if(m<=20&&mp.size()>(1<<m)-2){
			cout<<-1;
			return 0;
		}
		s="";
		for(int i=0;i<m;++i)s.push_back('N');
		while(mp[s]||mp[rev(s)]){
			int pos=m-1;
			while(s[pos]=='Y')s[pos]='N',--pos;
			s[pos]='Y';
		}
		cout<<s;
	}
	return 0;
}

50

#include<bits/stdc++.h>
using namespace std;
int n,a[1001][1001],d[1001],x,y,ans,i,j;
int check(){
	if(i==1&&j==n&&n%2)
		return a[n/2+1][n/2+1];
	if((i+j)%2)
		return 0;
	int x1=(i+j)/2,y1=(x1-i)+1,x2=x1+1-i,y2=y1+i-1,x3=x1+n-j,y3=y1+n-j,x4=x3+1-i,y4=y3+i-1;
	if(i==1||j==1||i==n||j==n)
		return a[x1][y1]+a[x2][y2]+a[x3][y3]+a[x4][y4]>>1;
	return a[x1][y1]+a[x2][y2]+a[x3][y3]+a[x4][y4];
}
int main(){
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	for(i=1;i<=n;i++){
		d[1]+=a[i][i];
		d[n]+=a[n-i+1][i];	
	}
	for(i=2;i<n;i++){
		x=i;
		y=1;
		d[i]=0;
		while(x!=1){
			x--;
			y++;
			d[i]+=a[x][y];
		}
		while(y!=n){
			x++;
			y++;
			d[i]+=a[x][y];
		}
		while(x!=n){
			x++;
			y--;
			d[i]+=a[x][y];
		}
		while(y!=1){
			x--;
			y--;
			d[i]+=a[x][y];
		}
	}
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++){
			ans=max(ans,d[i]+d[j]-check());
		}
	printf("%d",ans);
	return 0;
}

51

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll P=998244353;
ll n,a,b,l,i,v,ans;
char op;
vector<ll>s[2];
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>op>>v;
		if(op=='+')
			v>1?a+=v:b+=v;//判断加到哪个集合
		else
			s[v>1].push_back(v);//同理
	}
	l=s[0].size();//获取负乘数的个数
	if(l){
		sort(s[0].begin(),s[0].end());//求最大的负数
		if(l%2){
			ans=(a+b*s[0][l-1]%P)%P;//负数和乘最大的负数再加正数和,结果为正
			for(i=l-2;i>=0;i--)
				ans=(ans*s[0][i])%P;//正数乘偶数个负数,结果为正
			l=s[1].size()-1;
			for(i=l;i>=0;i--)
				ans=(ans*s[1][i])%P;
		}
		else{
			ans=(a*s[0][l-1]%P+b)%P;//正数和乘最大的负数再加负数和,结果为负
			for(i=l-2;i>=0;i--)
				ans=(ans*s[0][i])%P;//负数乘奇数个负数,结果为正
			l=s[1].size()-1;
			for(i=l;i>=0;i--)
				ans=(ans*s[1][i])%P;
		}
	}
	else{//没有负乘数,把正数和乘所有乘数,加负数和
		ans=a;
		l=s[1].size()-1;
		for(i=l;i>=0;i--)
			ans=(ans*s[1][i])%P;
		ans=(ans+b+P)%P;
	}
	cout<<(ans+P)%P;
	return 0;
}

52

#include<bits/stdc++.h>
using namespace std;
map<int,vector<int> >p;
map<int,vector<int> >::iterator it;
set<int>s,t;
int n,m,i,x,y,l;
int main(){
	cin>>n>>m;
	for(i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		p[x].push_back(y);
	}
	s.insert(n);
	for(it=p.begin();it!=p.end();++it){
		t.clear();
		l=it->second.size();
		for(i=0;i<l;i++){
			y=it->second[i];
			if(s.count(y+1)||s.count(y-1))
				t.insert(y);
		}
		for(i=0;i<l;i++){
				y=it->second[i];
			if(s.count(y))
				s.erase(y);
		}
		for(set<int>::iterator it=t.begin();it!=t.end();++it)
			s.insert(*it);
	}
	cout<<s.size();
	return 0;
}

53

#include<bits/stdc++.h>
using namespace std;
map<int,map<int,int> >f;
int n,m,i,x[2001],y[2001],j;
long long s;
int main(){
	cin>>n;
	for(i=1;i<=n;++i){
		cin>>x[i]>>y[i];
		f[x[i]][y[i]]=1;	
	}
	for(i=1;i<=n;++i)
		for(j=i+1;j<=n;++j){
			if(x[i]!=x[j]&&y[i]!=y[j]&&f[x[i]][y[j]]&&f[x[j]][y[i]])
				++s;
		}
	cout<<s/2;
	return 0;
}

54

#include<bits/stdc++.h>
#define m 100001
using namespace std;
int n,x,t,h[m],nxt[m],to[m],q,ans[m],p;
char c,a[m],st[m];
vector<int>ques[m];
void add(int u,int v){
	to[++p]=v;
	nxt[p]=h[u];
	h[u]=p;
}
void dfs(int pos,int top){
	for(int i=h[pos];i;i=nxt[i])
		dfs(to[i],top);
	if(a[pos]){
		st[top]=a[pos];
		dfs(pos+1,top+1);
	}
	for(int i=0;i<ques[pos].size();++i){
		int v=ques[pos][i];
		ans[v]=st[ans[v]];
	}
}
int main(){
	ios::sync_with_stdio(0);
    cin.tie(0);
	cout.tie(0);
	cin>>n;
	while(n--){
		cin>>c;
		if(c=='T')
			cin>>a[t++];
		else if(c=='U'){
			cin>>x;
			++t;
			add(t-x-1,t);
		}
		else{
			cin>>x;
			ques[t].push_back(++q);
			ans[q]=x;
		}
	}
	dfs(0,1);
	for(int i=1;i<=q;++i)
		cout<<char(ans[i])<<endl;
	return 0;
}

55

#include<bits/stdc++.h>
using namespace std;
int a,b,h[1001],cnt,t,i,j,x[1001][1001],ra,rb,ans;
struct SIDE{
	int x,y,l;
}side[1000001];
bool cmp(SIDE c,SIDE d){
	return c.l<d.l;
}
int find(int s){
	return h[s]==s?s:h[s]=find(h[s]);
}
int main(){
	scanf("%d%d",&a,&b);
	for(i=1;i<=b;i++){
		h[i]=i;
		side[++cnt].x=0;
		side[cnt].y=i;
		side[cnt].l=a;
		for(j=1;j<=b;j++)
			scanf("%d",&x[i][j]);
	}
	for(i=1;i<=b;i++)
		for(j=i+1;j<=b;j++)
			if(x[i][j]){
				side[++cnt].x=i;
				side[cnt].y=j;
				side[cnt].l=x[i][j];	
			}
	sort(side+1,side+1+cnt,cmp);
	for(i=1;i<=cnt&&t<=b;i++){
		ra=find(side[i].x);
		rb=find(side[i].y);
		if(ra!=rb){
			h[ra]=rb;
			ans+=side[i].l;
			t++;
		}
	}
	cout<<ans;
}

56

#include<bits/stdc++.h>
using namespace std;
int y,n,k,a,b,deep[100001],ans,m[100001],f[100001];
vector<int>g[100001];
bool cmp(int a,int b){
	return a>b;
}
void dfsa(int x,int from,int len){
	if(len>ans){
		ans=len;
		y=x;
	}
	int l=g[x].size();
	for(int i=0;i<l;i++){
		int v=g[x][i];
		if(v==from)
			continue;
		dfsa(v,x,len+1);
	}
}
void dfsb(int x,int from,int len){
	if(len>ans){
		ans=len;
		y=x;
	}
	int l=g[x].size();
	for(int i=0;i<l;i++){
		int v=g[x][i];
		if(v==from)
			continue;
		f[v]=x;
		dfsb(v,x,len+1);
	}
}
void dfs1(int x,int father){
	m[x]=deep[x];
    int l=g[x].size();
    for(int i=0;i<l;++i) {
		int v=g[x][i];
		if(father==v)continue;
    	deep[v]=deep[x]+1;
		dfs1(v,x);
	    m[x]=max(m[x],m[v]);
    }
}
int main() {
	int i;
    scanf("%d%d",&n,&k);
    for(i=1;i<n;++i){
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfsa(1,-1,0);//第一次求出直径的一端
	ans=0;
	dfsb(y,-1,0);//从一端走向另一端
	ans=ans+1>>1;//求重点
	for(i=1;i<=ans;++i)y=f[y];//迭代思想
	dfs1(y,-1);//再次dfs,求maxdeep & deep
    for(i=1;i<=n;++i)m[i]-=deep[i];//求每个点能到达的最大距离
	sort(m+1,m+n+1,cmp);
	cout<<m[k+1]+1;//输出答案
}

57

#include<bits/stdc++.h>
using namespace std;
int n,d[1000005],f[1000005][22],len,a,b,q,x;
vector<int>g[101];
int LCA(int u,int v){
	if(d[u]>d[v])
		swap(u,v);
	int h=d[v]-d[u];
	for(int i=20;i>=0;i--)
		if(h&(1<<i))
			v=f[v][i];
	if(u==v)
		return u;
	for(int i=20;i>=0;i--)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	return f[u][0];
}
int main(){
	n=4;
	d[1]=0;
	d[2]=d[3]=d[4]=1;
	f[2][0]=f[3][0]=f[4][0]=1;
	len=2;
	a=2;
	b=3;
	cin>>q;
	for(int i=1;i<=q;i++){
		scanf("%d",&x);
		int u=n+1;
		int v=n+2;
		n+=2;
		f[v][0]=f[u][0]=x;
		d[u]=d[v]=d[x]+1;
		for(int j=1;(1<<j)<=n;j++){
			f[u][j]=f[f[u][j-1]][j-1];
			f[v][j]=f[f[v][j-1]][j-1];
		}
		int lca=LCA(a,u);
		if(d[u]+d[a]-d[lca]*2>len){
			b=u;
			len++;
		}
		else{
			lca=LCA(b,u);
			if(d[u]+d[b]-d[lca]*2>len){
				a=u;
				len++;
			}	
		}
		printf("%d\n",len);
	}
	return 0;
}

58

#include<bits/stdc++.h>
using namespace std;
vector<int>g[3001];
int d[3001],f[3001];
int maxdep,nowdep;
int tot,total,run;
int j,k;
int n,a,b,t;
int ans[900001],p[3001];
bool ok[3001];
int cnt[3001][3001];
void dfs(int x,int from,int dep){
	maxdep=max(dep,maxdep);
	f[x]=from;
	d[x]=dep;
	int len=g[x].size(),i,v;
	bool f=0;
	for(i=0;i<len;i++){
		v=g[x][i];
		if(v!=from){
			dfs(v,x,dep+1);
			f=1;
		}
	}
	if(f)
		ok[x]=1;
}
int main(){
	int i,x,y;
	cin>>n;
	for(i=1;i<n;i++){
		cin>>x>>y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs(1,0,1);
	for(i=1;i<=n;i++)
		if(!ok[i])
			tot++;
	cin>>a;
	t=a;
	while(a!=1){
		p[++j]=a;
		a=f[a];
	}
	p[++j]=1;
	for(j;j>=1;j--)
		ans[++total]=p[j];
	a=t;
	for(i=2;i<=tot;i++){
		cin>>b;
		t=b;
		j=0;
		k=0;
		nowdep=d[b]-d[a];
		if(nowdep>0){
			for(j=1;j<=nowdep;j++){
			    p[j]=b;
				b=f[b];
				
			    }
			j--;
		}
		else if(nowdep<0){
			nowdep*=-1;
			for(k=1;k<=nowdep;k++){
				a=f[a];
				ans[++total]=a;
			}
			k--;
		}
		while(a!=b){
			p[++j]=b;
			ans[++total]=a;
			a=f[a];
			b=f[b];
		}
		run=k;
		ans[++total]=a;
		for(j;j>=1;j--)
			ans[++total]=p[j];
		a=t;
	}
	for(t;f[t];t=f[t])
		ans[++total]=f[t];
	for(i=1;i<total;i++){
		int minn,maxn;
		minn=min(ans[i],ans[i+1]);
		maxn=max(ans[i],ans[i+1]);
		if(minn!=maxn){
			cnt[minn][maxn]++;
			if(cnt[minn][maxn]>2){
				cout<<-1;
				return 0;
			}	
		}
	}
	for(i=1;i<=total;i++){
		cout<<ans[i]<<' ';
		if(ans[i+1]==ans[i])
			i++;
	}
	return 0;
}

59

#include<bits/stdc++.h>
using namespace std;
const int M=500001;
int n,m,f,ans,c[M],t[M],x[M],y[M],total,sum;
vector<int>e[2][M];
bool vis[M],od[M];
stack<int>s;
void dfs(int x,int g){//g表示是原图还是反向图
	vis[x]=1;
	if(g){
		c[x]=ans;//记录这个点属于哪个强连通
		t[ans]++;//记录这个强连通的点数
	}
	int len=e[g][x].size(),i,v;
	for(i=0;i<len;i++){
		v=e[g][x][i];
		if(!vis[v])
			dfs(v,g);
	}
	if(!g)
		s.push(x);//如果是正向图,压栈
}
int main(){
	int i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%d%d",&x[i],&y[i]);
		e[0][x[i]].push_back(y[i]);
		e[1][y[i]].push_back(x[i]);//建立原图和反向图
	}
	for(i=1;i<=n;i++)
		if(!vis[i])
			dfs(i,0);//遍历原图
	for(i=1;i<=n;i++)
		vis[i]=0;
	while(!s.empty()){
		f=s.top();
		if(!vis[f]){
			ans++;
			dfs(f,1);
		}
		s.pop();
	}//遍历反向图,求强连通
	for(i=1;i<=m;i++)
		if(c[x[i]]!=c[y[i]])
			od[c[x[i]]]=1;//这个点是否有出度
	for(i=1;i<=ans;i++)
		if(!od[i]){
			total=t[i];
			sum++;
		}
	printf("%d",sum>1?0:total);//判断出度为0的点是否有且仅有一个
	return 0;
}

60

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Edge{
	int u,v,t;
}e[410*410];
int n,m,en,d[410],p[410],h[410];
bool F[410*410],used[410];
queue<int>q;
void bfs(int E){
	for(int i=1;i<=n;++i){
		d[i]=n+1;
		used[i]=0;
		p[i]=0;	
	}
	d[1]=0;
	q.push(1);
	used[1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		used[x]=0;
		for(int i=h[x];i>0;i=e[i].t){
			if(i!=E){
				int v=e[i].v;
				if(d[v]>d[x]+1){
					d[v]=d[x]+1;
					p[v]=i;
					if(!used[v]){
						used[v]=1;
						q.push(v);
					}
				}
			}
		}
	}
	if(E!=0){
		if(d[n]==n+1)
			cout<<-1<<endl;
		else
			cout<<d[n]<<endl;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int u,v;
		cin>>u>>v;
		++en;
		e[en].u=u;
		e[en].v=v;
		e[en].t=h[u];
		h[u]=en;
	}
	bfs(0);
	int c=n;
	while(p[c]!=0){
		int x=p[c];
		F[x]=1;
		c=e[x].u;	
	}
	int s=d[n];
	if(d[n]==n+1)
		s=-1;
	for(int i=1;i<=m;++i){
		if(!F[i])
			cout<<s<<endl;
		else
			bfs(i);
	}
	return 0;
}

61

#include<bits/stdc++.h>
using namespace std;
int s,fa[17];
bool a[4][4],b[4][4],f;
const int d[4]={-1,1,0,0},D[4]={0,0,-1,1};
void init(){
	for(int i=0;i<17;++i)
		fa[i]=i;
}
int find(int x){
	if(x==fa[x])
		return x;
	return fa[x]=find(fa[x]);
}
void in(int x,int y){
	int ra=find(x);
	int rb=find(y);
	fa[ra]=rb;
}
int cnt(){
	int t=0;
	for(int i=0;i<17;++i){
		if(fa[i]==i)
			++t;
	}
	return t;
}
int main(){
	for(int i=0;i<4;++i)
		for(int j=0;j<4;++j)
			cin>>a[i][j];
	for(int M=0;M<(1<<16);++M){
		init();
		for(int i=0;i<16;++i){
			if(M&(1<<i))	
				b[i/4][i%4]=1;
			else
				b[i/4][i%4]=0;	
		}
		f=1;
		for(int i=0;i<4;++i)
			for(int j=0;j<4;++j)
				if(a[i][j]&&!b[i][j])
					f=0;
		if(!f)
			continue;
		for(int i=0;i<4;++i){
			for(int j=0;j<4;++j){
				for(int k=0;k<4;++k){
					int X=i+d[k];
					int Y=j+D[k];
					if(X<0||X>3||Y<0||Y>3){
						if(!b[i][j])
							in(i*4+j,16);	
					}
					else{
						if(b[X][Y]==b[i][j])
							in(i*4+j,X*4+Y);
					}
				}
			}	
		}
		if(cnt()==2)
			++s;	
	}
	cout<<s;
	return 0;
} 

62

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,x,lst,a;
		scanf("%d%d%d",&n,&x,&lst);
		bool f=0;
		for(int i=2;i<=n;++i){
			scanf("%d",&a);
			f|=a!=lst;//判断是否有不等的数
			lst=a;
		}
		a=lst;
        puts((f||x%a||x>0&&a>0||x<0&&a<0)?"Yes":"No");//判断正负性是否相反和是否整除
	}
	return 0;
}

63

#include<bits/stdc++.h>
using namespace std;
long long n,d,p[2000001],s,l,r,i;
const int P=998244353;
signed main(){
	cin>>n>>d;
	p[0]=1;
	for(i=1;i<=2e6;++i)
		p[i]=p[i-1]*2%P;
	for(i=1;i<=n;++i){
		if(n-i>=d)
			s=(s+p[d]*p[i-1]%P)%P;
		l=min(n-i,d-1);
		r=d-l;
		if(r<=n-i)
			s=(s+(l-r+1)*p[d-2]%P*p[i-1]%P)%P; 
	}
	cout<<s*2%P;
	return 0;
} 

64

#include<bits/stdc++.h>
using namespace std;
int t,k,c[2001][2001],s[2001][2001],i,j,n,m;
int main(){
	cin>>t>>k;
	c[1][0]=c[1][1]=c[0][0]=1;
	for(i=2;i<=2000;i++){
		c[i][0]=1;
		for(j=1;j<=i;j++){
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+(!c[i][j]?1:0);
		}
		s[i][i+1]=s[i][i];
	}
	while(t--){
		cin>>n>>m;
		if(m>n)m=n;
		cout<<s[n][m]<<endl;
	}
	return 0;
}

65

#include<bits/stdc++.h>
using namespace std;
long long n,b[8],cnt,ans=1,mx,i,n2;
double x;
bool power(){
	if(n2==1)
		return 1;
	x=log2(b[1]);
	for(i=1;i<=cnt;i++)
		if(int(log2(b[i]))!=x)
			return 0;
	return 1;
}
int main(){
	cin>>n;
	n2=n;
	for(i=2;i<=sqrt(n);i++){
		if(n%i==0){
			n/=i;
			ans*=i;
			b[++cnt]++;
			while(n%i==0){
				b[cnt]++;
				n/=i;	
			}
			mx=max(b[cnt],mx);
		}
	}
	if(n>1){
		ans*=n;
		b[++cnt]=1;
		mx=max(b[cnt],mx);
	}
	if(mx==1)
		cout<<ans<<' '<<0;
	else if(power())
		cout<<ans<<' '<<int(x);
	else
		cout<<ans<<' '<<1+ceil(log2(mx));
	return 0;
}

66

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int k,n,C,ans;
struct candy{
    int l,r,w;
}c[maxn];
struct NODE{
    int l,r,val,lazy;
}node[maxn<<2];
void push(int u){
    node[u].val=min(node[u<<1].val,node[u<<1|1].val);return; 
}
void pushdown(int u){
    if(node[u].lazy){
        node[u<<1].lazy+=node[u].lazy;
        node[u<<1|1].lazy+=node[u].lazy;
        node[u<<1].val+=node[u].lazy;
        node[u<<1|1].val+=node[u].lazy;
        node[u].lazy=0;
    }
    return;
}
void build(int u,int l,int r){
    int m=l+r>>1;
    node[u]=NODE{l,r};
    if(l>=r){
        node[u].val=C;
        return; 
    }
    build(u<<1,l,m);
    build(u<<1|1,m+1,r);
    push(u);
    return;
}
void update(int u,int l,int r,int v){
    if(l<=node[u].l&&r>=node[u].r){
        node[u].lazy+=v;
        node[u].val+=v;
        return;
    }
    pushdown(u);
    int m=node[u].l+node[u].r>>1;
    if(l<=m)update(u<<1,l,r,v);
    if(r>m)update(u<<1|1,l,r,v);
    push(u);
    return;
}
int query(int u,int l,int r){
    if(l<=node[u].l&&r>=node[u].r)
        return node[u].val;
    pushdown(u);
    int ans=1e9,m=node[u].l+node[u].r>>1;
    if(l<=m)
        ans=query(u<<1,l,r);
    if(r>m)
        ans=min(ans,query(u<<1|1,l,r));
    return ans;
}
bool cmp(candy x,candy y){
    return x.r<y.r;
}
signed main(){
    scanf("%d%d%d",&k,&n,&C);
    for(int i=1;i<=k;++i){
        scanf("%d%d%d",&c[i].l,&c[i].r,&c[i].w);
        c[i].r+=c[i].l-1;
    }
    build(1,1,n);
    sort(c+1,c+1+k,cmp);
    for(int i=1;i<=k;++i){
        int l=c[i].l,r=c[i].r-1,w=c[i].w;
        int minn=min(w,query(1,l,r));
        ans+=minn;
        update(1,l,r,-minn);
    }
    cout<<ans;
    return 0;
}

67

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int mod=998244353;
const int maxn=1e6+1;
int H,W,k,x1,x2,yy1,yy2,ans,h[2][maxn],w[2][maxn],inv[maxn],ifac[maxn],fac[maxn];
int C(int n,int m){
	return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
} 
signed main(){
	ios::sync_with_stdio(0);
    cin.tie(0);
	cout.tie(0);
	cin>>H>>W>>k>>x1>>yy1>>x2>>yy2;
	inv[1]=1;
	for(int i=2;i<maxn;++i)
		inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	ifac[0]=1,fac[0]=1;
	for(int i=1;i<maxn;++i){
		ifac[i]=ifac[i-1]*inv[i]%mod;
		fac[i]=fac[i-1]*i%mod;
	}
	h[1][0]=1;
	for(int i=1;i<=k;++i){
		h[0][i]=(h[1][i-1]+(H-2)*h[0][i-1])%mod;
		h[1][i]=(H-1)*h[0][i-1]%mod;
	}
	w[1][0]=1;
	for(int i=1;i<=k;++i){
		w[0][i]=(w[1][i-1]+(W-2)*w[0][i-1])%mod;
		w[1][i]=(W-1)*w[0][i-1]%mod;
	}
	for(int m=0;m<=k;++m){
		ans+=C(k,m)*h[x1==x2][m]%mod*w[yy1==yy2][k-m]%mod;
		ans%=mod;
	}
	cout<<ans;
	return 0;
}

68

#include<bits/stdc++.h>
using namespace std;
long long n,f[1<<18],a[19],b[19],x,y,t,i=0;
signed main(){
    cin>>n>>x>>y;
    for(;i<n;++i)
    	cin>>a[i];
    for(i=0;i<n;++i)
    	cin>>b[i];
    for(i=1;i<(1<<n);++i)
    	f[i]=2e18;
    for(int i=0;i<(1<<n);++i){
    	if(f[i]==2e18)
			continue;
		t=__builtin_popcount(i);
		int less=0;
		for(int j=0;j<n;++j){
			if(i>>j&1)
				++less;
			if(!(i>>j&1)){
				int s=i+(1<<j);
				f[s]=min(f[s],f[i]+abs(b[t]-a[j])*x+(t-less)*y);
			}
		}	
	}
	cout<<f[(1<<n)-1];
    return 0;
}

69

#include<bits/stdc++.h>
using namespace std;
int n,f[51][51];
char s[51];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>s+1;
    for(int i=1;i<=n;++i)
        for(int j=i+1;j<=n;++j)
            f[i][j]=51;
    for(int i=1;i<=n;++i)
        f[i][i]=1;
    for(int j=1;j<=n;++j)
        for(int i=j-1;i>=1;--i){
            if(s[i]==s[j])
                f[i][j]=f[i+1][j];
            for(int k=i;k<j;++k)
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); 
        }
    cout<<f[1][n];
    return 0;
}

70

#include<bits/stdc++.h>
using namespace std;
int f[51][51][51][51],s[51][51],n;
char c;
int dfs(int x1,int y1,int x2,int y2){
	if(f[x1][y1][x2][y2]!=-1)
		return f[x1][y1][x2][y2];
	if(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]==0)
		return f[x1][y1][x2][y2]=0;
	int ans=max(x2-x1+1,y2-y1+1);
	for(int x=x1;x<x2;++x)
		ans=min(ans,dfs(x1,y1,x,y2)+dfs(x+1,y1,x2,y2));
	for(int y=y1;y<y2;++y)
		ans=min(ans,dfs(x1,y1,x2,y)+dfs(x1,y+1,x2,y2));
	return f[x1][y1][x2][y2]=ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j){
			cin>>c;
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+(c=='#');
		}
	memset(f,-1,sizeof(f));
	cout<<dfs(1,1,n,n);
	return 0;
}

71

#include <bits/stdc++.h>
using namespace std;
char c[200010];
int n,k,ans;
int main(){
	scanf("%s",c+1);
	n=strlen(c+1);
	for(int i=2;i<n;i++){
		int l=i-1,r=i+1,len=0;
		if(c[i]!='B')continue;
		while(l>=1&&r<=n&&c[l]=='A'&&c[r]=='C')
			len++,l--,r++;
		if(!len)continue;
		ans+=min(len,k+(!(i&1))+1);
		if(k||len>1||(i&1))k++;
	}
	cout<<ans<<endl;
	return 0;
}

72

#include<bits/stdc++.h>
using namespace std;
namespace IO{
	char ibuf[(1<<20)+1],*iS,*iT;
	#if ONLINE_JUDGE
	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
 	#else
	#define gh() getchar()
	#endif
	#define reg register
	inline long long read(){
		reg char ch=gh();
		reg long long x=0;
		reg char t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
	inline void write(int x){
		if(x<0){
			putchar('-');
			x=-x;
		}
		if(x>9) write(x/10);
		putchar(x%10+'0');
	}
}
using IO::read;
using IO::write;
typedef long long ll;
const int mod=1e9+7,N=20000010,base=2e5,b[]={此处省略打表过程};
ll fac[N];
ll qpow(int a,int b){
	ll res=1,base=a;
	while(b){
		if(b&1)res=res*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return res;
}
ll jc(int n){
	if(n<N)return fac[n];
	int c=n/base,d=n%base;
	ll res=b[c];
	for(int i=1;i<=d;++i)res=res*(c*base+i)%mod;
	return res;
}
ll C(int n,int k){
	if(!k)return 1;
	ll t=qpow(jc(k),mod-2);
	return jc(n)*t%mod*t%mod;
}
void init(){
	fac[0]=1;
	for(int i=1;i<N;++i)fac[i]=fac[i-1]*i%mod;
}
signed main(){
	init();
	int T=read();
	while(T--){
		int n=read();
		write(C(n+n,n));
		putchar('\n');
	}
}

73

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=3000010;
int n,a[N];
ll sum[N],cnt[N],ans;
priority_queue<int>q;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=3*n;++i)scanf("%d",a+i);
	for(int i=1;i<=3*n;++i){
		sum[i]+=sum[i-1];
		if(q.size()<n){
			q.push(-a[i]);
			sum[i]+=a[i];
		}
		else{
			int r=q.top();
			if(-r<a[i]){
				q.pop();
				q.push(-a[i]);
				sum[i]+=a[i]+r;
			}
		}
	}
	while(!q.empty())q.pop();
	for(int i=3*n;i>=1;--i){
		cnt[i]+=cnt[i+1];
		if(q.size()<n){
			q.push(a[i]);
			cnt[i]+=a[i];
		}
		else{
			int r=q.top();
			if(r>a[i]){
				q.pop();
				q.push(a[i]);
				cnt[i]+=a[i]-r;
			}
		}
	}
	for(int i=n;i<=n+n;++i)ans=max(ans,sum[i]-cnt[i+1]);
	printf("%lld",ans);
	return 0;
}

74

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=2*N;
int ans,n,m,h[N],s[N],e[M],ne[M],idx,fa[N][17],depth[N],LOG[N];
void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u,int f){
	depth[u]=depth[f]+1;
	fa[u][0]=f;
	int lim=LOG[depth[u]-1];
	for(int k=1;k<=lim;++k)fa[u][k]=fa[fa[u][k-1]][k-1];
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==f)continue;
		dfs(j,u);
	}
}
int lca(int a,int b){
	if(depth[a]>depth[b])swap(a,b);
	while(depth[a]!=depth[b])b=fa[b][LOG[depth[b]-depth[a]]];
	if(a==b)return a;
	for(int i=LOG[depth[a]-1];~i;--i)
		if(fa[a][i]!=fa[b][i]){
			a=fa[a][i];
			b=fa[b][i];
		}
	return fa[a][0];
}
int Dfs(int u,int f){
	int res=s[u];
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(f==j)continue;
		int t=Dfs(j,u);
		if(t==0)ans+=m;
		else if(t==1)++ans;
		res+=t;
	}
	return res;
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&n,&m);
	for(int i=1,p=2;i<=n;++i){
		LOG[i]=LOG[i-1];
		if(i==p)++LOG[i],p<<=1;
	}
	for(int i=1;i<n;++i){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	dfs(1,0);
	for(int i=0;i<m;++i){
		int a,b;
		scanf("%d%d",&a,&b);
		int p=lca(a,b);
		++s[a],++s[b],s[p]-=2;
	}
	Dfs(1,0);
	printf("%d",ans);
	return 0;
}

75

#include<bits/stdc++.h>
using namespace std;
const int N=500001,M=2*N;
int n,m,s,h[N],e[M],ne[M],f[N][19],d[N],LOG[N],idx=1;
void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u,int fa){
	f[u][0]=fa;
	d[u]=d[fa]+1;
	int dep=LOG[d[u]];
	for(int i=1;i<=dep;++i)f[u][i]=f[f[u][i-1]][i-1];
	for(int i=h[u];i;i=ne[i])if(e[i]!=fa)dfs(e[i],u);
}
int LCA(int u,int v){
	if(d[u]>d[v])swap(u,v);
	while(d[u]<d[v])v=f[v][LOG[d[v]-d[u]]];
	if(u==v)return u;
	for(int i=LOG[d[u]];~i;--i)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	return f[u][0];
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=2,p=2;i<=n;++i)LOG[i]=LOG[i-1]+(i==p&&(p<<=1));
	for(int i=1;i<n;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(s,0);
	while(m--){
		int u,v;
		scanf("%d%d",&u,&v);
		printf("%d\n",LCA(u,v));
	}
	return 0;
}

76

#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=5010;
int n,m,idx,t,top,scc_cnt,in[N],out[N],h[N],e[M],ne[M],dfn[N],low[N],stk[N],id[N],siz[N];
bool st[N];
void tarjan(int u){
    dfn[u]=low[u]=++t;
    stk[++top]=u;
    st[u]=1;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!dfn[j]){
            tarjan(j);
            low[u]=min(low[u],low[j]);
        }
        else if(st[j])low[u]=min(low[u],dfn[j]);
    }
    if(low[u]==dfn[u]){
        int y;
        scc_cnt++;
        do{
            y=stk[top--];
            st[y]=0;
            id[y]=scc_cnt;
            siz[scc_cnt]++;
        }while(y!=u);
    }
}
void add(int a,int b){
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int main(){
    memset(h,-1,sizeof h);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        int x;
        while(scanf("%d",&x)){
            if(!x)break;
            add(i,x);
        }
    }
    for(int i=1;i<=n;++i)
        if(!dfn[i])tarjan(i);
    if(scc_cnt==1){
        puts("1\n0");
        return 0;
    }
    for(int u=1;u<=n;++u)
        for(int i=h[u];~i;i=ne[i]){
            int j=e[i],a=id[u],b=id[j];
            if(a!=b)++out[a],++in[b];
        }
    int out_cnt=0,in_cnt=0;
    for(int i=1;i<=scc_cnt;++i){
        if(!out[i])++out_cnt;
        if(!in[i])++in_cnt;
    }
    printf("%d\n%d",in_cnt,max(in_cnt,out_cnt));
    return 0;
}

77

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010,M=2000010;
const ll base=1e6;
int t,n,m,top,scc_cnt,mod,h[N],hs[N],e[M],ne[M],idx,dfn[N],low[N],stk[N],id[N],siz[N],f[N],g[N];
bool st[N];
void add(int h[],int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void tarjan(int u){
	dfn[u]=low[u]=++t;
	stk[++top]=u;
	st[u]=1;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!dfn[j]){
			tarjan(j);
			low[u]=min(low[u],low[j]);
		}
		else if(st[j])low[u]=min(low[u],dfn[j]);
	}
	if(low[u]==dfn[u]){
		int y;
		scc_cnt++;
		do{
			y=stk[top--];
			st[y]=0;
			id[y]=scc_cnt;
			siz[scc_cnt]++;
		}while(y!=u);
	}
}
int main(){
	memset(h,-1,sizeof h);
	memset(hs,-1,sizeof hs);
	scanf("%d%d%d",&n,&m,&mod);
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		add(h,a,b);
	}
	for(int i=1;i<=n;++i)
		if(!dfn[i])tarjan(i);
	unordered_set<ll>S;
	for(int i=1;i<=n;++i)
	    for(int j=h[i];~j;j=ne[j]){
	        int a=id[i],b=id[e[j]];
	        ll h=a*base+b;
	        if(a!=b){
	            add(hs,a,b);
	        }
	    }
	for(int i=scc_cnt;i;--i){
		if(!f[i]){
			f[i]=siz[i];
			g[i]=1;
		}
		for(int j=hs[i];~j;j=ne[j]){
			int k=e[j];
			if(f[k]<f[i]+siz[k]){
				f[k]=f[i]+siz[k];
				g[k]=g[i];
			}
			else if(f[k]==f[i]+siz[k])g[k]=(g[k]+g[i])%mod;
		}
	}
	int maxf=0,sum=0;
	for(int i=1;i<=scc_cnt;++i)
		if(f[i]>maxf){
			maxf=f[i];
			sum=g[i];
		}
		else if(f[i]==maxf)sum=(sum+g[i])%mod;
	printf("%d\n%d",maxf,sum);
	return 0;
}

78

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010,M=600010;
int dist[N],idx,top,n,m,e[M],w[M],ne[M],dfn[N],low[N],t,id[N],stk[N],h[N],scc_cnt,siz[N],hs[N];
bool st[N];
void add(int h[],int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
void tarjan(int u){
	dfn[u]=low[u]=++t;
	stk[++top]=u;
	st[u]=1;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!dfn[j]){
			tarjan(j);
			low[u]=min(low[u],low[j]);
		}
		else if(st[j])low[u]=min(low[u],dfn[j]);
	}
	if(dfn[u]==low[u]){
		int y;
		++scc_cnt;
		do{
			y=stk[top--];
			st[y]=0;
			id[y]=scc_cnt;
			siz[scc_cnt]++;
		}while(u!=y);
	}
}
int main(){
	memset(h,-1,sizeof h);
	memset(hs,-1,sizeof hs);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)add(h,0,i,1);
	while(m--){
		int t,a,b;
		scanf("%d%d%d",&t,&a,&b);
		if(t==1)add(h,b,a,0),add(h,a,b,0);
		else if(t==2)add(h,a,b,1);
		else if(t==3)add(h,b,a,0);
		else if(t==4)add(h,b,a,1);
		else add(h,a,b,0);
	}
	tarjan(0);
	for(int i=0;i<=n;++i)
		for(int j=h[i];~j;j=ne[j]){
			int a=id[i],b=id[e[j]];
			if(a==b){
				if(w[j]>0){
					puts("-1");
					return 0;
				}
			}
			else add(hs,a,b,w[j]);
		}
	for(int i=scc_cnt;i;--i)
		for(int j=hs[i];~j;j=ne[j]){
			int k=e[j];
			dist[k]=max(dist[k],dist[i]+w[j]);
		}
	ll res=0;
	for(int i=1;i<=scc_cnt;++i)res+=(ll)dist[i]*siz[i];
	printf("%lld",res);
	return 0;
}

79

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353,N=10010;
int n,a,b,fac[N],f[2][N];
int qpow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=(ll)s*a%mod;
		a=(ll)a*a%mod;
		b>>=1;
	}
	return s;
}
int C(int n,int m){
	return (ll)fac[n]*qpow(fac[n-m],mod-2)%mod*qpow(fac[m],mod-2)%mod;
}
int main(){
	scanf("%d",&n);
	fac[0]=1;
	for(int i=1;i<=n;++i){
		fac[i]=(ll)fac[i-1]*i%mod;
		int x;
		scanf("%d",&x);
		if(x==1)++a;
		else ++b;
	}
	if(!a)puts("1");
	else if(a<=b)printf("%d",C(b+1,a)%mod);
	else{
		f[0][0]=1;
		for(int i=1;i<=n;++i)
			for(int j=0;j<=a-b;++j)f[i&1][j]=(f[i-1&1][j+1]+f[i-1&1][j-1])%mod;
		printf("%d",f[n&1][a-b]);
	} 
	return 0;
}

80

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010, mod = 1e9 + 7;

int n;
int f[N];

int main()
{
    cin >> n;

    f[0] = 1;
    for (int i = 1; i <= n; i ++ )
        for (int j = i; j <= n; j ++ )
            f[j] = (f[j] + f[j - i]) % mod;

    cout << f[n] << endl;

    return 0;
}

81

#include<bits/stdc++.h>
using namespace std;
const int N=5010,M=20010;
int d[N],idx,timestamp,top,dcc_cnt,n,m,e[M],ne[M],h[N],dfn[N],low[N],stk[N],is_bridge[M],id[N];
void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void tarjan(int u,int from){
	dfn[u]=low[u]=++timestamp;
	stk[++top]=u;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!dfn[j]){
			tarjan(j,i);
			low[u]=min(low[u],low[j]);
			if(dfn[u]<low[j])is_bridge[i]=is_bridge[i^1]=1;
		}
		else if(i!=(from^1))low[u]=min(low[u],dfn[j]);
	}
	if(low[u]==dfn[u]){
		int y;
		++dcc_cnt;
		do{
			y=stk[top--];
			id[y]=dcc_cnt;
		}while(u!=y);
	}
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	tarjan(1,-1);
	for(int i=0;i<idx;++i)
		if(is_bridge[i])d[id[e[i]]]++;
	int cnt=0;
	for(int i=1;i<=dcc_cnt;++i)
		if(d[i]==1)++cnt;
	printf("%d",cnt+1>>1);
	return 0;
}

82

#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=30010;
int h[N],e[M],ne[M],idx,dfn[N],low[N],ans,root,timestamp,n,m;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u){
	dfn[u]=low[u]=++timestamp;
	int cnt=0;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!dfn[j]){
			tarjan(j);
			low[u]=min(low[u],low[j]);
			if(low[j]>=dfn[u])++cnt;
		}
		else low[u]=min(low[u],dfn[j]);
	}
	if(u!=root)++cnt;
	ans=max(ans,cnt);
}
void solve(){
	memset(h,-1,sizeof h);
	memset(dfn,0,sizeof dfn);
	ans=timestamp=idx=0;
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	int cnt=0;
	for(root=0;root<n;++root)
		if(!dfn[root]){
			++cnt;
			tarjan(root);
		}
	printf("%d\n",ans+cnt-1);
}
int main(){
	while(scanf("%d%d",&n,&m),n||m)solve();
}

83

#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=1010;
int cut[N],n,m,CASE,e[M],idx,h[N],ne[M],dfn[N],low[N],timestamp,stk[N],top,root,dcc_cnt;
vector<int>dcc[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u){
    dfn[u]=low[u]=++timestamp;
    stk[++top]=u;
    if(u==root&&h[u]==-1){
        ++dcc_cnt;
        dcc[dcc_cnt].push_back(u);
        return;
    }
    int cnt=0;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!dfn[j]){
            tarjan(j);
            low[u]=min(low[u],low[j]);
            if(dfn[u]<=low[j]){
                ++cnt;
                if(u!=root||cnt>1)cut[u]=1;
                ++dcc_cnt;
                int y;
                do{
                    y=stk[top--];
                    dcc[dcc_cnt].push_back(y);
                }while(y!=j);
                dcc[dcc_cnt].push_back(u);
            }
        }
        else low[u]=min(low[u],dfn[j]);
    }
}
void solve(){
    ++CASE;
    memset(h,-1,sizeof h);
    memset(dfn,0,sizeof dfn);
    memset(cut,0,sizeof cut);
    for(int i=1;i<=dcc_cnt;++i)dcc[i].clear();
    idx=n=timestamp=top=dcc_cnt=0;
    while(m--){
        int a,b;
        scanf("%d%d",&a,&b);
        n=max({n,a,b});
        add(a,b),add(b,a);
    }
    for(root=1;root<=n;++root)
        if(!dfn[root])tarjan(root);
    int res=0;
    unsigned long long num=1;
    for(int i=1;i<=dcc_cnt;++i){
        int cnt=0;
        for(int v:dcc[i])
            if(cut[v])++cnt;
        if(!cnt){
            if(dcc[i].size()>1)res+=2,num*=dcc[i].size()*(dcc[i].size()-1)/2;
            else res++;
        }
        else if(cnt==1)res++,num*=dcc[i].size()-1;
    }
    printf("Case %d: %d %llu\n",CASE,res,num);
}
int main(){
    while(scanf("%d",&m),m)solve();
    return 0;
}

84

#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
char s1[N],s2[N];
int ne[N],n,m;
int main(){
	scanf("%s%s",s1+1,s2+1);
	n=strlen(s1+1),m=strlen(s2+1);
	for(int i=2,j=0;i<=m;++i){
		while(j&&s2[j+1]!=s2[i])j=ne[j];
		if(s2[j+1]==s2[i])++j;
		ne[i]=j;
	}
	for(int i=1,j=0;i<=n;++i){
		while(j&&s2[j+1]!=s1[i])j=ne[j];
		if(s2[j+1]==s1[i])++j;
		if(j==m){
			printf("%d\n",i-m+1);
			j=ne[j];
		}
	}
	for(int i=1;i<=m;++i)printf("%d ",ne[i]);
	return 0;
}

85

#include<bits/stdc++.h>
using namespace std;
const int N=500010,M=26;
int T,n,tr[N][M],idx,cnt[N],q[N],ne[N],res;
char s[N*2];
void insert(){
    int p=0;
    for(int i=0;s[i];++i){
        int c=s[i]-'a';
        if(!tr[p][c])tr[p][c]=++idx;
        p=tr[p][c];
    }
    ++cnt[p];
}
void build(){
    int hh=0,tt=0;
    for(int i=0;i<26;++i)
        if(tr[0][i])q[tt++]=tr[0][i];
    while(hh!=tt){
        int t=q[hh++];
        for(int i=0;i<26;++i){
            int &c=tr[t][i];
            if(!c)c=tr[ne[t]][i];
            else{
                ne[c]=tr[ne[t]][i];
                q[tt++]=c;
            }
        }
    }
}
void solve(){
    res=0;
    memset(ne,0,sizeof ne);
    memset(tr,0,sizeof tr);
    memset(cnt,0,sizeof cnt);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%s",s);
        insert();
    }
    build();
    scanf("%s",s);
    for(int i=0,j=0;s[i];++i){
        int c=s[i]-'a';
        j=tr[j][c];
        int tmp=j;
        while(tmp&&~cnt[tmp]){
            res+=cnt[tmp];
            cnt[tmp]=-1;
            tmp=ne[tmp];
        }
    }
    printf("%d\n",res);
}
int main(){
    T=1;
    while(T--)solve();
    return 0;
}

86

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,t,tr[N][4],ne[N],q[N],dar[N],idx,f[N][N];
char str[N];
int get(char c){
    if(c=='A')return 0;
    if(c=='T')return 1;
    if(c=='G')return 2;
    return 3;
}
void insert(){
    int p=0;
    for(int i=0;str[i];++i){
        int c=get(str[i]);
        if(!tr[p][c])tr[p][c]=++idx;
        p=tr[p][c];
    }
    dar[p]=1;
}
void build(){
    int hh=0,tt=0;
    for(int i=0;i<4;++i)
        if(tr[0][i])q[tt++]=tr[0][i];
    while(hh!=tt){
        int t=q[hh++];
        for(int i=0;i<4;++i){
            int j=tr[t][i];
            if(!j)tr[t][i]=tr[ne[t]][i];
            else{
                ne[j]=tr[ne[t]][i];
                q[tt++]=j;
                dar[j]|=dar[ne[j]];
            }
        }
    }
}
int main(){
    while(scanf("%d",&n),n){
        memset(tr,0,sizeof tr);
        memset(dar,0,sizeof dar);
        memset(ne,0,sizeof ne);
        idx=0;
        for(int i=1;i<=n;++i){
            scanf("%s",str);
            insert();
        }
        build();
        memset(f,0x3f,sizeof f);
        scanf("%s",str+1);
        int m=strlen(str+1);
        f[0][0]=0;
        int res=0x3f3f3f3f;
        for(int i=0;i<m;++i)
            for(int j=0;j<=idx;++j)
                for(int k=0;k<4;++k){
                    int t=get(str[i+1])!=k;
                    int p=tr[j][k];
                    if(!dar[p])f[i+1][p]=min(f[i+1][p],f[i][j]+t);
                }
        for(int i=0;i<=idx;++i)res=min(res,f[m][i]);
        printf("Case %d: %d\n",++t,res==0x3f3f3f3f?-1:res);
    }
    return 0;
}

87

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int f[N],id[N],q[N],tr[N][26],idx,ne[N],n;
char str[N];
void insert(int x){
	int p=0;
	for(int i=0;str[i];++i){
		int c=str[i]-'a';
		if(!tr[p][c])tr[p][c]=++idx;
		p=tr[p][c];
		++f[p];
	}
	id[x]=p;
}
void build(){
	int hh=0,tt=-1;
	for(int i=0;i<26;++i)
		if(tr[0][i])q[++tt]=tr[0][i];
	while(hh<=tt){
		int t=q[hh++];
		for(int i=0;i<26;++i){
			int &p=tr[t][i];
			if(!p)p=tr[ne[t]][i];
			else{
				ne[p]=tr[ne[t]][i];
				q[++tt]=p;
			}
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		scanf("%s",str);
		insert(i);
	}
	build();
	for(int i=idx-1;~i;--i)f[ne[q[i]]]+=f[q[i]];
	for(int i=0;i<n;++i)printf("%d\n",f[id[i]]);
	return 0;
}

88

#include<bits/stdc++.h>
using namespace std;
const int N=20010,M=200010;
int n,m,h[N],e[M],ne[M],idx,u[M],v[M],w[M],col[N];
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int color){
	col[u]=color;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!col[j]&&!dfs(j,3-color))return 0;
		else if(col[j]==col[u])return 0;
	}
	return 1;
}
bool check(int mid){
	idx=0;
	memset(h,-1,sizeof h);
	memset(col,0,sizeof col);
	for(int i=1;i<=m;++i)
		if(w[i]>mid)add(u[i],v[i]),add(v[i],u[i]);
	for(int i=1;i<=n;++i)
		if(!col[i]&&!dfs(i,1))return 0;
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)scanf("%d%d%d",u+i,v+i,w+i);
	int l=0,r=1e9;
	while(l+1<r){
		int mid=l+r>>1;
		if(check(mid))r=mid;
		else l=mid;
	}
	if(check(l))printf("%d",l);
	else printf("%d",r);
	return 0;
}

89

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=110,dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int n,t,ans;
PII match[N][N];
bitset<N>a[N],st[N];
bool find(int x,int y){
	for(int k=0;k<4;++k){
		int i=dx[k]+x,j=dy[k]+y;
		if(i&&j&&i<=n&&j<=n&&!a[i][j]&&!st[i][j]){
			st[i][j]=1;
			PII t=match[i][j];
			if(!t.x||find(t.x,t.y)){
				match[i][j]={x,y};
				return 1;
			}
		}
	}
	return 0;
}
int main(){
	scanf("%d%d",&n,&t);
	while(t--){
		int x,y;
		scanf("%d%d",&x,&y);
		a[x][y]=1;
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(i+j&1&&!a[i][j]){
				memset(st,0,sizeof st);
				if(find(i,j))++ans;
			}
	printf("%d",ans);
	return 0;
}

90

#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1010;
int n,m,k,idx,h[N],e[M],ne[M],match[N];
bool st[N];
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int find(int x){
	for(int i=h[x];~i;i=ne[i]){
		int j=e[i];
		if(!st[j]){
			st[j]=1;
			if(!match[j]||find(match[j])){
				match[j]=x;
				return 1;
			}
		}
	}
	return 0;
}
void solve(){
    memset(match,0,sizeof match);
	memset(h,-1,sizeof h);
	idx=0;
	int res=0;
	scanf("%d%d",&m,&k);
	while(k--){
		int i,a,b;
		scanf("%d%d%d",&i,&a,&b);
		if(!a||!b)continue;
		add(a,b);
	}
	for(int i=1;i<n;++i){
		memset(st,0,sizeof st);
		if(find(i))++res;
	}
	printf("%d\n",res);
}
int main(){
	while(scanf("%d",&n),n)solve();
	return 0;
}

91

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=210,dx[]={1,1,-1,-1,2,2,-2,-2},dy[]={2,-2,2,-2,1,-1,1,-1};
int n,m,t,ans;
PII match[N][N];
bitset<N>a[N],st[N];
bool find(int x,int y){
	for(int k=0;k<8;++k){
		int i=dx[k]+x,j=dy[k]+y;
		if(i>0&&j>0&&i<=n&&j<=m&&!a[i][j]&&!st[i][j]){
			st[i][j]=1;
			PII t=match[i][j];
			if(!t.x||find(t.x,t.y)){
				match[i][j]={x,y};
				return 1;
			}
		}
	}
	return 0;
}
int main(){
	scanf("%d%d",&n,&t);
	m=n;
	for(int i=1;i<=t;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		a[x][y]=1;
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(i+j&1&&!a[i][j]){
				memset(st,0,sizeof st);
				if(find(i,j))++ans;
			}
	printf("%d",n*m-t-ans);
	return 0;
}

92

#include<bits/stdc++.h>
using namespace std;
const int N=210;
int n,m,st[N],d[N][N],match[N];
bool find(int x){
	for(int i=1;i<=n;++i)
		if(d[x][i]&&!st[i]){
			st[i]=1;
			int t=match[i];
			if(!t||find(t)){
				match[i]=x;
				return 1;
			}
		}
	return 0;
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		d[a][b]=1;
	}
	for(int k=1;k<=n;++k)
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				d[i][j]|=d[i][k]&d[k][j];
	int res=0;
	for(int i=1;i<=n;++i){
		memset(st,0,sizeof st);
		if(find(i))++res;
	}
	printf("%d",n-res);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值