4
29
2013
0

点分治

poj 1741 :男人八题23333

poj 2114:限制条件变成==k,该怎么弄怎么弄

省队互测题

BZOJ 1267 ←还没交

关于合并答案:

现在我们在点p,

p有各种孩子:b1,b2,b3,...,bn

首先可以得到他们的答案ans1...ansn

然后考虑经过p点的情形。

1)如果是要在限制Y下最大化XXXX(要满足可加性)

从一个子树出发,dfs出deepX情况下的最优解que[deep]

考虑这个最优解和前一颗线段树满足限制Y下的区间中的最优解的合并是否最优。

然后把这颗子树丢进线段树tree[deep](deep为关键字)

但是还有个单调性的做法:

当限制范围是L<=DIST<=R时

最大化tree[X]+que[Y] | L<=X+Y<=R,X,Y>=0

显然,如果X固定了,问题就变成求出que[L-X]到que[R-X]之间的最大值。

X单增,L-X,R-X也是单增,用单调队列维护就可以了。

nlogn->n  daze~啦啦啦啦啦比线段树好些多了23333

(某题解,差评!)

2)如果是要在限制条件Y下统计XXXX的个数

把条件转换成最好处理的,

利用单调性,类似统计逆序数的

统计一个子树下的答案,和所有子树下的答案……

然后该咋搞咋搞……

// 这只是一个简单的模板,在// ???填充代码……
#include <cstdio>
#include <cstdlib>
const int maxn = 100010;
const int maxm = 200010;
int n,l,r,mid;

struct node{
	int u,v,c;
	bool flag;
	node*next,*inv;
}E[maxm];int size = 0;

node * V[maxn];
int gravity[maxn];

int csize = 0;
int sum[maxn],balance[maxn];
bool inba[maxn];

int nsize = 0;

void callbalance(int root){
        nsize++;
	inba[root] = true;
	sum[root] = 1;
	for (node * it = V[root];it!=NULL; it = it->next){
		if (!t->flag){
			it->flag = it->inv->flag = true;
			callbalance(it->v);
			it->flag = it->inv->flag = false;
			sum[root]+=sum[it->v];
			balance[root] = (sum[it->v],balance[root]);
		}
	}
}

void callgravity(int root){
	csize = 0;
	memset(inba,0,sizeof(inba));
	node * p = V[root];

	callbalance(root);

	for(int i=1; i <= n; i++){
		if (inba[i]) balance[i] = max(nsize - sum[i] , balance[i]);
	}
	int mn = balance[root],int index = root;
	for(int i=1; i <= n; i++){
		if (inba[i]){ mn = balance[i]; index = i; }
	}

	gravity[root] = index;

	for (node * it = V[index];it!=NULL; it = it->next){
		if (!t->flag){
			it->flag = it->inv->flag = true;
			callbalance(it->v);
			it->flag = it->inv->flag = false;
		}
	}
}

int calc(int x){
	node * q = V[gravity[x]];
	int ans = 0;
	int rst = 0;
	for (node * it = q;it!=NULL;it = it->next){
		if (!t->flag){
			it->flag = true;
			it->inv->flag = true;
			ans = max(ans,calc(it->v));
			it->flag = false;
			it->inv->flag = false;
		}
	}
	// ???在这里合并。
	return max(ans,rst);
};
node* insert(int u,int v,int c,int g = 0,node *inv = NULL){
	node * p = &E[size++];
	p->u = u;p->v = v;p->c = c;p->g = g;p -> inv = inv?inv:insert(v,u,c,g,p);
	p->next = V[u];V[u]=p;
	return p;
}
int main(){
	scanf("%d%d%d",&n,&l,&r);
	for (int i = 0;i < n-1;i++)
	{
		int u,v,c;
		scanf("%d%d%d",&u,&v,&c);
		insert(u,v,c);
	};
	callgravity(1);

}
Category: 未分类 | Tags: 分治
4
18
2013
0

线性规划(某一类线性规划程序写法)

这个实现:

http://hi.baidu.com/__vani/item/19c2b226010fd4896e2cc345

是有问题的,只能在变量始终为0\1\-1的题里用

http://hi.baidu.com/nehzilrz/item/9fba95952db43b30336eebf7

这个通用一些……

注意各种变量的正负。

Yangff 20:23:37 
……
Yangff 20:23:40 
好吧&……
Yangff 20:23:43 
原来是不等式。。
Yangff 20:24:21 
等扥……
Yangff 20:24:23 
等等……
Yangff 20:24:44 
 这诡异的式子。。
wyl8899 20:24:58 
有什么问题吗..
wyl8899 20:25:16 
recall x[i]=b[i]-∑A[i][j]*x[j] , x[i]>=0 
Yangff 20:25:26 
不应该是x[i+n]么。。 
wyl8899 20:25:23 
哦.. 
wyl8899 20:25:29 
因为是虚拟的变量 
Yangff 20:25:47 
…… 
Yangff 20:25:50 
我知道是虚拟的。。 
Yangff 20:25:55 
看起来直接就没存了。。 
wyl8899 20:26:01 
恩.. 看起来是这个样子 
Yangff 20:26:10 
但是移动的时候会移动到啊。。这里就完全不理解了。。 
Yangff 20:26:38 
= =……我觉得省略了各种的正负号变换…… 
Yangff 20:26:50 
符号看的我快吐了。。 
wyl8899 20:26:52 
我也觉得..  
Yangff 20:29:27 
= =。。你问一下他,没有辅助变量的话……他在和谁松弛。。 
Yangff 20:29:36 
我是说pivot。。 
wyl8899 20:30:13 
这就是x[l]和x[e]的对换啊... 
Yangff 20:30:30 
对啊。 
Yangff 20:30:40 
但是问题是x[l]和x[e]都是当前已选定的。。 
wyl8899 20:30:33 
辅助变量是存在的.. 
Yangff 20:30:42 
换来干嘛。 
Yangff 20:30:44 
额= =? 
wyl8899 20:30:43 
在你的脑海当中 
Yangff 20:31:00 
但是他没有存辅助变量的系数啊。。 
wyl8899 20:31:20 
一开始
x[l+n]=a[l][0]+∑a[i][j]*x[j]>=0对吧 
Yangff 20:31:34 
嗯…… 
wyl8899 20:31:32 
系数根本就是1嘛.. 干嘛要存下来 
Yangff 20:31:49 
换了就不一定是1了啊。。 
wyl8899 20:31:44 
然后来看看那个x[e] 
wyl8899 20:32:12 
由于pivot的条件,已经保证了A[l][e]>0 
wyl8899 20:32:20 
换句话说a[l][e]=-1 
Yangff 20:32:38 
= =? 
wyl8899 20:32:41 
(假定只有1/0/-1的情况 
Yangff 20:33:02 
a[l][e]>0所以a[l][e]=-1? 
wyl8899 20:33:13 
A[l][e]>0  ,  a[l][e]<0  ,  a[l][e]=-1  
Yangff 20:33:27 
哦哦 
wyl8899 20:33:26 
于是我们移一下项.. 
wyl8899 20:33:51 
x[l+n]=a[l][0]+∑(j!=e)a[i][j]*x[j]+a[l][e]*x[e] 
wyl8899 20:34:19 
x[e]=a[l][0]+∑(j!=e)a[i][j]*x[j]+(-1)x[l+n]>=0 
Yangff 20:35:36 
嗯。。 
wyl8899 20:35:33 
给x[l+n]起个新的名字,叫做x[e]
给x[e]起个新的名字,叫做x[l+n] 
wyl8899 20:36:02 
x[l+n]=a[l][0]+∑a[i][j]*x[j] , 只要a[l][e]=-1就完成任务了 
Yangff 20:36:58 
等等…… 
Yangff 20:37:09 
难道不要把原来的x[l+n]移过去吗? 
Yangff 20:37:16 
移到右边 
wyl8899 20:37:16 
移了啊 
wyl8899 20:37:37 
很显眼的(-1)x[l+n] 
Yangff 20:38:00 
a[l][e]=-1只是把x[e]移到左边啊。。 
Yangff 20:38:14 
左边的l(l+n)不应该移到右边吗? 
wyl8899 20:38:25 
a[l][e]=-1是在把x[l+n]移到右边去啊 
Yangff 20:38:49 
0 0? 
wyl8899 20:38:42 
x[e]成为基本变量了以后系数永远是1 不存 
Yangff 20:39:00 
对。 
wyl8899 20:39:06 
所以这里我们设定的是x[l+n]在x[e]的等式里的系数 
wyl8899 20:39:31 
但是由于他们已经调换名字了.. 所以是a[l][e]=-1 
Yangff 20:39:45 
等等……也就是说a[l]存的是原来的a[e]经过改变后的系数? 
Yangff 20:40:05 
a[e]存的是移项后的a[l]? 
wyl8899 20:40:04 
对对对对 
Yangff 20:40:16 
哦! 
wyl8899 20:40:17 
有没有觉得很碉堡 
wyl8899 20:40:31 
所以从头到尾都只有m个(不)等式 
Yangff 20:40:47 
也就是说,永远保证下标是等式左边的下标? 
Yangff 20:40:55 
果然碉堡。。
wyl8899 20:40:57 
但是.. 输出方案就要麻烦一些了
Yangff 20:41:12 
= =。。
Yangff 20:41:31 
等等……
Yangff 20:41:35 
这样好像还是有点问题。。
wyl8899 20:41:57 
呃.. 哪里有问题?
Yangff 20:42:43 
如果只保存了n(也就是原始约束个数)个不等式的话,去哪里和新增加的辅助变量交换。。
Yangff 20:43:05 
既然下标一定是等式左边的下标
wyl8899 20:43:59 
辅助变量.. 你是说n+1..n+m这些吗
Yangff 20:44:12 
嗯。
Yangff 20:44:18 
因为是要和他们交换啊。
wyl8899 20:44:19 
他们从头到尾都只存在于你的脑海里
Yangff 20:44:33 
^
Yangff 20:44:44 
那怎么枚举。。
wyl8899 20:45:04 
你是说在确定PIVOT的对象的环节?
Yangff 20:45:16 
毕竟他们也可能被选中啊。。
wyl8899 20:45:16 
被选中?
Yangff 20:45:37 
就是说,下标为n+1,...n+m的变量。
Yangff 20:45:52 
也可能变成非基变量啊。。
Yangff 20:46:32 
如果不存他们的话,你的下标只能在0~n之间变。。
wyl8899 20:46:35 
所以说是下标永久对换啊
wyl8899 20:46:38 
这么说吧.. 继续前面的PIVOT(l,e)
wyl8899 20:46:52 
a[e][]存了移项以后的a[l][]
wyl8899 20:46:58 
不对..
Yangff 20:47:10 
我知道下标是永久对换的。但是你换的范围只有0~n
Yangff 20:47:16 
1~n
Yangff 20:47:28 
那不就没有意义了,我本来就是这n个不等式的。。
wyl8899 20:47:24 
我不懂应该怎么解释清楚..
wyl8899 20:47:30 
不管你怎么PIVOT
Yangff 20:47:41 
><..
wyl8899 20:47:36 
永远只有n个不等式
Yangff 20:47:59 
好吧。。
Yangff 20:48:01 
换句话说。
Yangff 20:48:56 
一个x[n+2](基)和x[2](非基)在PIVOT之后的下标分别是什么(其中n+2是不占在a数组下标的)
wyl8899 20:49:53 
x[2]永久的... 消失了
x[n+2]取而代之
Yangff 20:50:51 
也就是说……系数是有n+2的位置的?
Yangff 20:51:00 
只是不等式没有?
wyl8899 20:51:39 
不是啊...
wyl8899 20:51:46 
x[2]不是已经消失了吗..
Yangff 20:52:03 
嗯。。
wyl8899 20:52:05 
所以现在x[n+2]完全的成为了x[2]
Yangff 20:52:16 
哦!
Yangff 20:53:35 
我是说在系数中。。
wyl8899 20:54:00 
呃... 在这次PIVOT之后 一切a[][2]都指的是x[2] 也就是原来的x[n+2]
Yangff 20:54:16 
x[l]=a[l][0]+∑a[i][j](这里有没有n+2的位置)*x[j]

Yangff 20:54:19 
哦。。
wyl8899 20:54:30 
在PIVOT的后半部分已经完整的完成了这个取而代之的工作
Yangff 20:54:47 
我知道了。。
wyl8899 20:56:03 
可以写一份《论如何读懂一类单纯形代码》来造福人类了...
Yangff 20:56:58 
那怎么知道a[i][..]带边的左边的x的下标……难道也直接换成x[i]?
Yangff 20:57:28 
把x[n+2]直接取代x[2]的一切位置,名字,下标?
wyl8899 20:58:17 
恩
Yangff 20:58:30 
*以及在别的不等式中的x[2]也换成x[n+2]?
Yangff 20:58:32 
好啊并。。
Yangff 20:58:34 
好吧。。
Yangff 20:58:35 
我懂了。。
Yangff 21:00:00 
那么……
 
这一行的循环范围并没有超过不等式的数量……
Yangff 21:00:13 
他是怎么把辅助的不等式考虑进来的……
Yangff 21:00:23 
还是说这个m=n+m?
wyl8899 21:01:11 
这一行是在选择一个在目标函数中系数为负的非基本变量吧
Yangff 21:01:37 
嗯。。 
wyl8899 21:01:48 
那关基本变量(你愿意叫他辅助变量也可以)什么事.. 
Yangff 21:02:01 
说错了= = 
Yangff 21:02:03 
下面那个= = 
Yangff 21:02:12 
他只循环到n啊。。 
wyl8899 21:02:12 
因为只有n个不等式对吧.. 
Yangff 21:02:24 
嗯。。。 
wyl8899 21:02:26 
那就没事了啊.. 这不是考虑清楚了么 
Yangff 21:02:43 
= =。。 
Yangff 21:02:48 
总共有n+m个不等式啊。。 
Yangff 21:02:55 
只是当前有效的n个。。 
Yangff 21:03:01 
别的都被这n个确定了啊。。 
Yangff 21:03:16 
但是交换的时候不是应该从m这里拿吗。。 
Yangff 21:03:22 
(好吧,我n,m都快乱了) 
wyl8899 21:03:29 
那就明确一下吧 n是约束个数 m是变量个数 
Yangff 21:03:41 
嗯。。 
wyl8899 21:03:39 
*非基本变量个数 
Yangff 21:03:55 
嗯。。 
wyl8899 21:03:58 
那n+m个不等式... 
Yangff 21:04:10 
嗯。。 
Yangff 21:04:15 
*-* 
wyl8899 21:04:08 
有n个已经被存下来了 
Yangff 21:04:21 
嗯 
wyl8899 21:04:23 
其余的m个都是非负性限制不是吗.. 
Yangff 21:04:40 
嗯 
wyl8899 21:04:38 
所以还有什么问题呢.. 
wyl8899 21:04:59 
不管这个PIVOT怎么乱来 松弛型的形态都没有改变 
Yangff 21:06:41 
但是…… 
Yangff 21:06:48 
他这里怎么看都是在自己和自己松弛啊。。 
Yangff 21:06:52 
pivot 
wyl8899 21:07:55 
啊..  
Yangff 21:08:46 
l∈[1,n]
e∈[1,m]
如果我要和n+m松弛怎么办。。 
Yangff 21:08:48 
pivot 
Yangff 21:09:11 
这里l永远不可能是n+m啊。 
Yangff 21:09:25 
但是真正操作的时候是有可能用到的啊。。 
wyl8899 21:09:35 
你是说l的取值范围啊 
Yangff 21:09:48 
嗯! 
Yangff 21:10:05 
毕竟l决定了e将来的下标 
wyl8899 21:09:59 
l是1..n就取遍了n个非基本变量啊 
wyl8899 21:10:10 
不对.. 
wyl8899 21:10:14 
n个基本变量 
Yangff 21:10:36 
但是pivot里面不管是不是非基变量,都是直接a[l]直接取了啊。。 
Yangff 21:10:58 
但是a[l]显然是非基本变量啊 
Yangff 21:11:09 
a[l+n](不存在)才是基本变量吧。 
wyl8899 21:11:30 
但是a[l][]保存的是(x[l+n]=)a[l][]+∑a[l][j]*x[j]不是么 
Yangff 21:11:44 
!! 
Yangff 21:11:47 
懂了! 
Yangff 21:11:59 
太感谢了……*_* 
Yangff 21:12:19 
(这写法大坑啊…… 
wyl8899 21:13:03 
所以我说应该可以写一份《论如何读懂一类单纯形代码》来造福人类了... 
Yangff 21:13:26 
同意。。 
Yangff 21:15:51 
稍等……如果这样的话……
a[l][e] = -1;后面不应该跟一个
a[l][l] = 1;吗? 
wyl8899 21:16:16 
a[l][l]存的是啥? 
Yangff 21:16:28 
哦哦哦。。 
Yangff 21:16:31 
我看错了= = 
Yangff 21:19:18 
/**
  e成为基变量,位置为n+l
  n+l成为非基变量,位置为e
**/
inline pivot(int l,int e) 
Yangff 21:19:26 
所以这是这个函数的意思么。。 
wyl8899 21:19:32 
恩... 
Yangff 21:19:46 
大坑/A\ 
wyl8899 21:19:47 
 绝对的大坑...

uva10489

usaco ditch

Category: 未分类 | Tags:
1
22
2012
0

Acfun土豆转贴脚本

 

require "net/https"
require "uri" 
require 'iconv'
$i=Iconv.new("GBK","UTF-8")
$player=<<EOF
<embed width="950" height="445" flashvars="type2=tudou&id=VIDEOID" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" wmode="window" allowscriptaccess="always" allowfullscreen="true" type="application/x-shockwave-flash" src="/newflvplayer/playert.swf" id="ACFlashPlayer"></embed>
EOF
$player=$i.iconv $player
def makePlayer(iid)
	p=$player.clone
	p.gsub(/VIDEOID/){iid}
end
def getlist()
	print $i.iconv "请输入豆单的完整地址(含HTTP://)"
	url=URI.parse gets	
	net=Net::HTTP.new(url.host, url.port)
	r,data = net.get(url.path,{"Referer"=>"www.tuduo.com"})
	data.force_encoding("GBK")
	@str=""
	@mov=[]
	data.gsub(/iid:([0-9]*)/){@mov<<[$1]}#@str<<#makePlayer($1)<<"#" + "p" + "#" + "#{$3}#" + "e" + "#\r\n"}
	i=0
	data.gsub(/,title."([^"]*)"/){@mov[i][1]=$1;i+=1;}
	for i in @mov
		@str<<makePlayer(i[0])<<"#" + "p" + "#" + "#{i[1]}#" + "e" + "#\r\n"
	end
	if $f
		$f.write(@str)
		$f.close
		print $i.iconv "已经保存到文件\n"
		$f=false
	else
		print @str
	end
end
def getOne()
	print $i.iconv "请输入视频的完整地址(含HTTP://)"
	url=URI.parse gets
	net=Net::HTTP.new(url.host, url.port)
	r,data = net.get(url.path,{"Referer"=>"www.tuduo.com"})
	data.force_encoding("GBK")
	@str=""
	@iid=0
	data.gsub(/defaultIid = ([0-9]*)/){@iid=$1}
	data.gsub(/,iid =([^0-9]*)([0-9]*)/){@iid=$2} if @iid==0
	if $f
		$f.write(makePlayer(@iid))
		$f.close
		print $i.iconv "已经保存到文件\n"
		$f=false
	else
		print makePlayer(@iid)
	end
end
func=0
$f=false

while func.to_i!=4
	system('cls')
	print $i.iconv "欢迎使用Tudou视频转贴=>Acfun工具 b3 By yangff\n"
	print $i.iconv "请选择功能\n"
	print $i.iconv "[1] 转贴单个视频(请确认地址是http://www.tudou.com/programs/view/......这样的)\n"
	print $i.iconv "[2] 转贴豆单(请确认地址是http://www.tudou.com/playlist/p/........这样的)\n"
	print $i.iconv "[3] 保存到文件\n"
	print $i.iconv "[4] 退出\n"
	print $i.iconv "\n"
	print $i.iconv "请选择:"
	func=gets
	break if func.to_i==4
	if (func.to_i==1)
		getOne
	elsif (func.to_i==2)
		getlist
	elsif (func.to_i==3)
		print $i.iconv "输入保存地址:"
		url=gets.strip
		$f=File.open(Iconv.iconv("UTF-8","GBK",url)[0],"w")
		next
	end
	print "\n"
	print $i.iconv "复制上面的代码,在编辑器转入代码编辑后粘贴即可!\n"
	system('pause')
end
Category: 未分类 | Tags:
7
6
2011
0

2011-7-7

Pólya定理

设Ω=[1,n],M={S1,S2,…Sm}是m种颜色的集合,对Ω中的元素用M中的颜色着色,得到的图象集合用MΩ表示,|MΩ|=mn,每个中的元素都有m种着色可能,n个元的着色有mn种可能。即共有mn个图象。
G是以Ω为目标记得置换群,是某一转动群R的表示。G是以MΩ为目标记得置换群,是同一转动群R的表示。

G≌R,G≌R,G≌G
一个着色图象在G的作用下变为另一个图象,则这两个图象属于同一方案。

但是怎么用??最小割?

Category: 未分类 | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com