NEERC Southern Subregional 2012
NEERC Southern Subregional 2012
Problem B. Chess Championship
题目描述:有两个序列\(a, b\),两个序列都有\(n\)个数,并且这\(2n\)个数两两不同,现在要将这两个序列里的数两两配对,组成\(n\)个数对,要求数对中\(a\)的数比\(b\)的数大的数对个数要比其它的多\(m\)个。问方案数。
solution
将这\(2n\)个数从小到大排,预处理出前\(i\)个数中\(a, b\)的个数\(suma, sumb\), \(f[i][j][k]\)表示前\(i\)个数,匹配了\(j\)对\(a>b\)的数对,还有\(k\)个\(a\)未匹配。
如果第\(i\)个数是\(a\)的数:
- 与前面的一个还没有匹配的\(b\)匹配,\(f[i+1][j+1][k]+=f[i][j][k]*(sumb[i-1]-suma[i-1]+k)\)
- 留着让后面的\(b\)匹配,\(f[i+1][j][k+1]+=f[i][j][k]\)
如果第\(i\)个数是\(b\)的数: - 与前面一个还没有匹配的\(a\)匹配,\(f[i+1][j][k-1]+=f[i][j][k]*k\)
- 留着让后面的\(a\)匹配,\(f[i+1][j][k]+=f[i][j][k]\)
答案就是\(f[2*n+1][0][0]\),因为空间不够,所有要有滚动数组,而且卡常,所以要控制好枚举的范围。
时间复杂度:\(O(n^3)\)
Problem E. Dragons and Princesses
题目描述:有\(n\)个格子,每个格子上有一条龙或一个公主,每条龙守着一定数量的金币,现在要从第一个格子出发,遇到龙时可以选择跳过,也可以选择杀死龙并拿走金币,如果遇到公主,假如杀龙的数量大于等于公主的要求,那么就要娶这个公主,已知最后一个格子是一个公主,并且娶且只娶最后一个公主,问最多能拿多少金币,输出方案。
solution
首先从后往前,算出到达每个格子时最多能杀多少条龙,然后用一个堆维护最大的那几条龙即可。
时间复杂度:\(O(nlogn)\)
Problem F. Dumbbells
题目描述:有\(n\)个球,每个球的重量为\(w_i\),价值为\(c_i\),现在要取尽量多的集合,每个集合必须要有\(k\)个球,并且\(k\)个球的重量不同,而且每个集合的重量集合必须相同。问在最多能构成多少个集合,并且最大价值为多少。
solution
统计每种重量的球有多少,从大到小排序,然后取前\(k\)种重量,对应的集合数为第\(k\)中重量的球的个数\(s\),然后算出球数大于等于\(s\)的重量中每种重量的最贵的\(s\)个球的总价值,然后取价值最大的\(k\)中重量。
时间复杂度:\(O(nlogn)\)
Problem G. Database optimization
题目描述:有\(n\)个物品,每个物品有不超过\(4\)种性质,有\(m\)个询问,每次询问拥有某些性质的物品有多少。
solution
性质的集合不超过\(n*2^4\)种,预处理出这些集合各有多少个物品拥有即可,用一个\(map\)就好了。
时间复杂度:\(O(2^4n+m)\)
Problem H. Sultan's Pearls
题目描述:有一串珠子放在桌上,一共有\(n\)个珠子,其中有\(m\)个悬在桌边,每个珠子有重量和价值,现在一次可以从两边取一个珠子(桌上或悬挂),如果取的是悬挂的珠子,则要从桌上移一个珠子使悬挂的珠子总数不变,当悬挂的珠子的总重量大于桌上的珠子的总重量乘\(k\)时,珠子会掉下来,问在保证珠子不掉下来的情况下,能拿走的最大总价值,输出方案。
solution
方案显然是先拿走悬挂的,然后再拿在桌上的。所以可以枚举最终悬挂的珠子的最下面一个是哪个,然后二分出桌面上最多能拿走多少个珠子,然后贪心地拿就好。
时间复杂度:\(O(nlogn)\)
Problem J. Ternary Password
题目描述:有一个只有\(0, 1, 2\)的字符串,现在可以修改某些位置的字符,使得最终有\(a\)个\(0\),\(b\)个\(1\),问最少需要修改多少个字符,并且输出修改后的字符串。
solution
贪心。
时间复杂度:\(O(n)\)
Problem K. Tree Queries Online
题目描述:给定一棵树,树有边权,不断地删掉一条边,输出删掉的边的权值\(val\),取出分开的两棵树中点数较少的树(如果相同则取最小编号的点所在的树),这棵树的边权乘\(val\),另一棵树的边权加\(val\)。强制在线。
solution
启发式拆树,拆的时候同时扩展两棵树,有一棵树搜完就停下,然后把这棵树的边权暴力更新,新建一个集合存这些点,旧的集合存另外一棵树,在旧集合打上边权增量标记。
时间复杂度:\(O(nlogn)\)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=99990001;
const int maxn=int(2e5)+100;
struct LINK
{
int id, pre, next;
};
int n, now;
int h[maxn], nx[maxn];
LINK t[maxn*2];
int block[maxn];
int blockcnt;
LL ans[maxn], mark[maxn];
queue<int> q[2];
int edge[2][maxn];
bool vis[maxn];
void join(int u, int v)
{
t[now].id=v; t[now].next=h[u]; t[now].pre=-1; if (h[u]!=-1) t[h[u]].pre=now; h[u]=now++;
t[now].id=u; t[now].next=h[v]; t[now].pre=-1; if (h[v]!=-1) t[h[v]].pre=now; h[v]=now++;
}
void read()
{
scanf("%d", &n);
for (int i=1; i<=n; ++i) h[i]=-1;
for (int i=1; i<n; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
join(u, v);
ans[i]=w;
}
}
void bfs(int u, int v, int blockidx, LL w)
{
int minidx[2]={u, v};
edge[0][0]=edge[1][0]=0;
nx[u]=h[u]; nx[v]=h[v];
while (!q[0].empty()) q[0].pop();
while (!q[1].empty()) q[1].pop();
q[0].push(u); q[1].push(v);
while (!q[0].empty() && !q[1].empty())
{
for (int j=0; j<2; ++j)
{
int cur=q[j].front();
bool flag=false;
for (int i=nx[cur]; i>-1; i=nx[cur]=t[i].next)
if (!vis[i/2+1])
{
flag=true;
minidx[j]=min(minidx[j], t[i].id);
q[j].push(t[i].id);
edge[j][++edge[j][0]]=i/2+1;
nx[t[i].id]=h[t[i].id];
vis[i/2+1]=true;
nx[cur]=t[i].next;
break;
}
if (!flag) q[j].pop();
}
}
int idx=0;
if ((!q[0].empty() && q[1].empty()) || (q[0].empty() && q[1].empty() && minidx[1]<minidx[0])) idx=1;
++blockcnt;
for (int i=1; i<=edge[idx][0]; ++i)
{
ans[edge[idx][i]]=(ans[edge[idx][i]]+mark[blockidx])*w%mod;
block[edge[idx][i]]=blockcnt;
}
mark[blockidx]=(mark[blockidx]+w)%mod;
for (int j=0; j<2; ++j)
for (int i=1; i<=edge[j][0]; ++i) vis[edge[j][i]]=false;
}
void edge_del(int idx)
{
for (int cur=idx*2-2; cur<idx*2; ++cur)
{
if (t[cur].pre!=-1) t[t[cur].pre].next=t[cur].next;
else h[t[cur^1].id]=t[cur].next;
if (t[cur].next!=-1) t[t[cur].next].pre=t[cur].pre;
}
}
void solve()
{
blockcnt=1;
for (int i=1; i<n; ++i) block[i]=1;
for (int i=1; i<n; ++i)
{
int idx;
scanf("%d", &idx);
printf("%lld\n", (ans[idx]=(ans[idx]+mark[block[idx]])%mod));
fflush(stdout);
edge_del(idx);
bfs(t[(idx-1)*2].id, t[idx*2-1].id, block[idx], ans[idx]);
}
}
int main()
{
read();
solve();
return 0;
}
Problem L. Preparing Problem
solution
仔细算一下就好了。
时间复杂度:\(O(1)\)
NEERC Southern Subregional 2012的更多相关文章
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest
目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...
- NEERC Southern Subregional 2011
NEERC Southern Subregional 2011 A - Bonnie and Clyde solution 双指针搞搞就好. 时间复杂度:\(O(n)\) B - Building F ...
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage
2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage A. Union of Doubly Link ...
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest A E F G H I K M
// 深夜补水题,清早(雾)写水文 A. Automatic Door 题意 \(n(n\leq 1e9)\)个\(employee\)和\(m(m\leq 1e5)\)个\(client\)要进门, ...
- Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest
2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...
- 模拟赛小结:2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest
2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest 2019年10月11日 15:30-20:30(Solved 6,Penalty 740 ...
- 2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage(11/12)
2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage A. Coffee Break 排序之后优先队 ...
- 2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest 题解(PART)(9/13)
$$2014-2015\ ACM-ICPC,\ NEERC,\ Southern\ Subregional\ Contest$$ A Nasta Rabbara B Colored Blankets ...
随机推荐
- 作业四 任务分解(WBS)
近日忙于实验,未来得及完成任务分解昨晚召开了紧急会议,才确定了任务划分.主体分配如下:三名编程人员,一个主编两个辅编,一人做需求分析,一人做程序测试,一人专司文档. 具体细节如下:在剩余的三周左右的时 ...
- spring mvc自定义注解--访问时验证
作用:在访问controller的方法时,判断用户是否是登陆状态. step1:定义注解 import java.lang.annotation.ElementType; import java.la ...
- A+B Format 思路及解题过程结果
A+B Format 思路及解题过程结果 github链接 题目 解题思路 这个题目的难点在于每三位用逗号隔开,以及带不带负号的问题.第一个问题,我的解决办法是先通过取整来取数,再通过取余来去数.第二 ...
- 《Toward an SDN-Enabled Big Data Platform for Social TV Analysis》--2015--Han Hu
<面向应用于社会TV分析的应用了SDN的大数据平台> Abstract social TV analytics 是什么,就是说很多TV观众在微博.微信和推特等这些地方分享他们的观感时,然后 ...
- final版本发布评价II
其实我对技术上的问题了解不多,所以有些评语可能说的不对或者压根就没啥用.可直接忽略.请见谅. 1新蜂的俄罗斯方块,UI设计虽然给出了背景和颜色,但是感觉色彩对比也不好,模块之间也不协调.没有更多的说服 ...
- poj 2406 Power Strings(kmp应用)
题目链接:http://poj.org/problem?id=2406 题意:给出一个字符串s,求重复子串出现的最大次数. 分析:kmp的next[]数组的应用. 要求重复子串出现的最大次数,其实就是 ...
- Java之扫描目录,修改文件内容
扫描目录下文件,修改文件中指定内容 package org.utils.tools.fileoper; import java.io.*; import java.util.ArrayList; im ...
- 通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态. 在 System.ServiceModel.Channels. ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
- MySQL服务器最大连接数的合理设置
MySQL服务器的连接数并不是要达到最大的100%为好,还是要具体问题具体分析,下面就对MySQL服务器最大连接数的合理设置进行了详尽的分析,供您参考. 我们经常会遇见“MySQL: ERROR 10 ...