的編輯器真的是太蛋疼了= =,想用tex然後上jpg又貼不了鏈結,真的很糾結啊= =
t1:[tjoi2015]線性代數
描述:戳上面吧= =
首先這道題我覺得是這套題最漂亮的一道題了(雖然說學校的題庫裡居然有一道和這個一模一樣的= =)
首先我們可以先把那個式子轉化為
其中b[i]是表示矩陣a中第i行為0或為1,然後就有兩種方法轉化為網路流啦
方法一:可以用最大權閉合子圖的方法來考慮,將c[i]以及a[i][j]的選擇與否視為事件的話,可以發現是乙個點數為n*n的最大權閉合子圖,就可以愉快的用網路流來搞辣
方法二:我們可以看做乙個二元關係,因為可以看做i的選取會花費 c[i],而同時選擇i, j則會獲得一定的收益,那麼我們可以得到乙個二元關係(但還是需要經過一定的轉化的),然後點數就只有n啦
我只寫了方法一,雖說點數很多,但邊數少,還是很快的
還有一種水法,貌似直接把所有a相加然後減去b就行辣(資料就是這麼水= =)
code:
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6#define maxn 300000
7#define maxm 900000
8struct
edgesedge[maxm*2
];11
intnext[maxn],l;
12 inline void addedge(int x,int y,int
z) ;next[x]=l*2
;15 edge[l*2+1]=(edges);next[y]=l*2+1;16
}17#define inf 0x7fffffff
18int
s,t,h[maxn],p[maxn],gap[maxn];
19int sap(int u,int
flow)
29if (!(--gap[h[u]])) h[s]=t;
30 gap[++h[u]]++;
31 p[u]=next[u];
32return
cnt;33}
34 inline int
maxflow()
43int id[510][510
],cnt,n;
44int
main()
59for (int i=1;i<=n;i++)
64for (int i=1;i<=n;i++)
65for (int j=1;j<=n;j++)
69 printf("
%d\n
",sum-maxflow());
70return0;
71 }
t2:[tjoi2015]組合數學
這是道結論題= =
某個啥啥定理說:dag的最小鏈覆蓋=最大獨立點集,可見網格圖的最大獨立點集一定是從右上到左下的一條路徑,那麼我們就可以直接dp搞了
code:
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6#define maxn 1100
7int
f[maxn][maxn],a[maxn][maxn],t,n,m;
8int
main()
23 printf("
%d\n
",ans);24}
25return0;
26 }
t3:[tjoi2015]弦論
這道題嘛= =,50分演算法是深圳市選題,然後100分的話我們可以用sam來解決這個問題
首先我們先來考慮一下50分的演算法,sam上的每乙個節點都表示該圖中的乙個子串,所以我們可以類似dp求出答案
而對於t=1的時候,可以發現重複的字串其實都在以parents樹上該節點為根的子樹
所以我們還是可以dp一下求出來
八中上被卡常數了,老調不出來
code:
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6#define maxn 1001000
7char
s[maxn];
8 typedef long
long
ll;9
struct
sam_t[maxn];
14 sam *root,*last;
15int
t,cnt;
16 inline void add(int
x) 33
}34 last=np;35}
36 inline void
bfs()47}
48 u=q[r];
49for (int i=r;i;u=q[--i]) 54}
55char
ans[maxn];
56int
l;57
void dfs(sam *p)66}
67int
k;68
void
get(sam *p)
79 k-=p->ch[i]->size;80}
81}82int
main()
91bfs();
92dfs(root);
93if (root->size
97get
(root);
98 printf("
%s\n
",ans+1
);99
return0;
100 }
TJOI2015 Day2解題報告
在一棵n 10 5的樹上要求支援 從a點走到b點,求最大的value j value i 其中i,j是點,i在路徑中出現的位置先於j。將a b路徑上每個點的value加上v。自然可以用樹鏈剖分 lct做。每一段區間存四個數 後減前 型的最大值fmx,前減後 型的最大值bmx 這是由於有時候區間可能會...
TJOI2015 組合數學 解題報告
這不是個貪心嗎?怎麼都最小鏈覆蓋 最大點獨立集去了 注意到乙個點出度最多只有2,可以貪心一下出度的去向 按讀入順序處理就可以,維護乙個 res i 陣列,表示上一行第 i 列可以流給下面那個格仔的次數,然後如果當前這個格仔不夠用,從右往左把所有的還有次數的 res 拿過來給當前格仔用就可以了。考慮這...
NOIP 2015 Day2 解題報告(全面)
stone.cpp c pas 一年一度的 跳石頭 比賽又要開始了!這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 n 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。...