NEERC 2010, Eastern subregional contest
只能把补了的题目放这儿了,先留个坑,怕忘记。
Problem G URAL 1806 Mobile Telegraphs
题意是:给定n个电话号码,每个号码是一个长度为10的仅含'0'~'9'的字符串,每两个电话号码a,b之间能通信,需要满足一下条件之一:
1.b能通过改变a中某一个数字的值获得;
2.b能通过交换a中两个数字获得。
n个电话号码不相同,且相互通信的费用由之间的最长公共前缀长度决定。
分析:
对于一个电话号码逐位判断改变某一位的值得到哪些号码,或者交换某两个数字的得到哪些号码,由此判断该号码能与哪些号码通信,通信费用也可以很快求出。
然后就是dijkstra 或者spfa了。注意map存储LL判断的时候,前导0 可能会被忽略。
另外在spfa或dij里面进行边的转移,而不事先把边求出来可以加速过程。
#include <bits/stdc++.h>
#define esp 1e-6
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define pb push_back
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(x) (x&(-x))
#define mp(a, b) make_pair((a), (b))
#define bit(k) (1<<(k))
#define iin freopen("pow.in", "r", stdin);
#define oout freopen("pow.out", "w", stdout);
#define in freopen("solve_in.txt", "r", stdin);
#define out freopen("solve_out.txt", "w", stdout);
#define bug puts("********))))))");
#define Inout iin oout
#define inout in out #define SET(a, v) memset(a, (v), sizeof(a))
#define SORT(a) sort((a).begin(), (a).end())
#define REV(a) reverse((a).begin(), (a).end())
#define READ(a, n) {REP(i, n) cin>>(a)[i];}
#define REP(i, n) for(int i = 0; i < (n); i++)
#define VREP(i, n, base) for(int i = (n); i >= (base); i--)
#define Rep(i, base, n) for(int i = (base); i < (n); i++)
#define REPS(s, i) for(int i = 0; (s)[i]; i++)
#define pf(x) ((x)*(x))
#define mod(n) ((n))
#define Log(a, b) (log((double)b)/log((double)a))
#define Srand() srand((int)time(0))
#define random(number) (rand()%number)
#define random_range(a, b) (int)(((double)rand()/RAND_MAX)*(b-a) + a) using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<unsigned short> VI;
typedef pair<unsigned short,unsigned short> PII;
typedef vector<PII> VII;
typedef vector<PII, int> VIII;
typedef VI:: iterator IT;
typedef map<string, int> Mps;
typedef map<LL, int> Mpi;
typedef map<int, PII> Mpii;
typedef map<PII, int> Mpiii;
Mpi mps;
const int maxn = ;
const int maxm = + ; unsigned short co[maxn];
unsigned short pa[maxm];
LL a[]; LL s[maxm];
int n;
int d[maxm];
bool inq[maxm]; VII g[maxm];
struct HeapNode
{
int d;
unsigned short u;
HeapNode() {}
HeapNode(int d, unsigned short u):d(d), u(u) {}
bool operator < (const HeapNode &rhs)const
{
return d > rhs.d;
}
};
unsigned short cmp1(LL x, LL y)
{
char ss[][];
sprintf(ss[], "%010I64d", x);
sprintf(ss[] ,"%010I64d", y);
int i = ;
for(i = ; i <= ; i++)
{
if(ss[][i] != ss[][i])
break;
}
return co[i];
}
void bfs(int src)
{
priority_queue<HeapNode> q;
q.push(HeapNode(, src));
d[src] = ;
inq[src] = false;
while(!q.empty())
{
HeapNode u = q.top();
int x = u.u;
int dd = u.d;
q.pop();
if(inq[x])
continue;
inq[x] = true;
char ss[];
sprintf(ss+, "%010I64d", s[x]);
Rep(j, , )
{
int c = ss[-j]-'';
REP(k, )
{
if(k == c)
continue;
LL tmp = s[x] + (k-c)*a[j-];
if(mps.count(tmp))
{
int y = mps[tmp];
int l = cmp1(s[x], s[y]);
if(d[y] > dd + l)
{
pa[y] = x;
d[y] = dd + l;
q.push(HeapNode(d[y], y));
}
}
}
}
Rep(j, , ) for(int k = j+; k <= ; k++)
{
int c1 = ss[-j]-'';
int c2 = ss[-k]-'';
if(c1 == c2)
continue;
LL tmp = s[x] + (c2-c1)*a[j-] + (c1-c2)*a[k-];
if(mps.count(tmp))
{
int y = mps[tmp];
int l = cmp1(s[x], s[y]);
if(d[y] >dd + l)
{
pa[y] = x;
d[y] = dd + l;
q.push(HeapNode(d[y], y));
}
}
}
}
}
VI ans; void print(int s)
{
ans.pb(s);
while()
{
s = pa[s];
ans.pb(s);
if(s == )
break;
}
printf("%d\n", ans.size());
VREP(i, ans.size()-, )
{
printf("%hu%c", ans[i], i == ? '\n' : ' ');
}
}
int main()
{ a[] = ;
Rep(i, , )
a[i] = a[i-]*;
scanf("%d", &n);
REP(i, )
scanf("%hu", co+i);
Rep(i, , n+)
{
scanf("%I64d", s+i);
mps[s[i]] = i;
d[i] = inf;
inq[i] = false;
} bfs();
if(d[n] >= inf)
puts("-1");
else
{
printf("%d\n", d[n]);
print(n);
}
return ;
}
Problem D URAL 1803 The Czechs' Rifles
题意:实际上就是要你求出前n个斐波那契数的k进制表示下,各个位数之和,然后再排序输出。
分析:首先可以证明的是,fn <= 2*fn-1,所以fn <= 2^n,所以可以这样求每个斐波那契数的k进制表示下各数位之和,将其表示成cnt进制的数,cnt为不超过n的k的最大次幂,
然后预处理出来小于cnt的各个数的k进制下数位之和。接下来就是通过前两项酸算出当前的斐波那契数,然后并将其k进制下各位加起来。这个过程其实就是模拟的一个大数加法的过程。
#include <bits/stdc++.h>
#define in freopen("solve_in.txt", "r", stdin);
using namespace std;
const int maxn = + ;
struct Node
{
int id, su;
bool operator < (const Node &rhs)const
{
if(su == rhs.su)
return id < rhs.id;
return su < rhs.su;
}
} ans[maxn];
int sum[maxn];
int dp[][maxn]; int n, k;
int main()
{ scanf("%d%d", &k, &n);
int cnt = ;
while(cnt * k < maxn)
cnt *= k;
for(int i = ; i < maxn; i++)
{
int tmp = i;
while(tmp)
{
sum[i] += tmp%k;
tmp /= k;
}
}
dp[][] = dp[][] = ;
ans[].id = , ans[].id = ;
ans[].su = ans[].su = ;
int st = ;
for(int i = ; i <= n; i++)
{
int delta = ;
int now = i&;
int pre = now^;
ans[i].id = i;
for(int k = ; k < st; k++)
{
dp[now][k] += dp[pre][k] + delta;
if(dp[now][k] >= cnt)
{
delta = dp[now][k]/cnt;
dp[now][k] %= cnt;
}
else delta = ;
ans[i].su += sum[dp[now][k]];
}
if(delta)
dp[now][st++] = delta;
ans[i].su += sum[delta];
}
std::sort(ans+, ans++n);
for(int i = ; i <= n; i++)
printf("%d%c", ans[i].id, i == n ? '\n' : ' ');
return ;
}
NEERC 2010, Eastern subregional contest的更多相关文章
- NEERC 2013, Eastern subregional contest
I. The old Padawan Time limit: 0.5 secondMemory limit: 64 MB Yoda: Use the Force. Yes. Now, the ston ...
- NEERC 2014, Eastern subregional contest
最近做的一场比赛,把自己负责过的题目记一下好了. Problem B URAL 2013 Neither shaken nor stirred 题意:一个有向图,每个结点一个非负值,可以转移到其他结点 ...
- 2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest PART (8/10)
$$2013-2014\ ACM-ICPC,\ NEERC,\ Eastern\ Subregional\ Contest$$ \(A.Podracing\) 首先枚举各个折现上的点,找出最小宽度,然 ...
- 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem G. The Debut Album
题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定n,a,b的值 求一个长度为n的 ...
- 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal
题目链接:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定一个长度为2n,由n个大写字母和 ...
- Round 0: Regionals 2010 :: NEERC Eastern Subregional
Round 0: Regionals 2010 :: NEERC Eastern Subregional 贴吧题解(官方)? 网上的题解 水 A Murphy's Law 题意:Anka拿着一块涂着黄 ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练
2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest
目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...
随机推荐
- postgresql cast转换类型
代码 CAST(aa as NUMERIC)
- 命令行创建Android应用,生成签名,对APK包签名并编译运行
一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...
- iOS 获取系统相册数据(不是调系统的相册)
Framework:AssetsLibrary.framework 主要目的是获取到系统相册的数据,并把系统相册里的照片显示出来. 1.创建一个新的项目: 2.将AssetsLibrary.frame ...
- 导出Execel
//请求入口 @SuppressWarnings("serial")@ParentPackage("default") //action请求@Results( ...
- 使用Class.getResource和ClassLoader.getResource方法获取文件路径
自从转投Java阵营后,一直发下Java程序的路径读取异常麻烦,因此查阅了比较多的版本内容,整合了一份自己的学习笔记.主要使用Class及通过ClassLoader来动态获取文件路径. 查阅链接如下: ...
- hdu 1576 A/B
原题链接:hdu 1576 A/B 同样是用扩展的欧几里得算法.A = 9973k+n = xB,从而转化为:xB-9973k=n求解x即可. 具体扩展欧几里得算法请参考:hdu 2669 Roman ...
- Lua脚本之语法基础快速入门
要 1.基本数据类型 2.Lua中的常用语句结构以及函数 3.Lua中的常用语句结构介绍 4.Lua中的库函数 目录[-] 一.基本数据类型 二.Lua中的常用语句结构以及函数 1.Lua中的常用语句 ...
- linux操作系统使用3G网卡
几个月前,opensuse13.2出了,一直手痒痒,一有空装了一个.当时在学校,一直用着校园网,也好久没有使用3G网卡.回家的时候,办了个3G网卡,结果插电脑上没有反应,以前插上去,都会提示创建一个网 ...
- unix 常用命令
(一)基本命令 命令格式: 命令 参数 1.ls 显示文件名,等同于dos下dir命令 命令格式:ls [option] file option: -l 显示详细列表 域1 :文件类型和文件权限 域2 ...
- switch...case 和 if...else
switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...