TJOI2015 day1解題報告

2022-07-15 01:36:10 字數 3031 閱讀 2690

的編輯器真的是太蛋疼了= =,想用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 #include5

using

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 }

view code

t2:[tjoi2015]組合數學

這是道結論題= =

某個啥啥定理說:dag的最小鏈覆蓋=最大獨立點集,可見網格圖的最大獨立點集一定是從右上到左下的一條路徑,那麼我們就可以直接dp搞了

code:

1 #include2 #include3 #include4 #include5

using

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 }

view code

t3:[tjoi2015]弦論

這道題嘛= =,50分演算法是深圳市選題,然後100分的話我們可以用sam來解決這個問題

首先我們先來考慮一下50分的演算法,sam上的每乙個節點都表示該圖中的乙個子串,所以我們可以類似dp求出答案

而對於t=1的時候,可以發現重複的字串其實都在以parents樹上該節點為根的子樹

所以我們還是可以dp一下求出來

八中上被卡常數了,老調不出來

code:

1 #include2 #include3 #include4 #include5

using

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 }

view code

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 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。...