A. Find a Number

Solved By 2017212212083

题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$

思路:

定义一个二元组$<d, s>$ 表示当前状态模d的值,以及每一位加起来的值

跑最短路,从$<0, 0>  跑到 <0, s>$

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn = 1e5 + ;
const int INF = 0x3f3f3f3f;
#define N 510
#define M 5010 int d, s, cnt;
char ans[maxn];
int dis[N][M];
int inq[N][M];
int vis[N][M]; struct node{
int remind;
int sum;
node(){}
node(int remind, int sum) :remind(remind), sum(sum){}
}; void Init()
{
cnt = -;
memset(inq, , sizeof inq);
memset(dis, 0x3f, sizeof dis);
memset(vis, , sizeof vis);
} void BFS()
{
queue<node>q;
dis[][] = ;
q.push(node(, ));
inq[][] = ;
while(!q.empty())
{
node st = q.front();
q.pop();
inq[st.remind][st.sum] = ;
for(int i = ; i < ; ++i)
{
node now = node((st.remind * + i) % d, st.sum + i);
if(now.sum > s) break;
if(dis[now.remind][now.sum] > dis[st.remind][st.sum] + )
{
dis[now.remind][now.sum] = dis[st.remind][st.sum] + ;
if(!inq[now.remind][now.sum])
{
inq[now.remind][now.sum] = ;
q.push(now);
}
}
}
}
} int DFS(int D,int S)
{
if(D == && S == s) return ;
for(int i = ; i < ; ++i)
{
int td = (D * + i) % d;
int ts = S + i;
if(ts > s) break;
if(vis[td][ts]) continue;
if(dis[D][S] + != dis[td][ts]) continue;
ans[++cnt] = i;
if(DFS(td, ts)) return ;
--cnt;
}
vis[D][S] = ;
return ;
} int main()
{
while(~scanf("%d %d", &d, &s))
{
Init();
BFS();
if(dis[][s] == INF)
{
puts("-1");
continue;
}
DFS(, );
for(int i = ; i <= cnt; ++i) printf("%d", ans[i]);
puts("");
}
return ;
}

B. Berkomnadzor

Unsolved.

C. Cloud Computing

Solved By Dup4

题意:

有一个人需要租用服务器,一共需要n天,每天要k个,供应商会提供一些供应方案,用四元组$<l, r, c, p>$ 表示方案。

$l r  表示 供应的区间, c 表示l, r 区间内每天最多供应c个,p 表示每个服务器的价格$

思路:

考虑用线段树维护 两个值 Min 和 cnt  分别表示区间内最少的服务器需要个数以及区间内还需要购买服务器的天数

对于供应方案,按价格排序之后,从小到大枚举,对于每个方案的$l, r$

如果这个区间内所有还需要购买服务器的天中的 需要购买服务器的数量的最小值都 $> c$ 那么直接区间减即可。

否则 先丢出不符合的,改为INF 再丢进去,标记为不再需要购买服务器,并加上贡献,每个点最多丢出一次。

时间复杂度 $O(mlog^n + nlog^n)$

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define INF 0x3f3f3f3f
#define N 1000010
int n, k, m;
struct qnode
{
int l, r, c, p;
qnode () {}
qnode (int l, int r, int c, int p) : l(l), r(r), c(c), p(p) {}
void scan() { scanf("%d%d%d%d", &l, &r, &c, &p); }
bool operator < (const qnode &r) const { return p < r.p; }
}que[N]; struct SEG
{
int lazy[N << ], Min[N << ], pos[N << ], cnt[N << ];
struct node
{
int lazy, Min, pos, cnt;
node () {}
node (int lazy, int Min, int pos, int cnt) : lazy(lazy), Min(Min), pos(pos), cnt(cnt) {}
void init() { lazy = ; Min = INF; pos = ; cnt = ; }
node operator + (const node &r) const
{
node res = node(, INF, , );
res.cnt = cnt + r.cnt;
if (Min < r.Min)
{
res.Min = Min;
res.pos = pos;
}
else
{
res.Min = r.Min;
res.pos = r.pos;
}
return res;
}
}a[N << ], res;
void build(int id, int l, int r)
{
a[id] = node(, INF, , );
if (l == r)
{
a[id] = node(, k, l, );
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
a[id] = a[id << ] + a[id << | ];
}
void change(int id, int lazy)
{
a[id].lazy += lazy;
a[id].Min += lazy;
}
void pushdown(int id)
{
if (!a[id].lazy) return;
change(id << , a[id].lazy);
change(id << | , a[id].lazy);
a[id].lazy = ;
}
void update(int id, int l, int r, int ql, int qr, int val)
{
if (l >= ql && r <= qr)
{
a[id].Min += val;
a[id].lazy += val;
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (ql <= mid) update(id << , l, mid, ql, qr, val);
if (qr > mid) update(id << | , mid + , r, ql, qr, val);
a[id] = a[id << ] + a[id << | ];
}
void update(int id, int l, int r, int pos)
{
if (l == r)
{
a[id].Min = INF;
a[id].cnt = ;
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (pos <= mid) update(id << , l, mid, pos);
else update(id << | , mid + , r, pos);
a[id] = a[id << ] + a[id << | ];
}
void query(int id, int l, int r, int ql, int qr)
{
if (l >= ql && r <= qr)
{
res = res + a[id];
return;
}
pushdown(id);
int mid = (l + r) >> ;
if (ql <= mid) query(id << , l, mid, ql, qr);
if (qr > mid) query(id << | , mid + , r, ql, qr);
a[id] = a[id << ] + a[id << | ];
}
}seg; int main()
{
while (scanf("%d%d%d", &n, &k, &m) != EOF)
{
for (int i = ; i <= m; ++i) que[i].scan();
sort(que + , que + + m);
seg.build(, , n);
ll res = ;
for (int i = , l, r, c, p; i <= m; ++i)
{
l = que[i].l, r = que[i].r, c = que[i].c, p = que[i].p;
while ()
{
seg.res.init();
seg.query(, , n, l, r);
if (seg.res.cnt == ) break;
if (seg.res.Min <= c)
{
res += (ll)p * seg.res.Min;
seg.update(, , n, seg.res.pos);
}
else
{
res += (ll)p * seg.res.cnt * c;
seg.update(, , n, l, r, -c);
break;
}
}
}
printf("%lld\n", res);
}
return ;
}

D. Garbage Disposal

水。

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 int main()
{
ll n, k;
while(~scanf("%lld %lld", &n, &k))
{
ll ans = ;
ll res = ;
for(int i = ; i <= n; ++i)
{
ll x;
scanf("%lld", &x);
if(res > )
{
res += x;
if(res >= k)
{
ans += res / k;
res %= k;
}
else
{
res = ;
ans++;
}
}
else
{
res += x;
ans += res / k;
res %= k;
}
}
if(res)
{
ans += res % k == ? res / k : res / k + ;
}
printf("%lld\n", ans);
}
return ;
}

E. Getting Deals Done

Solved By 2017212212083 & Dup4

题意:

有一个任务序列,每个任务有一个完成时间,在做任务的时候有这样一个规则,定义一个d,对于所有时间小于等于d的任务都要做,并且每做完m个,都要休息,休息时间为这m个任务的总时间,如果一个任务做不完,这个任务不算数。给出一个总时间T, n, m

以及每个任务的时间,求最大的任务数,以及d

思路:

二分任务数x, 显然我们要做的任务是排序后前x个,将d设为第x个的时间,按规则遍历看是否合法即可。

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 200010
int t, n, m; ll T;
int p[N], b[N]; bool check(int x)
{
int dd = p[x];
ll tmp = , TT = T; int cnt = , tot = ;
for (int i = ; i <= n; ++i) if (b[i] <= dd)
{
if (TT - b[i] >= )
{
++cnt; TT -= b[i];
tmp += b[i];
++tot;
}
else return tot >= x;
if (cnt == m)
{
cnt = ;
TT -= tmp;
tmp = ;
}
}
if (tot >= x)
{
return true;
}
return false;
} int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d%lld", &n, &m, &T);
for (int i = ; i <= n; ++i) scanf("%d", p + i), b[i] = p[i];
sort(p + , p + + n);
p[] = T;
int l = , r = n, res = -;
while (r - l >= )
{
int mid = (l + r) >> ;
if (check(mid))
{
res = mid;
l = mid + ;
}
else
r = mid - ;
}
printf("%d %d\n", res, p[res]);
}
return ;
}

F. Debate

水。

 #include <bits/stdc++.h>
using namespace std; #define N 400010
int n, a[N], cnt[];
priority_queue <int> pq[]; void init()
{
memset(cnt, , sizeof cnt);
for (int i = ; i < ; ++i) while (!pq[i].empty()) pq[i].pop();
} int main()
{
while (scanf("%d", &n) != EOF)
{
init(); int res = ;
for (int i = , x; i <= n; ++i)
{
scanf("%02d%d", &x, a + i);
if (x == ) x = ;
else if (x == ) x = ;
++cnt[x];
if (x == ) res += a[i];
else pq[x].push(a[i]);
}
int limit = min(cnt[], cnt[]);
for (int i = ; i <= ; ++i) for (int j = ; j < limit; ++j)
{
res += pq[i].top(); pq[i].pop();
}
for (int i = ; i <= ; ++i) while (!pq[i].empty())
{
pq[].push(pq[i].top()); pq[i].pop();
}
limit = min(cnt[], (int)pq[].size());
for (int i = ; i < limit; ++i)
{
res += pq[].top(); pq[].pop();
}
printf("%d\n", res);
}
return ;
}

G. Monsters and Potions

Unsolved.

H. BerOS File Suggestion

水。

 #include<bits/stdc++.h>

 using namespace std;

 map<string, int>mp1;
map<string, string>mp2; int n, q;
string s; int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
while(cin >> n)
{
mp1.clear();
mp2.clear();
for(int i = ; i <= n; ++i)
{
cin >> s;
int len = s.length();
set<string>st;
for(int i = ; i < len; ++i)
{
string tmp = "";
for(int j = i; j < len; ++j)
{
tmp += s[j];
st.insert(tmp);
}
}
for(auto it : st)
{
mp1[it]++;
mp2[it] = s;
}
}
cin >> q;
while(q--)
{
cin >> s;
cout << mp1[s] << " ";
if(mp1[s])
{
cout << mp2[s] << "\n";
}
else
{
cout << "-\n";
}
}
}
return ;
}

I. Privatization of Roads in Berland

Unsolved.

J. Streets and Avenues in Berhattan

Unsolved.

K. Video Posts

水。

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn = 1e5 + ;

 int n, k;
int arr[maxn];
int sum; void solve()
{
if(sum % k)
{
puts("No");
return ;
}
vector<int>vec;
int res = ;
int st = ;
for(int i = ; i <= n; ++i)
{
res += arr[i];
if(res > sum / k)
{
puts("No");
return ;
}
else if(res == sum / k)
{
vec.push_back(i - st);
st = i;
res = ;
}
}
puts("Yes");
for(int i = , len = vec.size(); i < len; ++i)
{
printf("%d%c", vec[i], " \n"[i == len - ]);
}
} int main()
{
while(~scanf("%d %d", &n ,&k))
{
sum = ;
for(int i = ; i <= n; ++i)
{
scanf("%d", arr + i);
sum += arr[i];
}
solve();
}
return ;
}

L. Odd Federalization

Unsolved.

M. Algoland and Berland

Unsolved.

2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution的更多相关文章

  1. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  2. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...

  3. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  4. Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结

    第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...

  5. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  6. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  7. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  8. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

  9. 【*2000】【2018-2019 ICPC, NEERC, Southern Subregional Contest C 】Cloud Computing

    [链接] 我是链接,点我呀:) [题意] [题解] 我们可以很容易知道区间的每个位置有哪些安排可以用. 显然 我们优先用那些花费的钱比较少的租用cpu方案. 但一个方案可供租用的cpu有限. 我们可以 ...

随机推荐

  1. MYSQL IFNULL函数的使用

    IFNULL函数是MYSQL数据库中最重要的函数之一,下面就对该函数的使用方面进行分析,希望对您能够有所帮助. 下文对MYSQL IFNULL函数的使用进行了详细的叙述,供您参考学习,如果您在MYSQ ...

  2. Linux printf 命令

    printf 命令用来格式化输出,用法如下: [keysystem@localhost ~]$ printf "%s\n" 1 2 3 4 1 2 3 4 [keysystem@l ...

  3. 关于android定位的坐标系问题

    按照正常的思路,我们通过GPS或者基站定位等方式获取到经纬度信息后,把它放到地图上,就能够完成定位.但实际上,我们很有可能会在实际操作中发现,我们的定位出现了较大的偏移.这是因为我国出于国家安全(或者 ...

  4. openstack的glance、nova、cinder使用ceph做后端存储

    块设备与 OPENSTACK 通过 libvirt 你可以把 Ceph 块设备用于 OpenStack ,它配置了 QEMU 到 librbd 的接口. Ceph 把块设备映像条带化为对象并分布到集群 ...

  5. poj_1084 剪枝-IDA*

    题目大意 给出一个由2*S*(S+1)构成的S*S大小的火柴格.火柴可以构成1x1,2x2...SxS大小的方格.其中已经拿走了几个火柴,问最少再拿走几个火柴可以使得这些火柴无法构成任何一个方格. 题 ...

  6. 1.node.js下载

    1.下载node.js http://nodejs.cn/ 2.下载git https://git-scm.com/download/win 3.安装npm npm install npm -g 使用 ...

  7. 【BZOJ3362-3365】USACO水题四连A

    [BZOJ3362][Usaco2004 Feb]Navigation Nightmare 导航噩梦 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤ ...

  8. Android Studio 解决Fetching android sdk component information加载过久问题

    extends:http://www.cnblogs.com/sonyi/p/4154797.html 安装完成后,如果直接启动,Android Studio会去获取 android sdk 组件信息 ...

  9. Gallery 里面怎么设置ImageView的OnClick事件

    Gallery g=this.findViewById(R.id.gallery); g.setOnItemClickListener(new OnItemClickListener(){ @Over ...

  10. AVG

    AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ] SELECT MANAGER_ID,           LAST_NAME,       ...