题解

void solve()
{
    int n;
    cin>>n;
    string s,ss,sss,ssss;//用c的话就是开3个char数组分别存对应的字符按顺序输出即可
    cin>>s;
    for(int i=0;i<n;i++)
    {
        if(s[i]>='a'&&s[i]<='z') ss+=s[i];
        else if(s[i]>='0'&&s[i]<='9') sss+=s[i];
        else ssss+=s[i];
    }
    cout<<ss<<sss<<ssss<<endl;
}

void solve() {
 int n;
 cin>>n;
 vector<int> a(n);
 map<int,int> mp;   //mp[i]表示长度为i的棍子个数
 for(auto &i:a) cin>>i,mp[i]++; //遍历数组a进行输入,建议自己百度了解掌握
 sort(all(a));
 for(int i=0;i<n;++i){
    if(mp[a[i]]>=3){ //显然构成三角形是最短的
        cout<<"yes\n"<<a[i]*3<<'\n';
         return;
    }
 }
 cout<<"no\n";
 }               
void solve() {
   vector<int> a(3);
   for(auto &i:a) cin>>i;
   sort(a.begin(),a.end());
  //分析发现把一对不同的变成和他们都不同的颜色,新变成的颜色数量净增加3
  //那么只有数量差3的倍数或者本来就相等的才可以
   if((a[1]-a[0])%3&&(a[2]-a[1])%3&&(a[2]-a[0])%3) No;
   else Yes;
}             
void solve()  //dijkstra板子题,建议b站看视频学习
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    memset(ans, 0x3f3f3f, sizeof ans);
    ans[1] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0, 1});
    while (q.size()) {
        auto [w, x] = q.top();
        q.pop();
        for (auto [dx, dy] : g[x]) {
            if (ans[x] + dy < ans[dx]) {
                ans[dx] = ans[x] + dy;
                q.push({ans[dx], dx});
            }
        }
    }
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += ans[i];
    }
    cout << sum << endl;
}
int qmi(int a, int b)  //快速幂
{
    int ans = 1;
    while (b) {
        if (b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans % mod;
}
void solve()
{      
    int x, y;
    cin >> x >> y; 
    cout << qmi(x % mod, y) << endl;  //注意x要提前取模
}
void solve() {  //线性筛
    int n,ans=0;
    cin>>n;
   std::vector<int> minp, primes; //素数表
   minp.assign(n + 1, 0);   
     primes.clear();
    
	    for (int i = 2; i <= n; i++) { //会覆盖小于n所有的素数的倍数即所有非素数
	        if (minp[i] == 0) { //是素数
	            minp[i] = i;
                
	        primes.push_back(i);
	        }
	        
	        for (auto p : primes) {
	            if (i * p > n) {
	                break;
	            }
	            minp[i * p] = p;
	            if (p == minp[i]) { 
	                break;
	            }
	        }
	    }
    for(auto i:primes) ans+=i;
        cout<<ans;
 }                               
void solve()
{
    int a, b;
    cin >> a >> b;     //若有a>b,存在gcd(a,b)=gcd(b,a-b),类似更相减损         
    cout << max(max(a, b) - min(a, b), __gcd(a, b)) << endl;
}

int tree[N];  //树状数组
void update(int x, int k)
{
    for (int i = x; i <= N - 1; i += i & -i) {
        tree[i] += k;
    }
}
int ask(int x)
{
    int ans = 0;
    for (int i = x; i >= 1; i -= i & -i) {
        ans += tree[i];
    }
    return ans;
}
void solve()   //相信了解了树状数组后这题已经无需多言
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    int ans = 0;
    for (int i = n; i >= 1; i--) {
        ans += ask(a[i] - 1);
        update(a[i], 1);
    }
    cout << ans << endl;
}
void solve()  //就是结论题
{  //c>a>b,则有
  //gcd(a,b)=gcd(b,a-b)
  //gcd(a,b,c)=gcd(b,a-b,c-a)
    int n, m;
    cin >> n >> m;
    vector<int> a(n + 1), b(m + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= m; i++) cin >> b[i];
    int sum = 0;
    for (int i = 1; i < n; i++) {
        sum = __gcd(sum, abs(a[i] - a[i + 1]));
    }
    for (int i = 1; i <= m; i++) {
        cout << __gcd(sum, a[1] + b[i]) << " ";
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务