谈一下今天的网络赛。。。这次是真的弱爆了。。。。

对于偶自己来说,比赛时。。。偶只会做4个。。。。

1001:偶有幸遇到了师母= =,特判8个角,然后15数码逆序判定。。。

1002:首先离散化,然后每种x,每种y都只需要覆盖一次就可以了,每个点也仅会覆盖一次,查x和y时二分一下就可以了。。。O(N+N+N)。。

1003:gsb童鞋搞的= =。

1006:不就是个哈密尔顿回路么。。。处理可能要麻烦一点点,没时间写了。。。

1007:线段树啊~开方运算使数字下降的很快,下降到1或者数字是0以后就不用再下降了,开个布尔数组标记一下就行~

1008:奶奶个熊,今天的比赛就吊死在这题上边了。。。一直在用搜索+剪枝做,然后就一直TLE,到最后一算,我擦,所有的最小公倍数组合总共不到40000种,直接dp打表输出不就行了么。。。。这时候比赛还有不到半小时,时间应该够了,结果我sb的在某个语句想当然的弄错了序,接着又把llg写成了int。。。。悲剧到最后没交上。。。。

1001:

View Code
#include<iostream>
#include
<cstdlib>
#include
<cstdio>
#include
<string>
#include
<cstring>
#include
<cmath>
using namespace std;
const int dx[4] = {-1, 0, 0, 1};
const int dy[4] = {0, -1, 1, 0};
const int px[24] = {0, 0,
1, 1, 1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3, 3,
4, 4, 4, 4, 4, 4,
5, 5};
const int py[24] = {1, 4,
0, 1, 2 ,3, 4, 5,
1, 2, 3, 4,
1, 2 ,3 ,4,
0, 1, 2, 3, 4, 5,
1, 4};
const int ex[8] = {0, 0, 1, 1, 5, 5, 4, 4};
const int ey[8] = {1, 4, 0, 5, 1, 4, 0, 5};
int s[6][6], t[6][6];
int f[100], g[100];
bool check[6][6];
int n;
void pre()
{
memset(check,
0, sizeof(check));
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
check[i][j]
= true;
check[
0][1] = check[0][4] = true;
check[
1][0] = check[1][5] = true;
check[
4][0] = check[4][5] = true;
check[
5][1] = check[5][4] = true;
}
void init()
{
memset(s,
-1, sizeof(s));
memset(t,
-1, sizeof(t));
int x;
for(int i = 0; i < 24; i++)
{
cin
>>x;
s[px[i]][py[i]]
= x;
}
for(int i = 0; i < 24; i++)
{
cin
>>x;
t[px[i]][py[i]]
= x;
}
}
bool solve()
{
int x, y, X, Y;
for(int i = 0; i < 8; i++)
{
x
= ex[i];
y
= ey[i];
if(s[x][y] == 0)
{
for(int k = 0; k < 4; k++)
{
X
= x + dx[k];
Y
= y + dy[k];
if(check[X][Y])
{
int temp = s[x][y];
s[x][y]
= s[X][Y];
s[X][Y]
= temp;
break;
}
}
}
if(t[x][y] == 0)
{
for(int k = 0; k < 4; k++)
{
X
= x + dx[k];
Y
= y + dy[k];
if(check[X][Y])
{
int temp = t[x][y];
t[x][y]
= t[X][Y];
t[X][Y]
= temp;
break;
}
}
}
if(s[x][y] != t[x][y]) return false;
}
int tot_s = 0, tot_t = 0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
{
f[(i
- 1) * 4 + j] = s[i][j];
g[(i
- 1) * 4 + j] = t[i][j];
}

for(int i = 1; i <= 16; i++)
for(int j = 1; j < i; j++)
{
if(f[j] > f[i]) tot_s ++;
if(g[j] > g[i]) tot_t ++;
}
for (int i = 1; i <= 16;i++)
{
if (f[i] == 0) tot_s = tot_s + (i - 1) / 4 + (i - 1) % 4;
if (g[i] == 0) tot_t = tot_t + (i - 1) / 4 + (i - 1) % 4;
}
tot_s
%= 2;
tot_t
%= 2;
if(tot_s == tot_t) return true;
else return false;
}
int main()
{
int T;
scanf(
"%d", &T);
pre();
for(int i = 1; i <= T; i++)
{
init();
if(solve()) puts("N");
else puts("Y");
}
return 0;
}

  

1002:

View Code
#include <iostream>
#include
<cstdio>
#include
<cstring>
#include
<vector>
#include
<algorithm>
using namespace std;

const int N = 100010;

typedef
long long llg;

struct node
{
int x, y, id;
}p[N];

vector
< vector <int> > gx(N);
vector
< vector <int> > gy(N);

int n, m, lx, ly, tmpx[N], tmpy[N];
bool visx[N], visy[N], visit[N];

bool cmp1(const node &a, const node &b)
{
return a.x < b.x;
}

bool cmp2(const node &a, const node &b)
{
return a.y < b.y;
}

int dealx(int d)
{
bool flag = false;
int l, i, r, mid, len, ans = 0, v;
l
= 0, r = lx;
while(l <= r)
{
mid
= (l+r) >> 1;
if(tmpx[mid] == d)
{
flag
= true;
break;
}
else if(tmpx[mid] > d) r = mid-1;
else l = mid+1;
}
if(flag && !visx[mid])
{
len
= gx[mid].size();
for(i = 0; i < len; i++)
{
v
= gx[mid][i];
if(!visit[v])
{
visit[v]
= true;
ans
++;
}
}
visx[mid]
= true;
}
return ans;
}

int dealy(int d)
{
bool flag = false;
int l, i, r, mid, len, ans = 0, v;
l
= 0, r = ly;
while(l <= r)
{
mid
= (l+r) >> 1;
if(tmpy[mid] == d)
{
flag
= true;
break;
}
else if(tmpy[mid] > d) r = mid-1;
else l = mid+1;
}
if(flag && !visy[mid])
{
len
= gy[mid].size();
for(i = 0; i < len; i++)
{
v
= gy[mid][i];
if(!visit[v])
{
visit[v]
= true;
ans
++;
}
}
visy[mid]
= true;
}
return ans;
}

int main()
{
int i, c, d, ct;
freopen(
"data.txt", "r", stdin);
while(scanf("%d%d", &n, &m) != EOF)
{
if(n==0 && m==0) break;
for(i = 0; i < n; i++)
{
scanf(
"%d%d", &p[i].x, &p[i].y);
p[i].id
= i;
tmpx[i]
= p[i].x;
tmpy[i]
= p[i].y;
}
sort(tmpx, tmpx
+n);
sort(tmpy, tmpy
+n);
lx
= 0;
for(i = 1; i < n; i++)
if(tmpx[i] != tmpx[lx])
tmpx[
++lx] = tmpx[i];
ly
= 0;
for(i = 1; i < n; i++)
if(tmpy[i] != tmpy[ly])
tmpy[
++ly] = tmpy[i];
memset(visx,
false, sizeof(visx));
memset(visy,
false, sizeof(visy));
memset(visit,
false, sizeof(visit));
for(i = 0; i <= lx; i++)
gx[i].clear();
for(i = 0; i <= ly; i++)
gy[i].clear();
sort(p, p
+n, cmp1);
ct
= 0;
gx[
0].push_back(p[0].id);
for(i = 1; i < n; i++)
{
if(p[i].x == p[i-1].x)
gx[ct].push_back(p[i].id);
else
{
ct
++;
gx[ct].push_back(p[i].id);
}
}
sort(p, p
+n, cmp2);
ct
= 0;
gy[
0].push_back(p[0].id);
for(i = 1; i < n; i++)
{
if(p[i].y == p[i-1].y)
gy[ct].push_back(p[i].id);
else
{
ct
++;
gy[ct].push_back(p[i].id);
}
}
for(i = 0; i < m; i++)
{
scanf(
"%d%d", &c, &d);
if(c == 0) printf("%d\n", dealx(d));
else if(c == 1)
printf(
"%d\n", dealy(d));
}
printf(
"\n");
}
return 0;
}

  

1007:

View Code
#include <iostream>
#include
<cstdio>
#include
<cmath>
#include
<cstring>
using namespace std;

const int N = 100100;

typedef
long long llg;

int n, m;
llg num[N], tree[N
<<2];
bool yes[N<<2];

void build(int u, int l, int r)
{
int tmp = u<<1, mid = (l+r)>>1;
if(l == r)
{
tree[u]
= num[l];
return;
}
else
{
build(tmp, l, mid);
build(tmp
+1, mid+1, r);
tree[u]
= tree[tmp] + tree[tmp+1];
}
}

void Insert(int u, int l, int r, int a, int b)
{
int tmp = u<<1, mid = (l+r)>>1;
if(l==a && r==b)
{
if(yes[u]) return;
else
{
if(a == b)
{
llg xx
= (llg)sqrt(tree[u]*1.0);
if(xx == tree[u]) yes[u] = true;
else tree[u] = xx;
num[a]
= xx;
return;
}
Insert(tmp, l, mid, a, mid);
Insert(tmp
+1, mid+1, r, mid+1, b);
tree[u]
= tree[tmp] + tree[tmp+1];
if(yes[tmp] && yes[tmp+1])
yes[u]
= true;
}
}
else
{
if(b <= mid) Insert(tmp, l, mid, a, b);
else if(a > mid) Insert(tmp+1, mid+1, r, a, b);
else
{
Insert(tmp, l, mid, a, mid);
Insert(tmp
+1, mid+1, r, mid+1, b);
}
tree[u]
= tree[tmp] + tree[tmp+1];
if(yes[tmp] && yes[tmp+1])
yes[tmp]
= true;
}
}

llg Sum(
int u, int l, int r, int a, int b)
{
int tmp = u<<1, mid = (l+r)>>1;
llg ans
= 0;
if(l==a && r==b)
{
return tree[u];
}
else
{
if(b <= mid) ans = Sum(tmp, l, mid, a, b);
else if(a > mid) ans = Sum(tmp+1, mid+1, r, a, b);
else
{
ans
+= Sum(tmp, l, mid, a, mid);
ans
+= Sum(tmp+1, mid+1, r, mid+1, b);
}
return ans;
}
}

int main()
{
int i, Case = 0, t, x, y;
llg ans;
while(scanf("%d", &n) != EOF)
{
for(i = 1; i <= n; i++) scanf("%I64d", num+i);
build(
1, 1, n);
memset(yes,
false, sizeof(yes));
scanf(
"%d", &m);
printf(
"Case #%d:\n", ++Case);
for(i = 0; i < m; i++)
{
scanf(
"%d%d%d", &t, &x, &y);
if(x > y) swap(x, y);
if(t == 0) Insert(1, 1, n, x, y);
else
{
ans
= Sum(1, 1, n, x, y);
printf(
"%I64d\n", ans);
}
}
printf(
"\n");
}
return 0;
}

  

1008:

View Code
#include <iostream>
#include
<cstdio>
#include
<cstring>
#include
<set>
using namespace std;

typedef
long long llg;

int N;
llg m, ans, lc[
46][40000], dp[46][40000];

llg gcd(llg a, llg b)
{
if(b == 0) return a;
else return gcd(b, a%b);
}

llg lcm(llg x, llg y)
{
return x/gcd(x,y)*y;
}

int Find(int lab, llg x)
{
int l, r, mid;
l
= 1, r = lc[lab][0];
while(l <= r)
{
mid
= (l+r) >> 1;
if(lc[lab][mid] == x) return mid;
else if(lc[lab][mid] > x) r = mid-1;
else l = mid+1;
}
return -1;
}

int main()
{
int T, i, j, pos, Case = 0;
llg x;
set <llg> hash;
hash.clear();
hash.insert(
1);
set <llg> ::iterator it;
for(i = 2; i <= 40; i++)
{
lc[i][
0] = 0;
for(it = hash.begin(); it != hash.end(); it++)
{
x
= *it;
x
= lcm(x, i);
hash.insert(x);
}
for(it = hash.begin(); it != hash.end(); it++)
{
x
= *it;
++lc[i][0];
lc[i][lc[i][
0]] = x;
}
}
memset(dp,
0, sizeof(dp));
lc[
1][0] = 1;
lc[
1][1] = 1;
dp[
1][1] = 1;
for(i = 2; i <= 40; i++)
{
pos
= Find(i, i);
dp[i][pos]
+= 1;
for(j = 1; j <= lc[i-1][0]; j++)
{
x
= lc[i-1][j];
x
= lcm(x, i);
pos
= Find(i, x);
dp[i][pos]
+= dp[i-1][j];
}
for(j = 1; j <= lc[i-1][0]; j++)
{
pos
= Find(i, lc[i-1][j]);
dp[i][pos]
+= dp[i-1][j];
}
}
freopen(
"data.txt", "r", stdin);
scanf(
"%d", &T);
while(T--)
{
scanf(
"%d%I64d", &N, &m);
ans
= 0;
i
= lc[N][0];
while(lc[N][i]>=m && i>=1)
{
ans
+= dp[N][i];
i
--;
}
printf(
"Case #%d: %I64d\n", ++Case, ans);
}
return 0;
}

  

posted on 2011-09-10 21:54  Moon_1st  阅读(323)  评论(0编辑  收藏  举报

导航