错误集锦

posted on 2019-09-12 21:24:26

发糖果

	while(hd < tail) {
		int u = q[hd++];
		for(int i = head[u]; i; i = e[i].next) {
			int v = e[i].to;
			in[v]--;
			if(in[v] == 0) {
				buy[v] = buy[u] + 1;
				q[tail] = v;
				tail++;
				sum++;
			}
		}
	}

误打成

	while(hd < tail) {
		int u = q[hd++];
		for(int i = head[u]; i; i = e[i].next) {
			int v = e[u].to;
			in[v]--;
			if(in[v] == 0) {
				buy[v] = buy[u] + 1;
				q[tail] = v;
				tail++;
				sum++;
			}
		}
	}

商旅计划

struct edge {
	int to, next;
}e[2000005];

e[200005]少打了一个 0


P2047 [NOI2007]社交网络

对于 50% 的数据, \(n \le 10 , m \le 45\)

对于 100% 的数据, \(n \le 100 , m \le 4500\) ,任意一条边的权值 c 是正整数且 \(1 \leqslant c \leqslant 1000\)

所有数据中保证给出的无向图连通,且任意两个结点之间的最短路径数目不超过 \(10^{10}\)

\(10^{10}\)要用 long long

应用

long long sum[101][101];

AC Challenge

误将 | 打成 &

int sn = s | (1 << (i - 1));

hh真扎心

互不侵犯King

long long f(int i, int j, int k, int s)
{
	long long r = 0;
	if(vis[i][j][k][s])
		return ans[i][j][k][s];
   ...

应该long long r = 0;

因为每次都要用新的 r ,但是目前还不知道为什么不能定义全局变量 r ,只能重新定义。

Mondriaan's Dream

if(j < w && (((1 << j) & s) == 0) && i > 0)

不知道优先级一定要加括号!!!

特别是位运算!!!!!

旅行商问题2

for(int s = 1; s <= pow3[n] - 1; s++) {
		for(int i = 0; i < n; i++) {
			if((s / pow3[i]) % 3 == 2) continue;
			for(int j = 0; j < n; j++) {
				if(i == j) continue;
				f[i][s + pow3[i]] = min(f[i][s + pow3[i]], f[j][s] + map[j][i]);
			}
		}
	}

或者

for(int s = 1; s <= pow3[n] - 1; s++) {
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				if(i == j) continue;
				if(f[j][s] == 0x3f3f3f3f) continue;
				if((s / pow3[j]) % 3 < 2)
					f[j][s + pow3[j]] = min(f[j][s + pow3[j]], f[i][s] + map[i][j]);
			}
		}
	}

前者是填表法,后者是刷表法

判断的位置及状态转移方程自行体会

mixup2 混乱的奶牛/奶牛混合起来Mixed Up Cows

long long f[(1 << 16) + 1][16], ans;
int main()
{
	cin >> n >> k;
	for(int i = 0; i < n; i++)
		cin >> a[i];
	for(int i = 0; i < n; i++)
		f[1 << i][i] = 1;
	for(int i = 1; i < (1 << n); i++) {
		for(int j = 0; j < n; j++) {
			if((i & (1 << j)) == 0) 
				continue;
			if(f[i][j]) 
				continue;
			int s = i & ~(1 << j);
			for(int u = 0; u < n; u++) {
				if((i & (1 << u)) == 0) 
					continue;
				if(abs(a[j] - a[u]) > k)
				f[i][j] += f[s][u];
			}
		}
	}
	for(int i = 0; i < n; i++)
		ans += f[(1 << n) - 1][i];
	cout << ans;
return 0;
}

long long f[(1 << 16) - 1][16] 正好小1

23333

中间判断if(f[i][j])打成if(f[j][i])

Apple Tree 2

  1. 数组一定要开四倍大小

  2. tag标记的是啥一定要想清楚

void update(int u, int ul, int ur, int x)
{
	if(x == 0)
		sum[u] = ur - ul + 1;
	else
		sum[u] = 0;
	tag[u] = x;
}
void pushdown(int u, int ul, int ur)
{
	if(tag[u] != -1) {
		int mid = ul + ur >> 1;
		update(u << 1, ul, mid, tag[u]);
		update(u << 1 | 1, mid + 1, ur, tag[u]);
		tag[u] = -1;
	}
}

特别是这两处tag的更新

跳石头

题目中这样一句话

\(0 \leq M \leq N \leq 50000\)

我的程序中

const int N = 50000;

hh正好小1

以后一定要多开一点

50005 啊什么的

posted @ 2019-11-06 20:53  Atoposyz  阅读(125)  评论(0编辑  收藏  举报