VP题目列表
- D.Journey to Un'Goro
- F.Kobolds and Catacombs
- G.The Witchwood
- H.The Boomsday Project
- I.Rise of Shadows
- J.Descent of Dragons
- K.Scholomance Academy
D.Journey to Un'Goro
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define tententen ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
#define int ll
const int N = 1e6 + 5;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
int cnt=0,n,limit;
ll ans;
char str[N];
void dfs(int k, int cnt0, int cnt1, int ok) {
if (cnt0 > limit || cnt1 > limit) {
return;
}
if (k == n) {
cout << str << endl;
cnt++;
if (cnt >= 100) {
exit(0);
}
return ;
}
str[k] = 'b';
dfs(k + 1, cnt0 + !ok, cnt1 + ok, ok);
ok = 1 - ok;
str[k] = 'r';
dfs(k + 1, cnt0 + !ok, cnt1 + ok, ok);
}
void solve() {
cin >> n;
ans = ((n + 1) / 2) * ((n + 2) / 2);
limit = (n + 2) / 2;
cout << ans << endl;
dfs(0, 1, 0, 0);
}
signed main() {
tententen;
int T = 1;
//cin>>T;
while (T--) {
solve();
}
return 0;
}
F.Kobolds and Catacombs
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
void solve() {
int n;
cin >> n;
vector a(n + 1), num, suf(n + 2);
for(int i = 1; i <= n; i ++) {
cin >> a[i];
num.push_back(a[i]);
}
sort(num.begin(), num.end());
num.erase(unique(num.begin(), num.end()), num.end());
for(int i = 1; i <= n; i ++) {
a[i] = lower_bound(num.begin(), num.end(), a[i]) - num.begin() + 1;
}
suf[n] = a[n];
for (int i = n - 1; i >= 1; --i) {
suf[i] = min(suf[i + 1], a[i]);
}
int ans = 0, mx = 0;
for (int i = 1; i <= n; ++i) {
mx = max(a[i], mx);
if (mx <= i && ((i + 1 <= n && suf[i + 1] >= mx) || i == n)) ans++;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}
G.The Witchwood
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
int a[N];
void solve() {
int n,k;
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>a[i];
}
sort(a+1,a+1+n);
ll ans=0;
for(int i=n;i>=n-k+1;--i){
ans+=a[i];
}
cout<<ans<<endl; }="" int="" main()="" {="" ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);="" t="1;" cin="">> t;
while (t--) {
solve();
}
}
H.The Boomsday Project
\(m(1\le m\le 10^5)\) 条使用记录
\(r(1\le r \le 10^9)\)单独骑 1 次的花费
\(n\)行输入,每行有\(1 \le d_i,k_i,c_i \le 10^9\) 第 \(i\) 种单车卡的有效期、使用次数、价格
\(m\) 行,每行有 $ 0 \le p_i \le 10^9 $, \(0 \le qi \le 3e5, ∑_{i=1}^{m} qi \le 3e5\) 表示在第\(p_i\) 天骑了 \(q_i\)次
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define int ll
#define tententen ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
const int N =3e5 + 10;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll inf = 0x3f3f3f3f;
const ll mod =1e9 + 7;..);}
ll ksm(ll a, ll b, ll m) {ll ans = 1;while (b > 0) {if (b & 1) {ans = ans * a % m;}a = a * a % m;b >>= 1;}return ans;}
int n, m;
int k[666], d[666], c[666],t[N];
int r;
ll dp[N];
struct Node{
int day,cnt;
}a[N];
bool cmp(Node x,Node y){
return x.day<y.day; }="" void="" solve()="" {="" cin="">> n >> m >> r;
for (int i = 1; i <= n; ++i) {
cin >> d[i] >> k[i] >> c[i];
}
int sum = 0, idx;
for (int i = 1; i <= m; ++i) {
cin >> a[i].day >> a[i].cnt;
}
sort(a + 1, a + 1 + m, cmp);
for (int i = 1; i <= m; ++i) {
for (int j = sum + 1; j <= sum + a[i].cnt; ++j) {
t[j] = a[i].day;
}
sum += a[i].cnt;
}
for (int i = 0; i <= sum + 1; ++i) {
dp[i] = INF;
}
dp[0] = 0;
for (int i = 1; i <= sum; ++i) {
dp[i] = min(dp[i], dp[i - 1] + r);
for (int j = 1; j <= n; ++j) {
if (i + k[j] - 1 <= sum && t[i + k[j] - 1] <= t[i] + d[j] - 1) {
idx = i + k[j] - 1;
} else {
idx = 0;
int l = i, r = min(sum, i + k[j] - 1);
while (l <= r) {
int mid = (l + r) >> 1;
if (t[mid] <= t[i] + d[j] - 1) {
l = mid + 1;
idx = mid;
} else {
r = mid - 1;
}
}
}
dp[idx] = min(dp[idx], dp[i - 1] + c[j]);
}
}
cout << dp[sum] << endl;
}
signed main() {
tententen;
int T = 1;
//cin>>T;
while (T--) {
solve();
}
return 0;
}
I.Rise of Shadows
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << '\n'
using namespace std;
typedef long long ll;
#define int ll
const int N = 1e6 + 10;
ll h, m, a;
void solve() {
cin >> h >> m >> a;
if (h * m == a * 2ll) {
cout << h * m << endl;
return;
}
ll tmp = __gcd(h - 1, h * m);
ll ans = 2ll * (a / tmp);
cout << tmp * ll( ans + 1 ) << endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0), cout.tie(0);
int t = 1;
while (t--) {
solve();
}
}
J.Descent of Dragons
转变一下思路。之前每棵树的意义是\(level = x\),那如果我们在操作时不把\([L, R]\)从旧版本拆下来,那每棵树的意义就会变成\(level\geqslant x\), 也就是说\([L, R]\)会出现在所有线段树的一段前缀上,那么就可以用二分处理询问了。
在复制的时候,$level\geqslant x+1 $ 的树上原来有的路径也要开出新点,如果按原来的路径走,会导致走到历史版本的树上去更改信息。
时间复杂度:操作\(O(log(n))\),询问\(O(log^2(n))\),所以是\(O(qlog^2(n))\)。
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;typedef pair<int,int> pii;typedef pair<ll,ll> pll;
templateinline void read(T &x){
x=0; char ch=getchar(); bool f=0;
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
if(f) x=-x;
}
template
inline void read(T &a,V&... b){read(a); read(b...);}
const int maxn = 5e5 + 100, maxm = 1e6 + 100, inf = 0x3f3f3f3f, mod = 1e9 + 7;
const ll INF = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-8;
template inline void chkmax(T &x,const T &y) {x=x>y?x:y;}
template inline void chkmin(T &x,const T &y) {x=x<y?x:y;} inline="" ll="" add(ll="" x,ll="" y){x+="y;return(x<mod)?x:x-mod;}" dec(ll="" y){x-="y;return(x<0)?x+mod:x;}" mul(ll="" y){return(x*y%mod);}="" ksm(ll="" base,ll="" b){="" res="1;while(b){if(b&1)res=res*base%mod;base=base*base%mod;b">>=1;}
return res;
}
struct Seg {
int sum, ls, rs;
} seg[maxn * 72];
int n, q, rt[maxn], vtot;
void build(int id, int l, int r) {
if (l == r) {
seg[id].sum = 1;
vtot = max(vtot, id);
return;
}
int mid = l + r >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
seg[id].ls = id << 1;
seg[id].rs = id << 1 | 1;
seg[id].sum = seg[id << 1].sum + seg[id << 1 | 1].sum;
}
int update(int id, int id2, int l, int r, int ql, int qr) {
if (!id2 || !seg[id2].sum) return 0;
if (ql == l && qr == r) { return id2;}
int x = ++vtot;
seg[x] = seg[id];
id = x;
int mid = l + r >> 1;
if (qr <= mid) seg[id].ls = update(seg[id].ls, seg[id2].ls, l, mid, ql, qr);
else if (ql > mid) seg[id].rs = update(seg[id].rs, seg[id2].rs, mid + 1, r, ql, qr);
else {
seg[id].ls = update(seg[id].ls, seg[id2].ls, l, mid, ql, mid);
seg[id].rs = update(seg[id].rs, seg[id2].rs, mid + 1, r, mid + 1, qr);
}
seg[id].sum = seg[seg[id].ls].sum + seg[seg[id].rs].sum;
return id;
}
int query(int id, int l, int r, int ql, int qr) {
if (!id || !seg[id].sum) return 0;
if (ql == l && qr == r) return seg[id].sum;
int mid = l + r >> 1;
if (qr <= mid) return query(seg[id].ls, l, mid, ql, qr);
else if (ql > mid) return query(seg[id].rs, mid + 1, r, ql, qr);
else return query(seg[id].ls, l, mid, ql, mid) + query(seg[id].rs, mid + 1, r, mid + 1, qr);
}
int main() {
ios;
cin >> n >> q;
build(1, 1, n);
rt[0] = 1;
while (q--) {
int ty, l, r;
cin >> ty >> l >> r;
if (ty == 1) {
int x;
cin >> x;
rt[x + 1] = update(rt[x + 1], rt[x], 1, n, l, r);
} else {
int L = 0, R = maxn - 1, mid;
while (L < R) {
mid = L + R + 1 >> 1;
if (query(rt[mid], 1, n, l, r)) L = mid;
else R = mid - 1;
}
cout << L << endl;
}
}
}
K.Scholomance Academy
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
struct Node {
char c;
int v;
bool operator<(const Node& p) const { return v < p.v; };
} a[1000010];
int cnt[1000010][2];
int n;
vector nums;
map<double, double=""> mp;
int main() {
ios;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].c >> a[i].v;
nums.push_back(a[i].v);
}
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(), nums.end()), nums.end());
for (int i = 1; i <= n; i++) {
a[i].v =lower_bound(nums.begin(), nums.end(), a[i].v) - nums.begin() + 1;
if (a[i].c == '+')
cnt[a[i].v][1]++;
else
cnt[a[i].v][0]++;
}
for (int i = 1; i <= 1000000; i++) {
cnt[i][0] += cnt[i - 1][0];
cnt[i][1] += cnt[i - 1][1];
}
for (int i = 1; i <= n; i++) {
int s = a[i].v;
int tp = cnt[1000000][1] - cnt[s - 1][1];
int fp = cnt[1000000][0] - cnt[s - 1][0];
int tn = cnt[s - 1][0];
int fn = cnt[s - 1][1];
double fpr = 1.0 * fp / (tn + fp), tpr = 1.0 * tp / (tp + fn);
mp[fpr] = max(mp[fpr], tpr);
}
double prex = 0, prey = 0;
double sum = 0;
for (auto [x, y] : mp) {
if( y == prey) continue;
// cout << x << " " << prex << " " << y << endl;
sum += (x - prex) * prey;
prex = x; prey = y;
}
sum += (1 - prex);
cout << fixed << setprecision(12) << sum;
}
标签:Shenyang,const,Contest,int,ll,Regional,mid,seg,id
From: https://www.cnblogs.com/tentenn/p/16851847.html