1月13日

1月13日

一场div2

Problem - A - Codeforces

Problem - B - Codeforces

Problem - C - Codeforces

下午

Bi-shoe and Phi-shoe - LightOJ 1370 - Virtual Judge

数论基础,

刚开始,想着用欧拉函数,然后再反映射一下,但是推了一下发现没必要,只要找大于这个数的最小的质数即可,

所以预处理:先筛出质数,再用二分找出大于每个数的最小质数,查询就O(1)

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=1000003,M=5e5+10,inf=1e16,mod=1e8;
int a[N];
int ans[N+10];
int vis[N];  //划掉合数
int prim[N]; //记录质数
int cnt; //质数个数

void get_prim(int n) { //欧拉筛法-----O(N)
    vis[1]=1;
    for (int i = 2; i <= n; i++) {//越界中断
        if (!vis[i]) prim[++cnt] = i;
        for (int j = 1; i * prim[j] <= n; j++) {//乘以已经记录的数,越界中断,开筛
            vis[i * prim[j]] = 1;
            if (i % prim[j] == 0) break;//整除中断,保证被最小的质因子prim[j]划掉
        }
    }
}

int tt;
void solve() {
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        sum+=ans[a[i]];
    }
    cout<<"Case "<<++tt<<": ";
    cout<<sum;
    cout<<" Xukha"<<endl;
}

signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T=1e6;
    get_prim(N);
    for(int i=1;i<=T;i++){
        int l=0,r=cnt+1;
        while(l+1<r){
            int mid=l+r>>1;
            if(prim[mid]>i) r=mid;
            else l=mid;
        }
        ans[i]=prim[r];
    }
//    for(int i=1;i<=T;i++) cout<<ans[i]<<endl;
//    cout<<ans[T]<<endl;
    int _;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

Network - POJ 3694 - Virtual Judge

poj交不上去,所以这题没交,就不放代码了

思路:由于查询只有1000,n+m为2e6,时间五秒,所以发现是个大傻逼题,看着这么难,其实可以查询时tarjan,就是初始化数组有点烦。

最后做了一道水题

Caocao's Bridges - HDU 4738 - Virtual Judge

但是bri数组没有初始化,还花了点时间

#include <iostream>
#include<stack>
#include<vector>
#include <cstring>
#define int long long
#define endl '\n'
using namespace std;
//typedef unsigned __int128 LL;
const int N=1003,M=2e6+10,inf=1e16,mod=1e8;
struct node{
    int to,w,last;
}e[M];
int h[N],idx=0;
void add(int u,int v,int w){
    e[idx].to=v;
    e[idx].last=h[u];
    e[idx].w=w;
    h[u]=idx++;
}
int dfn[N],low[N],tot,ans;
int bri[M];
int n,m;
void init(){
    tot=0;
    ans=1e16;
    for(int i=1;i<=n;i++){
        dfn[i]=low[i]=0;
    }
    for(int i=0;i<M;i++){
        bri[i]=0;
    }
}
void tarjan(int x,int edg) {
    dfn[x] = low[x] = ++tot;
    for (int i = h[x]; ~i; i = e[i].last) {
        int y = e[i].to;
        if (!dfn[y]) {
            tarjan(y, i);
            low[x] = min(low[y], low[x]);
            if (low[y] > dfn[x]) {//割边
                bri[i]=bri[i^1]=1;
            }
        } else if (i != (edg ^ 1)) {
            low[x] = min(dfn[y], low[x]);
        }
    }
}

void solve() {
    while(cin>>n>>m){
        if(n==0&&m==0) break;
        memset(h,-1,sizeof h);
        idx=0;
        init();
        for(int i=1;i<=m;i++){
            int u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
            add(v,u,w);
        }
        int cnt=0;
        for(int i=1;i<=n;i++) {
            if (!dfn[i]) {
                cnt++;
                tarjan(i, 0);
            }
        }
        for(int i=0;i<idx;i+=2){
            if(bri[i]) ans=min(ans,e[i].w);
        }
        if(cnt!=1) {
            cout << 0 << endl;
        }
        else {
            if (ans == 1e16) cout << -1 << endl;
            else if (ans == 0) cout << 1 << endl;
            else cout << ans << endl;
        }
    }
}

signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int _;
//    cin >> _;
//    while (_--)
        solve();
    return 0;
}

posted @ 2025-01-14 10:33  _LXYYYY  阅读(12)  评论(0)    收藏  举报