﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-lenohoo</title><link>http://www.cppblog.com/lenohoo/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 05:15:11 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 05:15:11 GMT</pubDate><ttl>60</ttl><item><title>常规练习赛2题</title><link>http://www.cppblog.com/lenohoo/archive/2012/11/10/195029.html</link><dc:creator>lenohoo</dc:creator><author>lenohoo</author><pubDate>Sat, 10 Nov 2012 13:44:00 GMT</pubDate><guid>http://www.cppblog.com/lenohoo/archive/2012/11/10/195029.html</guid><wfw:comment>http://www.cppblog.com/lenohoo/comments/195029.html</wfw:comment><comments>http://www.cppblog.com/lenohoo/archive/2012/11/10/195029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lenohoo/comments/commentRss/195029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lenohoo/services/trackbacks/195029.html</trackback:ping><description><![CDATA[<div><div id="problem"> 	<div> 		<p>KMP</p> 		<p> 			TimeLimit: 1 Second &nbsp;  			MemoryLimit: 32 Megabyte 		</p> 		<p> 			Totalsubmit: 2 &nbsp;  			Accepted: 1 &nbsp;  					</p> 	</div> 	<div editor_content"=""> 		<p>Description</p>现有k个串，一个目标串，你从这k个字符串中选取一些字符，组成目标串。现有的k个串中每个串至多可选ai个字符，<br /> 而且从第i个串中选取<br /> 一个字符耗费i个金币，求组成目标串所消耗最小的金币数，如果不能组成，输出-1；<br /> <br /> <p>Input</p>第一行是目标串，第二行一个k（0&lt;k&lt;=100）,接下来k行，每行包括一个现有串，和ai(所有字符串长度不超过100，且非空)<br /> <br /> <p>Output</p>最小消耗的金币<br /> <br /> <p>Sample Input</p><p>zhonghongyihelafeng<br /> 5<br /> zhonghongyihenshuai 10<br /> zhonghongyihennx 10<br /> zhonghongyihenyingjun 10<br /> chuxinggedadiaosi 10<br /> wobuxihuanheichuxing 10<br /> bbaze<br /> 3<br /> bzb 2<br /> aeb 3<br /> ba 10</p><p>Sample Output</p><p>-1<br /> 8</p><p>Source</p><p>zhy</p><p></p><div>#include &lt;queue&gt;<br />#include &lt;cstdio&gt;<br />#include &lt;cstring&gt;<br />using namespace std;<br />#define MAXN 1010<br />#define MAXM 1000200<br />#define INF (1&lt;&lt;29)<br />int sumFlow;<br />struct Edge{<br />&nbsp;&nbsp;&nbsp; int u,v,cap,cost;<br />&nbsp;&nbsp;&nbsp; int next;<br />}edge[MAXM&lt;&lt;2];<br />int NE;<br />int head[MAXN],dist[MAXN],pp[MAXN];<br />bool vis[MAXN];<br />char ch[MAXN] ;<br />int k , n;<br />void init(){<br />&nbsp;&nbsp;&nbsp; NE = 0;<br />&nbsp;&nbsp;&nbsp; memset(head,-1,sizeof(head));<br />}<br />void addedge(int u,int v,int cap,int cost){<br />&nbsp;&nbsp;&nbsp; edge[NE].u=u;edge[NE].v=v;edge[NE].cap=cap;edge[NE].cost=cost;<br />&nbsp;&nbsp;&nbsp; edge[NE].next=head[u];head[u]=NE++;<br />&nbsp;&nbsp;&nbsp; edge[NE].u=v;edge[NE].v=u;edge[NE].cap=0;edge[NE].cost=-cost;<br />&nbsp;&nbsp;&nbsp; edge[NE].next=head[v];head[v]=NE++;<br />}<br />bool SPFA(int s,int t,int n){<br />&nbsp;&nbsp;&nbsp; int i,u,v;<br />&nbsp;&nbsp;&nbsp; queue&lt;int&gt; qu;<br />&nbsp;&nbsp;&nbsp; memset(vis,0,sizeof(vis));<br />&nbsp;&nbsp;&nbsp; memset(pp,-1,sizeof(pp));<br />&nbsp;&nbsp;&nbsp; for(i=0;i&lt;=n;i++) dist[i]=INF;<br />&nbsp;&nbsp;&nbsp; vis[s]=1;dist[s]=0;<br />&nbsp;&nbsp;&nbsp; qu.push(s);<br />&nbsp;&nbsp;&nbsp; while(!qu.empty()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=qu.front();qu.pop();vis[u]=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=head[u];i!=-1;i=edge[i].next){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=edge[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(edge[i].cap &amp;&amp; dist[v]&gt;dist[u]+edge[i].cost){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dist[v]=dist[u]+edge[i].cost;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pp[v]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!vis[v]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qu.push(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vis[v]=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; if(dist[t]==INF) return false;<br />&nbsp;&nbsp;&nbsp; return true;<br />}<br />int MCMF(int s,int t,int n){//最小费用最大流<br />&nbsp;&nbsp;&nbsp; int flow = 0;&nbsp;&nbsp;&nbsp; //总流量<br />&nbsp;&nbsp;&nbsp; int i,minflow,mincost;<br />&nbsp;&nbsp;&nbsp; mincost = 0;<br />&nbsp;&nbsp;&nbsp; while(SPFA(s,t,n)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minflow = INF+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=pp[t];i!=-1;i=pp[edge[i].u])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(edge[i].cap&lt;minflow)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minflow = edge[i].cap;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flow+=minflow;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=pp[t];i!=-1;i=pp[edge[i].u]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edge[i].cap-=minflow;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edge[i^1].cap+=minflow;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mincost += dist[t]*minflow;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; sumFlow = flow;//最大流<br />&nbsp;&nbsp;&nbsp; return mincost;<br />}<br />int C[33] , cnt[33] , a[111];<br />int main() {<br />&nbsp;&nbsp;&nbsp; while(~scanf("%s",ch)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int L = strlen(ch);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(C,0,sizeof(C));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;L;i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int aa = ch[i] - 'a';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C[aa] ++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = 27 * k + 30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int s = 27 * k + 28 , t = 27 * k + 29;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;26;i++) if(C[i]) addedge(s,i,C[i],0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=k;i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;26;j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(C[j]) addedge(j,i*27+j,C[j],0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%s",ch);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;a[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = strlen(ch);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(cnt,0,sizeof(cnt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;len;j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int aa = ch[j] - 'a';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cnt[aa] ++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;26;j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cnt[j]) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addedge(27*i+j,27*i+26,cnt[j],0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("a[i] is %d\n",a[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addedge(27*i+26,t,a[i],i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ans = MCMF(s,t,n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sumFlow == L) printf("%d\n",ans);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else printf("-1\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("default : sumFlow is %d , mincost is %d \n",sumFlow,ans);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></div><div><div id="problem"> 	<div> 		<p>逆序对</p> 		<p> 			TimeLimit: 1 Second &nbsp;  			MemoryLimit: 32 Megabyte 		</p> 		<p> 			Totalsubmit: 20 &nbsp;  			Accepted: 4 &nbsp;  					</p> 	</div> 	<div editor_content"=""> 		<p>Description</p>逆序对大家都知道，对于1-n的任意一个排列：a1,a2,a3...an，如果 存在i&lt;j，且ai&gt;aj，则(i,j)称之为一对逆序对。我们常常关心一个排列的逆序对的总数，因为它可以反映一个排列的有序程度。现在 LAM想知道,在1-n的所有排列中，有多少排列的逆序对总数恰好为k。<br /> <br /> <p>Input</p>第一行为正整数T,表示数据组数，接下来T行，每行两个正整数:n,k(n,k&lt;=1000)。<br /> <p>Output</p>对于每个输入，输出一行表示恰好为k的排列的个数。由于数字可能较大，只需要输出mod10000的结果即可。<br /> <p>Sample Input</p><p>1<br /> 4 1</p><p>Sample Output</p><p>3</p><p>Source</p><p>lrl</p> 	</div> </div></div><div>#include &lt;cstdio&gt;<br />#include &lt;cstring&gt;<br />#include &lt;iostream&gt;<br />#include &lt;algorithm&gt;<br />using namespace std;<br />int f[1010][1010];<br />int sum[1010][1010];<br />int n , k , T;<br />int S(int nn , int kk) {<br />&nbsp;&nbsp;&nbsp; if(kk&lt;0) return 0;<br />&nbsp;&nbsp;&nbsp; else return sum[nn][kk] % 10000;<br />}<br />void init() {<br />&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=1000;i++) f[i][0] = sum[i][0] = 1;<br />&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=1000;i++)<br />&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=1000;j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f[i][j] = (S(i-1,j) - S(i-1,j-i)) % 10000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(f[i][j] &lt; 0) f[i][j] += 10000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum[i][j] = ( sum[i][j-1] + f[i][j] ) % 10000;<br />&nbsp;&nbsp;&nbsp; }<br />}<br />int main() {<br />&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;T);<br />&nbsp;&nbsp;&nbsp; while(T--) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;n,&amp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",f[n][k]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></div><br /><p>&nbsp;</p><p><br /></p> 	</div> </div></div><img src ="http://www.cppblog.com/lenohoo/aggbug/195029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lenohoo/" target="_blank">lenohoo</a> 2012-11-10 21:44 <a href="http://www.cppblog.com/lenohoo/archive/2012/11/10/195029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]zoj 3646 并查集</title><link>http://www.cppblog.com/lenohoo/archive/2012/10/15/193336.html</link><dc:creator>lenohoo</dc:creator><author>lenohoo</author><pubDate>Mon, 15 Oct 2012 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/lenohoo/archive/2012/10/15/193336.html</guid><wfw:comment>http://www.cppblog.com/lenohoo/comments/193336.html</wfw:comment><comments>http://www.cppblog.com/lenohoo/archive/2012/10/15/193336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lenohoo/comments/commentRss/193336.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lenohoo/services/trackbacks/193336.html</trackback:ping><description><![CDATA[转自小yai<br />把b[][]数组上的每个位拆开成两个点i和i'，（不超过32位），另外新加两个点0和1,如果确定某点i对应的是0,则i与0点合并，i'点与1点合并；如果确定某点i对应的是1,则i与1合并，i'与0合并；如果确定两点i和j对应的位是相反的数,则i与j'合并，j与i'合并；如果确定两点对应的位是相同的数，则i与j合并，i'与j'合并。<br />最近比较忙，所以题解比较水，所以具体还是看代码吧。<br />因为要空出数给0点和1点，所以我从1到n而不是从0到n-1,所以奇偶性的判断要换一下。<br />#include &lt;cstdio&gt;<br />#include &lt;cstring&gt;<br />#include &lt;iostream&gt;<br />#include &lt;algorithm&gt;<br />using namespace std;<br />const int maxn = 100000;<br />int p[maxn];<br />int b[505][505];<br />int n;<br />void init() {<br />&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;(2*n+1)*32+100;i++) p[i] = i;&nbsp;&nbsp;&nbsp; <br />}<br />int find(int x) {<br />&nbsp;&nbsp;&nbsp; return x==p[x] ? x : p[x] = find(p[x]);&nbsp;&nbsp;&nbsp; <br />}<br />void Union(int x,int y) {<br />&nbsp;&nbsp;&nbsp; int a = find(x) , b = find(y);<br />&nbsp;&nbsp;&nbsp; p[a] = p[b] = p[x] = p[y] = min(a , b);&nbsp;&nbsp;&nbsp; <br />}<br />bool check() {<br />&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=n;i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i+1;j&lt;=n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i][j] != b[j][i]) return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i][i] != 0) return 0;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp; int m = 32 * n;<br />&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i+1;j&lt;=n;j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i % 2 == 0 &amp;&amp; j % 2 == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k=0;k&lt;32;k++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i][j] &amp; (1&lt;&lt;k) == 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int u = i*32+k , v = j*32+k;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(u) == find(1) || find(v) == find(1) || find(u) == find(v+m)) return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(v,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u+m,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(v+m,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(i % 2 == 1 &amp;&amp; j % 2 == 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k=0;k&lt;32;k++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i][j] &amp; (1&lt;&lt;k)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int u = i* 32 + k , v = j*32+k;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(u) == find(0) || find(v)==find(0) || find(u) == find(v+m)) return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(v,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u+m,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(v+m,0);&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k=0;k&lt;32;k++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int u = i * 32 + k , v = j * 32 + k;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b[i][j] &amp; (1&lt;&lt;k)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(u) == find(v)) return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u,v+m);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u+m,v);&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(u) == find(v+m)) return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u,v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Union(u+m,v+m);&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 1;<br />}<br />int main() {<br />&nbsp;&nbsp;&nbsp; while(~scanf("%d",&amp;n)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;b[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(check()) puts("YES");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else puts("NO");&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;&nbsp;&nbsp;&nbsp; <br />}<br /><img src ="http://www.cppblog.com/lenohoo/aggbug/193336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lenohoo/" target="_blank">lenohoo</a> 2012-10-15 21:04 <a href="http://www.cppblog.com/lenohoo/archive/2012/10/15/193336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>差分约束系统 </title><link>http://www.cppblog.com/lenohoo/archive/2012/05/17/175186.html</link><dc:creator>lenohoo</dc:creator><author>lenohoo</author><pubDate>Thu, 17 May 2012 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/lenohoo/archive/2012/05/17/175186.html</guid><wfw:comment>http://www.cppblog.com/lenohoo/comments/175186.html</wfw:comment><comments>http://www.cppblog.com/lenohoo/archive/2012/05/17/175186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lenohoo/comments/commentRss/175186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lenohoo/services/trackbacks/175186.html</trackback:ping><description><![CDATA[b - a &lt; = c&nbsp;&nbsp;&nbsp;&nbsp; &lt;==&gt;&nbsp;&nbsp;&nbsp; add_edge(a - &gt; b , c)<br /><br />限制条件是 b和a之间 有一条 距离 至少为 c 的 边 ，就是 从a 到 b 连一条 c 边<img src ="http://www.cppblog.com/lenohoo/aggbug/175186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lenohoo/" target="_blank">lenohoo</a> 2012-05-17 11:52 <a href="http://www.cppblog.com/lenohoo/archive/2012/05/17/175186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>