swust 2014屆選拔賽 題解

2021-07-04 16:47:45 字數 4188 閱讀 6585

題目傳送門:

這是一道dp。我們假設這n個人按照水平排成一排,   可以很容易想到用dp[i][j]表示: 排到第第i個位置的人面向左邊的是第j個部位的總方案數。可以有轉移

dp[i][j]+=dp[i-1][k] ( 只要k和j 不發生衝突就可以轉移 )。總複雜度(o(16n))

ac **。

#include #include #include #include #include #include #include #include #include #include #include #include #define debug

using namespace std;

const int inf = 0x3fffffff;

const int mmax = 100010;

const int mod = 522462628;

int dir[mmax];

int dp[mmax][5];

int main()}}

int ans=0;

for(int i=1;i<=4;i++)

cout<

按照題意實際上只要是的所有的點都能聯通就可以了。因為走過的路程不需要在走了,所以實際上就是求乙個最小生成樹。只是這裡的邊的花費是2維的,那麼我們可以自定義邊權按照 len最小,其次按照cost最小排序。由於點只有1000個  ,所以用prim和kruskal演算法都能通過。複雜度分別為o(n^2)和o(mlgm);

kruskal**

#include #include #include #include #include #include #include #include #include #include #include #include #include #define debug

using namespace std;

const int inf = 0x3fffffff;

const int mmax = 1010;

struct edge

return 1;

}int fa[mmax];

int find(int x)

int main()

}for(int i=1;i<=n;i++)

fa[i]=i;

sort(e,e+num);

len=0,cost=0;

for(int i=0;i=2)

puts("don't touch me!");

else

cout<<"totlen: "<

關於區間查詢有的計數問題,只有查詢沒有更新的這類問題我也講過了,首先我們預處理出每個位置的f(a[i])的值,然後,然後用sum[i]記錄到第i個位置的字首和,那麼要查詢區間[l,r]上的答案是, ans=sum[r]-sum[l-1] (根本用不到線段樹,線段樹是用來處理有更新的)。現在的關鍵問題在於怎麼快速求出每個a[i]的f值。有一種的n√a(max)的做法,就是對於每個a[i]暴力質因子分解。    還有一種很高效的方法。  如果你發現 f[x]=f[x/d]+1(d是x的乙個質因子),那麼如果對於每乙個數我們找出了他的乙個質因子,我們就可 o(n)遞推出所有的1-1000000的f值。  對於求出每個數的乙個質因子,我們可以按照素數篩選那樣,只是標記**多乙個記錄質因子。  複雜是nlga(max)。  這題本來一開始資料是卡了√n的做法的。後來在我的強烈要求下時間限制標稱2s。放過了這種做法。

#include#include#include#include#include#define debug

using namespace std;

const int mmax = 1000010;

int num[mmax],c[mmax];

int sum[50010];

bool isprime[mmax];

void pre()//nlgn的預處理方法

int main()

while(q--)

}return 0;

}

這題最後實際上就是2個人比賽了。對於n-1個人  只需要最大的m張牌就夠了,其他的牌都沒有用的。  有2種做法,第一種是貪心。對於fm出的最大的牌,對方如果能贏,就用最大的牌去贏了好了,就是對於fm的牌,我麼重大到小如果能贏就贏,這麼保證最優。   另外一種做法。對於fm的每一張牌i,對於對面的牌j如果能贏i(j>i)就建立邊i->j。那麼你會發現最後是乙個2分圖,如果要fm贏得最少,就要選出盡量多的邊,沒選一條邊代表fm輸了,由於每張牌只能選一次,那麼實際上就是在2分圖上面找到最大匹配。當然貪心的做法複雜度最好 o(nlgn)

貪心做法:

#include#include#includeusing namespace std;

#define debug

bool flag[10005];

int s[10005];

int main()

return res;

}int main()

其中 當輸入乙個xi   c1[xi]++,d1[xi]+=i;

view code

/** author: islands

* created time: 2015/8/14 14:38:28

* file name: stand.cpp

*/#include #include #include #include #include #include #include #include #include #include #include #include #define debug

using namespace std;

typedef long long ll;

const int inf = 0x3fffffff;

const int mmax = 100010;

ll sum[31][2];

int size[31];

int main()

}printf("0\n");

for(int i=2;i<=k;i++)

}return 0;

}

純模擬,都告訴了對應座標變換關係了,只要按照題意模寫就好了。。。。。不需要任何思維難度

view code

/*

* author: islands

* created time: 2015/8/13 21:49:13

* file name: stand.cpp

*/#include #include #include #include #include #include #include #include #include #include #include #include #define debug

using namespace std;

const int inf = 0x3fffffff;

const int mmax = 300;

int photo[mmax][mmax];

int main()}}

else

}t[4*mmax];

void push_up(node &fa,node &ls,node& rs)

fa.pos=rs.pos;

}void build(int id,int l,int r)

int mid=t[id].mid();

build(id<<1,l,mid);

build(id<<1|1,mid+1,r);

push_up(t[id],t[id<<1],t[id<<1|1]);

}void update(int id,int pos,int val)

int mid=t[id].mid();

if(mid>=pos)

update(id<<1,pos,val);

else

update(id<<1|1,pos,val);

push_up(t[id],t[id<<1],t[id<<1|1]);

}node query(int id,int l,int r)

else

update(1,a,b);}}

return 0;

}

我想通過這次比賽,大家應該更加清楚怎麼的真實水平到底是什麼樣的。這場比賽不論是題目質量,還是比賽的客觀性都比前面的幾場都高,畢竟是原創題,很有針對性。希望大家下來以後還好總結暑假培訓期間的得失。 

2016 CCPC網路選拔賽 部分題解

題意 有兩顆星球,一年的長度分別為37天和173天。問第n天時它們是否為新年的第一天。思路 顯然 n 同時被37和173整除時,兩種曆法都在新年第一天,即 n 是 37 173 10001的倍數。坑點 n的長度會達到1e7,我以為要用讀入掛之類的,手寫用getchar 讀入卻tle,直接scanf ...

第五屆藍橋杯校內選拔賽

輸入乙個字串,求它包含多少個單詞。單詞間以乙個或者多個空格分開。第乙個單詞前,最後乙個單詞後也可能有0到多個空格。比如 abc xyz 包含兩個單詞,ab c xyz 包含3個單詞。如下的程式解決了這個問題,請填寫劃線部分缺失的 注意 只填寫劃線部分的 不要填寫任何多餘的內容。比如已經存在的小括號,...

2019CCPC網路選拔賽簽到題題解

因為實力不濟,沒能通過網路賽拿到晉級的名額,心情沉重,故作此文記錄本次網路賽的點滴收穫。其中包含1001 1006 shuffle card 1007 windows of ccpc 1008 fishing master的題解。題目傳送門 題目分析 要找到使 ax orc a xor c axor...