2015省赛选拔

2024-06-15 11:08
文章标签 2015 省赛 选拔

本文主要是介绍2015省赛选拔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Arc and Point http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4709 几何弱成狗 Block Toy http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4710 3维版本的铺砖,状态压缩dp。 Four coloring of a map http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4714 Giving directions to the tree http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4715 Just another pachinko-like machine http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4718 Biggest Number http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4610 搜索+剪枝,剪枝很弱。 Repairing a Road http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4611 三分+最短路,想出之后扔给队友写。。。 A Shooting Game http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4612 Number of Battlefields http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4613 Infinite Dictionaries http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4614 Tetrahedrons and Spheres http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4615 Road Network http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4190 最短路+dp+拓扑,好题,求经过每一条边的最短路个数,需要深刻理解最短路。 开始写了正反2次dp,超时,其实第二次不需要再从图上拓扑,可以在第一次求最短路的时候把拓扑的先后存在一个数组里即可,具体得看代码。
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 1555;
const int maxm = 5155;
typedef __int64 LL;
const int mod = 1000000007;
struct edge
{
int u, v, w, id;
edge(){
}
edge(int u, int v, int w, int id): u(u), v(v), w(w), id(id) {
}
};
struct node
{
int u, d;
node(){
}
node(int u, int d): u(u), d(d) {
}
bool operator < (const node& rhs) const {
if(d != rhs.d)
return d > rhs.d;
return u > rhs.u;
}
};
int n, m;
vector <edge> G[maxn];
int dis[maxn], vis[maxn];
int to[maxn];
LL dp[maxn], dp2[maxn];
LL ans[maxm];
void Dijkstra(int s)
{
memset(dp, 0, sizeof(dp));
memset(dp2, 0, sizeof(dp2));
priority_queue <node> Q;
Q.push(node(s, 0));
memset(dis, 0x3f, sizeof(dis));
memset(vis, false, sizeof(vis));
dis[s] = 0;
dp[s] = 1;
int cnt = 0;
while(!Q.empty())
{
node x = Q.top(); Q.pop();
int u = x.u;
if(vis[u])
continue;
vis[u] = true;
to[++cnt] = u;
for(int i = 0; i < G[u].size(); i++)
{
edge y = G[u][i];
int v = y.v;
if(dis[v] > dis[u] + y.w)
{
dis[v] = dis[u] + y.w;
Q.push(node(v, dis[v]));
dp[v] = dp[u];
}
else if(dis[v] == dis[u] + y.w)
{
dp[v] += dp[u];
dp[v] %= mod;
}
}
}
for(int i = cnt; i >= 1; i--)
{
int u = to[i];
dp2[u] = 1;
for(int j = 0; j < G[u].size(); j++)
{
edge y = G[u][j];
int v = y.v;
int id = y.id;
if(dis[u] + y.w == dis[v])
{
dp2[u] += dp2[v];
dp2[u] %= mod;
ans[id] += dp[u]*dp2[v];
ans[id] %= mod;
}
}
}
}
int main()
{
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
G[u].push_back(edge(u, v, w, i));
}
for(int i = 1; i <= n; i++)
{
Dijkstra(i);
}
for(int i = 0; i < m; i++)
printf("%I64d\n", ans[i]);
return 0;
}
/*
5 4
1 2 5
2 3 5
3 4 5
5 2 5
4 4
1 2 5
2 3 5
3 4 5
4 1 1
*/
SORT http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4478 给你一个排列,每次可以选择一段递减的,将他反转,求反转多少次可以排序完成。 感觉做一次反转之后就变成逆序对问题了。
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100009;
typedef __int64 LL;
int A[N], C[N], n;
int low_bit(int x) {
return x&-x;
}
int S(int x){
int res = 0; while (x){res += C[x]; x ^= low_bit(x);}
return res;
}
void M(int x){
while (x <= n){++C[x], x += low_bit(x);}
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &A[i]);
LL ans = 0 ;
for (int i=0,j=1;i<n;i=j,++j){
while (j<n&&A[j]<A[j-1]) ++j; if (i+1<j) ++ans;
for(int k = j-1; k >= i; k--) ans += (i+j-k-1) - S(A[k]), M(A[k]);
}
printf("%I64d\n", ans);
}
KRIPTOGRAM http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4496 kmp变形,转换成距离在用kmp。
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
typedef __int64 LL;
int s1[1000010], s2[1000010];
int l1, l2;
int pos[300], f[1000010];
map <string, int> mp;
char str[1000010];
bool ok1(int x, int y)
{
if(s2[x] == 0 || s2[y] == 0)
return true;
if(s2[x] == s2[y])
return true;
return false;
}
bool ok2(int x, int y)
{
if(s1[x] == 0 && s2[y] == 0)
return true;
else if(s1[x] == s2[y])
return true;
else if(s2[y] == 0 && y-s1[x] < 0)
return true;
return false;
}
void getnext()
{
f[0] = f[1] = 0;
for(int i = 1; i < l2; i++)
{
int j = f[i];
while(j && !ok1(i, j))
j = f[j];
f[i+1] = j+ok1(i, j);
}
}
int find()
{
int j = 0;
for(int i = 0; i < l1; i++)
{
while(j && !ok2(i, j))
j = f[j];
if(ok2(i, j))
j++;
if(j == l2)
return i-l2+2;
}
}
int main()
{
int cnt = 0;
while(scanf("%s", str) != EOF)
{
cnt++;
if(str[0] == '$')
break;
if(mp[str] == 0)
s1[l1++] = 0;
else
s1[l1++] = cnt-mp[str];
mp[str] = cnt;
}
cnt = 0;
mp.clear();
while(scanf("%s", str) != EOF)
{
cnt++;
if(str[0] == '$')
break;
if(mp[str] == 0)
s2[l2++] = 0;
else
s2[l2++] = cnt-mp[str];
mp[str] = cnt;
}
//printf("%d %d\n", l1, l2);
getnext();
/*for(int i = 0; i < l1; i++)
printf("%d ", s1[i]);
puts("");
for(int i = 0; i < l2; i++)
printf("%d ", s2[i]);
puts("");
for(int i = 1; i <= l2; i++)
printf("%d ", f[i]);
puts("");
*/
int ans = find();
printf("%d\n", ans);
return 0;
}
/*
a a a b c d $
x x x y z a $
a a a b c d a b c $
x x x y z a x y z $
a a a b c d a d c $
x y x $
a a a b c d a b c $
x y $
*/
Bend the Tape http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4219 Humble Numbers http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4531 Tidy Up the Code http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4235

这篇关于2015省赛选拔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063275

相关文章

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

2015年校赛总结

题目名为“校赛总结”,其实更想换成“Rainbow为什么五题滚粗?!”。作为今年校赛大二没拆的两个队伍之一,结果打成这样,没脸见人了,总结起来就是我认为自己今天SB了。主要有以下几点: 1.我今天状态的确不好,最后卡的那道B题跟去年在农大校赛上遇见的那题类似,在最后那段时间我已经有思路了,可是由于当时不敢写。等到最后15分钟才开始敲,加上我用很麻烦的Dijstra那种方法,调试起来好多细节要处理

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形

百度之星 2015 初赛(1) 1002 找连续数

找连续数      Accepts: 401      Submissions: 1911  Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是

2015多校联合训练第三场Work(hdu5326)

题意: a是b的上司,b是c的上司,则a是c的上司,问构成一个树种,有多人是 k个人的上司 思路: 先找出root,然后dfs一下就行 #include <bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e6;int f[105];int n, k;int mp[101][101];

2015年多校联合训练第三场RGCDQ(hdu5317)

题意: f(i)代表i数中有的素数的种数,给出区间[l,r],求区间内max(gcd(f(i))), 由于i最大是1e6,2*3*5*7*11*13*17>1e6,故最多不超过7种素数, 先打表打出1e6内的素数种数表,然后用sum[i][j]代表1-i个数中,还有j个素数的个数,最后用sum[r][j] - sum[l-1][j]求出区间内含有j个素数的数的个数,暴力找出1,2,3,4,5

2015多校联合训练第一场Tricks Device(hdu5294)

题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数,总边数-最短边数就是第二个答案 第一个答案就是在最短路里面求最小割,也就是求最大流,然后根据最短路在建个新图,权为1,跑一边网络流 模板题,以后就用这套模板了 #include <iostream>#include <cstdio>#incl

2015多校联合训练第一场Assignment(hdu5289)三种解法

题目大意:给出一个数列,问其中存在多少连续子序列,子序列的最大值-最小值< k 这题有三种解法: 1:单调队列,时间复杂度O(n) 2:RMQ+二分,时间复杂度O(nlogn) 3:RMQ+贪心,时间复杂度O(nlogn) 一:RMQ+二分 RMQ维护最大值,最小值,枚举左端点i,二分找出最远的符合的右端点j,答案就是ans += j - i+1;(手推一下就知道) 比如1 2 3

2015年多校联合训练第一场OO’s Sequence(hdu5288)

题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个对应的j使得a[i]%a[j]=0,那么l,r内有多少个i,f(l,r)就是几。问所有f(l,r)的总和是多少。 公式中给出的区间,也就是所有存在的区间。 思路:直接枚举每一个数字,对于这个数字,如果这个数字是合法的i,那么向左能扩展的最大长度是多少,向右能扩展的最大长度是多少,那么i为合法的情况