# 2018黑龙江省赛(upc7215-upc7224)(solve8/10)

### 题目没连接，除了Upc，没找到其他开发OJ有此题，如果有连接，请评论区留言下，谢谢~

A题：

B 题：

C题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod =1e9+7;
const int maxn=1e6+5;
ll fac[maxn],inv[maxn];
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
void init()
{
fac[0]=1;
for (int i=1;i<maxn;i++)
fac[i]=fac[i-1]*i%mod;
inv[maxn-1]=qpow(fac[maxn-1],mod-2);
for (int i=maxn-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
}
ll C(ll n,ll m){
if (n<m) return 0;
return ((fac[n]*inv[m]%mod)%mod*inv[n-m]%mod)%mod;
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
ll a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
ll temp=(C(a+c,a)*C(b+d,b))%mod;
ll Temp=(C(a+d,a)*C(b+c,b))%mod;
temp=(temp-Temp+mod)%mod;
printf("%lld\n",temp);
}
return 0;
}

D题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int b[maxn];
int kuai[maxn];
int vis[maxn];
int Maxx[maxn][25];
int Minn[maxn][25];
int cnt[maxn];
struct node{
int l;
int r;
int id;
}no[maxn];
int ans,n,m;
int cmp(node a,node b)
{
if(kuai[a.l]==kuai[b.l])
return a.r<b.r;
return a.l<b.l;
}
void init()
{
for(int j=1;j<=20;j++)
{
for(int i=1;i+(1<<j)<=n+1;i++)
{
Maxx[i][j]=max(Maxx[i][j-1],Maxx[i+(1<<(j-1))][j-1]);
Minn[i][j]=min(Minn[i][j-1],Minn[i+(1<<(j-1))][j-1]);
}
}
}
int RMQmax(int l,int r)
{
int k=0;
while((1<<(k+1))<=r-l+1)
k++;
return max(Maxx[l][k],Maxx[r-(1<<k)+1][k]);
}
int RMQmin(int l,int r)
{
int k=0;
while((1<<(k+1))<=r-l+1)
k++;
return min(Minn[l][k],Minn[r-(1<<k)+1][k]);
}
{
cnt[a[l]]++;
if(cnt[a[l]]==1)
ans++;
}
void del(int l)
{
cnt[a[l]]--;
if(cnt[a[l]]==0)
ans--;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(cnt,0,sizeof(cnt));
scanf("%d%d",&n,&m);
int black=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
kuai[i]=i/black+1;
Maxx[i][0]=a[i];
Minn[i][0]=a[i];
}
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&no[i].l,&no[i].r);
no[i].id=i;
}
sort(b+1,b+1+n);
int k=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+1+k,a[i])-b;
int l=1;
int r=0;
ans=0;
sort(no+1,no+1+m,cmp);
for(int i=1;i<=m;i++)
{
while(l<no[i].l)
del(l++);
while(l>no[i].l)
while(r<no[i].r)
while(r>no[i].r)
del(r--);
int Max=RMQmax(no[i].l,no[i].r);
int Min=RMQmin(no[i].l,no[i].r);
if(Max-Min==ans-1)
vis[no[i].id]=1;
else
vis[no[i].id]=0;
}
for(int i=1;i<=m;i++)
{
if(vis[i]==1)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
} 

E题

F题

#include<bits/stdc++.h>
using namespace std;
int k,ans;
char a[4005];
char b[4005];
void check(char c[],char d[])
{
int sum=0;//标记已经有多少个不同
int len=min(strlen(c),strlen(d));

for(int l=0,r=-1;l<len;l++)
{
while(r+1<len && sum+(c[r+1]!=d[r+1])<=k)
{
r++;
sum+=c[r]!=d[r];
}
ans=max(ans,r-l+1);
sum-=(c[l]!=d[l]);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&k);
scanf("%s%s",a,b);
ans=0;
int Len=strlen(a);
for(int i=0;i<Len;i++)
check(a+i,b);
Len=strlen(b);
for(int i=0;i<Len;i++)
check(b+i,a);
printf("%d\n",ans);
}
return 0;
} 

G题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int ans=0;
for(int i=1;i<n;i++)
ans+=a[n-1]-a[i];
if(ans>=a[0])
printf("-1\n");
else
printf("%d\n",ans+a[n-1]-a[0]);
}
return 0;
} 

H题

I题

J题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int b[maxn];
int vis[maxn];
int Vis[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
memset(vis,0,sizeof(vis));
memset(Vis,0,sizeof(Vis));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
for(int i=0;i<n;i++)
Vis[b[i]]=i;
int ans=n;
for(int i=0;i<n;i++)
{
if(vis[i]==0)
{
int temp=i;
while(vis[temp]==0) //跑一个环
{
vis[temp]=1;
temp=Vis[a[temp]];
}
ans--;//一个环少交换一次
}
}
printf("%d\n",ans);
}
return 0;
} 

05-22 965
05-14 1184
05-21 1314
05-09 7074
08-08 445