神奇的div2场
不打真的亏了
A.白给的
如果1和0个数相同就把第一字符单独输出
#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int n;
int a,b;
string x;
int main()
{
cin>>n;
cin>>x;
for(int i=1;i<=n;i++)
{
if(x[i-1]=='1') a++;
if(x[i-1]=='0') b++;
}
if(a!=b)
{
cout<<1<<endl;
cout<<x<<endl;
}
else
{
cout<<2<<endl;
cout<<x[0]<<" ";
for(int i=1;i<n;i++)
{
cout<<x[i];
}
}
return 0;
}
B.白给
排序,按照顺序摆放,a[i+1]肯定比a[i]大所以,两边的和必然大于中间的数字
对于最大的数字,判断其是否小于次小与第三小数字之和,如果小于把最后一个数字与倒数第二个数字换位置就可以了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n;
int a[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
if(a[n]>=a[n-1]+a[n-2])
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
for(int i=1;i<=n-2;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n]<<" "<<a[n-1];
}
return 0;
}
C.emmm
因为每个位置上只有0-9所以前缀和,然后对10求除法就可以了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,x,y;
int a[maxn],s[maxn];
int main()
{
cin>>n;
s[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=a[i]+s[i-1];
}
cin>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
cout<<(s[y]-s[x-1])/10<<endl;
}
return 0;
}
D1.
看了好久没看懂题,真的应该多学学嘤语了
如果某个节点有的度为2就不可以满足条件
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,x,y;
int a[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
a[x]++;
a[y]++;
}
for(int i=1;i<=n;i++)
{
if(a[i]==2)
{
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
return 0;
}
E.
不太懂为啥的卡了很久
貌似数组开的有点问题的样子
对于那个同余方程左右两边都乘一个(ai-aj)
然就变成ai四次方-k*ai=aj四次方-k*aj(mod p)
然后就枚举就好了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long n,p,k,x;
map<long long,long long> mp;
long long num,temp;
long long ans=0;
int main()
{
ans=0;
cin>>n>>p>>k;
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
num=x%p;
num=(((num*num)%p)*((num*num)%p))%p;
temp=(k*x)%p;
num=(num-temp)%p;
if(num<0) num=num+p;
ans=ans+mp[num];
mp[num]++;
}
cout<<ans<<endl;
return 0;
}