A. Keanu Reeves
题意(水题)
一个字符串0和1的个数不同则是good;把一个不好的字符串切割成最少的good串;
如果是good串,直接输出,不是,则切成两个good串,一个是S1串,另一个是S2S3…Sn串。
B. Number Circle
题意:
一个数组组成一个环,要求任意一个数小于相邻两个数的和,按从大到小排序,最大数的小于第2和第3大的数的和,则说明可行,在把最大的数放他们中间输出即可。
C. Candies!
思维题:
一个区间内,两两之和,如果它大于10就可以得到一颗糖,并把它模10,组成一个新的序列;重复上面的步骤知道只有一个数位置
当时我直接暴力的,时间复杂度肯定暴了,当没有想到好的方法还是暴力了一发,心里默念
过过过,当然还是超时了,看了一下别人的思路是真的?比,原来是一个求区间和除10向下取整,弱鸡一个Orz,太菜了,然后就自己想吧
前缀和就好了(这里Orz大佬 ):
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define ll long long
const int maxn=2e5+5;
int a[maxn],tmp[maxn];
map<pair<int,int>,int> mp;
map<pair<int,int>,int> ::iterator it;
ll mod=1e9+7;
struct edge{
ll e,v;
ll ans;
};
//struct edge a[maxn];
bool cmp(struct edge a,struct edge b){
if(a.e*b.v>a.v*b.e) return true;
else return false;
}
ll mulit(ll base,ll k ){
ll ans=1;
while(k){
if(k%2) ans=base*ans%mod;
base=base*base%mod;
k>>=1;
}
return ans%mod;
}
int main(){
std::ios::sync_with_stdio (false);
int n,q;
cin>>n;
for(int i=1; i<=n; ++i) cin>>a[i];
tmp[0]=0;
for(int i=1; i<=n; ++i) tmp[i]=tmp[i-1]+a[i];
cin>>q;
for(int i=0; i<q; ++i) {
int l,r;
cin>>l>>r;
cout<<(tmp[r]-tmp[l-1])/10<<endl;
}
return 0;
}
D1. Add on a Tree
题看了半天( qwq~~)都没看懂,瞎写了一通 (?)
翻译过来:找一下看看有没有度数为二的点,
就这么简单,证明:一个有三个的度顶点的简单图,可以对半添加吧(说不清qwq )
1.Add x/2 on the path u,l1.
2.Add x/2 on the path u,l2.
3Add −x/2 on t he path l1,l2.
可以把这个看做一个结论吧,虽然不知道什么时候能用到
E. Count Pairs
一个数论题,看题解的,学到了学到了 请看官方证明
ac代码:
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define ll long long
const int maxn=2e5+5;
int a[maxn],tmp[maxn];
map<ll,int> mp;
map<ll,int> ::iterator it;
//ll mod=1e9+7;
struct edge{
ll e,v;
ll ans;
};
//struct edge a[maxn];
bool cmp(struct edge a,struct edge b){
if(a.e*b.v>a.v*b.e) return true;
else return false;
}
ll mulit(ll base,ll k ,ll mod){
ll ans=1;
while(k){
if(k%2) ans=base*ans%mod;
base=base*base%mod;
k>>=1;
}
return ans%mod;
}
ll sub(ll a, ll b, ll mod){
ll ans=a-b;
if(ans<0) ans+=mod;
return ans;
}
int main(){
std::ios::sync_with_stdio (false);
int n,p,k;
memset(a,0,sizeof(a));
cin>>n>>p>>k;
ll ans=0;
for(int i=0; i<n; ++i){
ll x;
cin>>x;
ll val=sub(mulit(x,4,p),((k%p)*(x%p)%p),p);
ans+=mp[val];
++mp[val];
}
cout<<ans<<"\n";
return 0;
}
总结:
自己还是太菜了qwq,Orz cf大佬,看ac人数基本上可以看出题目的难度,也可以帮助自己不把简单的想复杂,或者是自己题目还没看懂,还有其他简单的方法,总结,做题吧