https://ac.nowcoder.com/acm/contest/15593
A.
思路:
double分开小数和整数,然后特判小数
因为数据范围好大所以开了long double(竟然没有long long double)
code
#include <bits/stdc++.h>
using namespace std;
int main()
{
long double a;
cin>>a;
long double in = a-(long long )a;
if(in>0.5)
cout<<(long long)a+1;
else
cout<<(long long)a;
return 0;
}
E.
思路
预处理素数数组然后枚举素数下标
code:
#include <iostream>
#include <algorithm>
using namespace std;
const int N= 1000010;
int primes[N], cnt ;
bool st[N];
///O (N)
void get_primes()
{
for (int i = 2; i <= N; i ++ )
{
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= N / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
///
char s[N];
int sc[N];
int main()
{
get_primes();
string s;
cin>>s;
string ans;
ans="1";
ans+=s;
int len =ans.size();
// for(int i=1;i<=100;i++)
//cout<<primes[i]<<" ";
sc[ans[1] - 'A']++;
for(int i = 1;; i++)
{
int j = primes[i];
if(j>=len)
break;
if(ans[j]=='C'||ans[j]=='S'||ans[j]=='U')
sc[ans[j]-'A']++;
// cout<<j<<" "<<len<<endl;
}
if(sc['C'-'A']>=2&&sc['S'-'A']>=1&&sc['U'-'A']>=1)
cout<<"Yes";
else
cout<<"No";
return 0;
}
I题.
队友做的
J题
异或和模板题
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int maxn = 4e5 + 10, mod = 1e9 + 7, inf = 0x3f3f3f3f;
int head[maxn], _cnt;
struct
{
int to, next;
} edge[maxn<<1];
void add(int x, int y)
{
edge[++_cnt] = {y, head[x]};
head[x] = _cnt;
}
int depth[maxn], father[maxn][22], lg[maxn];
void dfs1(int x, int fa)
{
depth[x] = depth[fa] + 1;
father[x][0] = fa;
for (int i = 1; (1 << i) <= depth[x]; i++)
father[x][i] = father[father[x][i - 1]][i - 1];
for (int i = head[x]; i; i = edge[i].next)
{
if (edge[i].to != fa)
{
dfs1(edge[i].to, x);
}
}
}
int lca(int x, int y)
{
if (depth[x] < depth[y]) swap(x, y);
while (depth[x] > depth[y])
x = father[x][lg[depth[x] - depth[y]] - 1];
if (x == y) return x;
for (int k = lg[depth[x]] - 1; k >= 0; k--)
if (father[x][k] != father[y][k])
x = father[x][k], y = father[y][k];
return father[x][0];
}
int a[maxn], n, ans[maxn], ed[maxn], tree[maxn*10][5], cnt = 1;
void dfs(int x, int fa)
{
ans[x] = ans[fa] ^ a[x];
for(int i = head[x]; i; i = edge[i].next)
{
int to = edge[i].to;
if(to == fa) continue;
dfs(to, x);
}
}
void insert(int x, int now)
{
int p = 1;
// cout << x << endl;
for(int i = 24; i >= 0; i--)
{
int now = (x >> i) & 1;
// cout << now;
// cout << i << ' ' << now << endl;
if(tree[p][now] == 0)
tree[p][now] = ++cnt;
p = tree[p][now];
}
ed[p] = now;
// cout << endl;
}
int find(int x, int now)
{
int res = 0;
int p = 1;
for(int i = 24; i >= 0; i--)
{
int now = (x >> i) & 1;
if(tree[p][now^1])
{
res += 1 << i;
p = tree[p][now^1];
}
else
p = tree[p][now];
}
return res ^ a[lca(now, ed[p])];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
for(int i = 1; i <= n-1; i++)
{
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
dfs(1, 0);
dfs1(1, 0);
for(int i = 1; i <= n; i++)
insert(ans[i], i);
int ans1 = 0;
for(int i = 1; i <= n; i++)
ans1 = max(ans1, find(ans[i], i));
cout << ans1 << endl;
return 0;
}