1月13日
1月13日
一场div2
下午
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;
}

浙公网安备 33010602011771号