B.不可思议
题目链接:https://ac.nowcoder.com/acm/contest/6220/B
分析:可以发现对于u = i + 1, v = (s4 % i) + 1,也就是每次u都会连一个编号小于它的节点,那么我们可以直接开一个数组fa[],暴力往上爬,爬到根节点。
using LL = long long;
const int N = 100005;
const int mod = 998244353;
int fa[N];
LL update(int x, int y)
{
LL res = 0;
while (x)
{
res = res + ((y + 2 * x) ^ (y + x)) % mod;
x = fa[x];
}
return res % mod;
}
class Solution {
public:
/**
*
* @param n int整型
* @param seed1 long长整型
* @param seed2 long长整型
* @param seed3 long长整型
* @param x int整型
* @return long长整型
*/
long long work(int n, long long s1, long long s2, long long s3, int x) {
long long s4;
int u, v;
for (int i = 1; i < n; ++i)
{
s4 = (s1 + s2) % mod * s3 % mod;
u = i + 1, v = (s4 % i) + 1;
fa[u] = v;
s3 = s2;
s2 = s1;
s1 = s4;
}
LL lastans = 0;
LL ret = 0;
LL y = 0;
int z = 0;
for (int i = 1; i <= n; ++i)
{
z = update(x, y);
ret = (ret + z) % mod;
lastans = z;
x = ((x + lastans) ^ ret) % n + 1;
y = lastans;
}
return ret;
}
};
C.牛牛晾衣服
题目链接:https://ac.nowcoder.com/acm/contest/6220/C
分析:POJ原题-POJ3104,我们二分时间,对于时间t,如果一件衣服可以在自然时间内烘干,那么我们就不放进洗衣机里面。否则假设这件衣服用了t时间,那么a[i] - t * k <= mid - t,我们可以得到时间t,不等式的解为(t >= frac{a[i] - mid}{k - 1}),那么这些烘干衣服的时间只要小于总时间即可。
bool check(int x, vector<int>& a, int k)
{
int sum = 0;
for (int i = 0; i < a.size(); ++i)
{
if (a[i] > x)
sum += ceil((a[i] - x) * 1.0 / (k - 1));
}
if (sum > x) return false;
return true;
}
class Solution {
public:
/**
* 计算最少要多少时间可以把所有的衣服全烘干
* @param n int整型 n件衣服
* @param a int整型vector n件衣服所含水量数组
* @param k int整型 烘干机1分钟可以烘干的水量
* @return int整型
*/
int solve(int n, vector<int>& a, int k) {
int mx = 0;
for (int i = 0; i < a.size(); ++i)
{
mx = max(mx, a[i]);
}
int l = 1, r = mx;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid, a, k)) r = mid;
else l = mid + 1;
}
return r;
}
};