代码区(按照题目中代码列的数字)
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)
g[i]=min(g[i],g[j]+ss[j+1][i]);
}
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){
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];
int n,m,q;
vector<int>g[200001],G[200001];
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);
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]){
if(U[v].t>V[x].t)
V[x]=U[v];
}
int len=g[x].size();
if(g[x].size()<B)
for(int v:g[x])
V[v]={i,V[x].v};
else
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[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){
minn=maxn;
memcpy(zz,zuo,sizeof(zz));
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;
int t1=min(sa[i],sb[t])-(i+t)*10;
--t;
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;
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];
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);
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];
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);
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){
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);
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;
}