A
Solved: 01:19 (BPM136)
状态只有NM种,bfs即可
#include <bits/stdc++.h>
using namespace std;
struct node {
int r;
string s;
int sum;
};
bool vis[505][5005];
int d, s;
int main() {
cin >> d >> s;
queue<node> Q;
Q.push(node{0, "", 0});
vis[0][0] = 1;
while (Q.empty() == 0) {
node now = Q.front();
Q.pop();
for (int i = 0; i < 10; ++i) {
int nr = now.r * 10 + i;
nr %= d;
int ns = now.sum + i;
if (ns > s || vis[nr][ns])
continue;
Q.push(node{nr, now.s + char(i + '0'), ns});
vis[nr][ns] = 1;
if (vis[0][s]) {
cout << now.s + char(i + '0') << '\n';
return 0;
}
}
}
puts("-1");
}
close
B
UnSolved
C
Solved: 02:09(HOOCCOOH)
#include <iostream>
#include <functional>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cinttypes>
#include <iterator>
struct Event {
int price, cnt;
};
struct SegT {
int s, price;
int64_t cnt, sum;
SegT *l, *r;
void up() {
cnt = l->cnt + r->cnt;
sum = l->sum + r->sum;
}
void app(int dt) {
cnt += dt;
sum += (int64_t)price * dt;
}
};
std::deque<SegT> buf;
SegT *make(int l, int r) {
buf.push_back(SegT { r - l, l, 0, 0, nullptr, nullptr });
auto c = &buf.back();
if(r - l > 1) {
int m = l + (r - l) / 2;
c->l = make(l, m);
c->r = make(m, r);
}
return c;
}
void add(SegT *c, int pos, int64_t dt) {
if(c->s == 1)
return c->app(dt);
int m = c->s / 2;
if(pos < m) add(c->l, pos, dt);
else add(c->r, pos - m, dt);
c->up();
}
int64_t select(SegT *c, int64_t cnt) {
if(c->s == 1)
return std::min(c->cnt, cnt) * c->price;
if(cnt <= c->l->cnt)
return select(c->l, cnt);
else
return c->l->sum + select(c->r, cnt - c->l->cnt);
}
class DualHeap {
int k;
SegT *rt;
public:
DualHeap(int mxp, int k): k(k), rt(make(0, mxp + 1)) {}
~DualHeap() {}
void add(Event evt) {
::add(rt, evt.price, evt.cnt);
}
int64_t get_sum() {
return ::select(rt, k);
}
};
int main() {
std::ios::sync_with_stdio(false);
int n, k, m;
std::cin >> n >> k >> m;
auto days = std::vector<std::vector<Event>>(n);
int maxp = 0;
for(int i = 0; i < m; ++i) {
int l, r, cnt, price;
std::cin >> l >> r >> cnt >> price;
maxp = std::max(maxp, price);
days[l - 1].push_back(Event { price, cnt });
if(r < n)
days[r].push_back(Event { price, -cnt });
}
int64_t ans = 0;
int64_t cur_sum = 0, cur_cnt = 0;
auto q = DualHeap(maxp, k);
for(auto &day: days) {
for(auto &evt: day)
q.add(evt);
ans += q.get_sum();
}
std::cout << ans << std::endl;
return 0;
}
D
Solved: 00:10(zkp)
温暖签到
#include<iostream>
using namespace std;
long long a[200010];
int main()
{
long long n,m,now=0,ans=0;
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
now=a[0];
ans+=now/m;
now%=m;
for(int i=1;i<n;i++)
{
if(now!=0&&now+a[i]<m)now=0,ans++;
else
{
now+=a[i];
ans+=now/m;
now%=m;
}
}
if(now!=0)ans++;
cout<<ans<<endl;
return 0;
}
E
Solved: 03:58(BPM136)
事后听人说直接二分d就好了?
好像是的啊
然而我那时候觉得好像三分又觉得不能三分,更别说二分了
所以直接枚举d,然后线段树二分套线段树二分了XD
然而被卡不能输出0 0了就卡自闭了XD
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int const N = 2e5 + 5;
ll sump[N << 2];
ll sumn[N << 2];
struct node {
int pos;
ll p;
};
int n, m;
ll t;
void pushup(int k) {
sump[k] = sump[k << 1] + sump[k << 1 | 1];
sumn[k] = sumn[k << 1] + sumn[k << 1 | 1];
}
void SegAdd(int k, int l, int r, int pos, ll p) {
if (l == r) {
sump[k] += p;
sumn[k]++;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
SegAdd(k << 1, l, mid, pos, p);
else
SegAdd(k << 1 | 1, mid + 1, r, pos, p);
pushup(k);
}
pair<ll, ll> SegEventSum(int k, int l, int r, int _l, int _r) {
if (l == _l && r == _r)
return make_pair(sump[k], sumn[k]);
int mid = (l + r) >> 1;
if (_r <= mid)
return SegEventSum(k << 1, l, mid, _l, _r);
if (_l > mid)
return SegEventSum(k << 1 | 1, mid + 1, r, _l, _r);
auto retz = SegEventSum(k << 1, l, mid, _l, mid);
auto retr = SegEventSum(k << 1 | 1, mid + 1, r, mid + 1, _r);
return make_pair(retz.first + retr.first, retz.second + retr.second);
}
ll SegEFByNum(int k, int l, int r, ll sumnum) {
if (l == r) {
if (sumn[k] > sumnum)
return 0;
else
return sump[k];
}
int mid = (l + r) / 2;
if (sumn[k << 1] < sumnum)
return sump[k << 1] + SegEFByNum(k << 1 | 1, mid + 1, r, sumnum - sumn[k << 1]);
else
return SegEFByNum(k << 1, l, mid, sumnum);
}
ll GetTimeOnPos(ll pos) {
auto sumEvent = SegEventSum(1, 1, n, 1, pos);
ll haveBreak = (sumEvent.second - 1) / m * m;
// cerr << "To Pos " << pos << " : " << sumEvent.first << ' ' << sumEvent.second << ' ' << haveBreak << '\n';
ll sum = SegEFByNum(1, 1, n, haveBreak);
return sum * 2 + (sumEvent.first - sum);
}
ll SegEF(int k, int l, int r) {
if (l == r) {
if (GetTimeOnPos(l) <= t)
return sumn[k];
else
return 0;
}
int mid = (l + r) >> 1;
ll ti = GetTimeOnPos(mid);
if (ti < t)
return sumn[k << 1] + SegEF(k << 1 | 1, mid + 1, r);
else
return SegEF(k << 1, l, mid);
}
int main() {
ios::sync_with_stdio(0);
int T;
cin >> T;
while (T--) {
cin >> n >> m >> t;
auto a = vector<node>(n);
for (int i = 0; i < n; ++i) {
cin >> a[i].p;
a[i].pos = i + 1;
}
sort(a.begin(), a.end(), [] (node const& x, node const& y) {
return x.p < y.p;
});
for (int i = 0; i <= n * 4; ++i)
sump[i] = sumn[i] = 0;
ll ans1 = 0, ans2 = 0;
for (int i = 0; i < n; ++i) {
auto const& ev = a[i];
SegAdd(1, 1, n, ev.pos, ev.p);
if (i == n - 1 || ev.p != a[i + 1].p) {
auto su = SegEF(1, 1, n);
// cerr << "Event : " << ev.pos << ' ' << ev.p << '\n';
// cerr << "Finish : " << su << '\n';
if (su > ans1) {
ans1 = su;
ans2 = ev.p;
}
}
}
if (ans1 == 0)
ans2 = 1;
cout << ans1 << ' ' << ans2 << '\n';
// cerr << ans1 << ' ' << ans2 << '\n';
}
return 0;
}
F
Solved:00:26 (zkp)
#include<iostream>
#include<queue>
using namespace std;
string s[400010];
int a[400010];
priority_queue<long long>x,y,z;
int main()
{
int n,t=0;
long long ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i]>>a[i];
if(s[i]=="11")t++,ans+=a[i];
if(s[i]=="10")x.push(a[i]);
if(s[i]=="01")y.push(a[i]);
if(s[i]=="00")z.push(a[i]);
}
while(!x.empty()&&!y.empty())
{
ans+=x.top()+y.top();
x.pop();y.pop();
}
while(t--)
{
if(x.empty())x.push(0);
if(y.empty())y.push(0);
if(z.empty())z.push(0);
if(x.top()>=y.top()&&x.top()>=z.top())
{
ans+=x.top();
x.pop();
}
else if(y.top()>=x.top()&&y.top()>=z.top())
{
ans+=y.top();
y.pop();
}
else
{
ans+=z.top();
z.pop();
}
}
cout<<ans<<endl;
return 0;
}
G
Unsolved
H
Solved: 01:24(zkp)
dirt:我的锅,用了奇怪的写法写完后无限RE on test1,但是本地测试没问题,后果断让zkp重写了
#include <bits/stdc++.h>
using namespace std;
int a[400]={};
map<unsigned long long,pair<int,string> >mp;
using namespace std;
int main() {
ios::sync_with_stdio(0);
unsigned long long t=1;
int n,m;
for(int i='a';i<='z';i++,t++)a[i]=t;
for(int i='0';i<='9';i++,t++)a[i]=t;
for(int i='.';i<='.';i++,t++)a[i]=t;
string s;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
for(int j=0;j<s.size();j++)
{
unsigned long long now=0;
for(int k=j;k<s.size();k++)
{
now=now*t+a[s[k]];
if(mp[now].second!=s)mp[now].first++;
mp[now].second=s;
}
}
}
cin>>m;
while(m--)
{
cin>>s;
unsigned long long now=0;
for(int i=0;i<s.size();i++)now=now*t+a[s[i]];
if(mp[now].first!=0)cout<<mp[now].first<<" "<<mp[now].second<<endl;
else cout<<"0 -"<<endl;
}
return 0;
}
I
Unsolved
J
Unsolved(-5)
只有一种字母会同时在左右两边
枚举这个字母,然后背包一下
K
Solved: 00:07(BPM136)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
auto a = vector<int>();
long long sum = 0;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
a.push_back(x);
sum += x;
}
if (sum % m)
puts("No");
else {
int fen = sum / m;
sum = 0;
bool can = 1;
auto ans = vector<int>();
int num = 0;
for (int i = 0; i < n; ++i) {
sum += a[i];
++num;
if (sum > fen) {
can = 0;
break;
}
if (sum == fen) {
ans.push_back(num);
sum = 0;
num = 0;
continue;
}
}
if (can) {
puts("Yes");
for (auto& v : ans)
cout << v << ' ';
cout << '\n';
} else
puts("No");
}
return 0;
}
L
Unsolved
M
Unsolved
800

被折叠的 条评论
为什么被折叠?



