這大概是進資訊組以來考得最萎的一次了,宛如一夜回到解放前。。。
沒有一道題完整地打對了,下面對做題情況做乙個檢討
t1:理解錯題意了,qaq;
t2:逆推的時候沒有想到很好的計算方法,但測1e18發現我的計算方法只會少了一點,就天真的while加了一下,於是t飛了;
t3:一開始打了乙個n^3的dp,然後打了乙個n^2貪心對拍,結果把n^3暴力交上去了
t4:想成區間型dp了,但是要保證不下降所以轉移和狀態記錄很困難,最後5分鐘草草地打了乙個暴搜,結果連暴力分都沒拿全
t5:是原題,莫名其妙的打了乙個離散化,結果離散化的陣列開小了
t6:當時覺得是乙個巨碼農的細節題,就放棄去做t4了
這一次考試:第一有的題是真的不會做,第二是是會做的分並沒有全部拿到,寫萎的現象很嚴重
這一次暴露了對一些問題解決上的缺陷:dp,貪心以及有**難度的暴搜題,對於簡單題一遍打對能力較弱
以後要訓練基礎題的切題能力,刷洛谷之類的oj,要保證較簡單的題目的分拿穩。基礎和**能力尚弱也是目前做省選難度題速度較慢的主要原因
下面發一下訂正的題的題解:
t2:主要是講一下怎麼逆推回去
原來是每20個裡面去掉乙個,所以原來的每乙個20現在就只剩下了19
if(dis[x]%19==0) 那麼dis[y]=dis[x]*(20/19);《恰好有(dis[x]/19)份20,無零頭》
if(dis[x]%19) dis[y]=dis[x]/19+1+dis[x];《有(dis[x]/19)份20,還有乙份是不足20的零頭扣的也要加上》
// made by qt666#include#include#include#include#include#include#define rg register
using namespace std;
typedef long long ll;
const int n=500050;
const ll inf=1e18+10;
int gi()
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}int mark[n],n,m,k,head[n],to[n],nxt[n],cnt,vis[n],s,t;
long long dis[n];
void lnk(rg int x,rg int y)
struct data
};priority_queue q;
int main()
for(rg int i=1;i<=m;i++)
s=gi(),t=gi();
for(rg int i=1;i<=n;i++) dis[i]=inf;
dis[t]=k;q.push((data));
while(!q.empty()));
}else);}}
} printf("%lld\n",dis[s]);
return 0;
}
t3:考慮按左端點排序後每次o(n)的貪心調整策略,用乙個單調佇列並不斷調整;
如果兩個區間發生矛盾則優先考慮右端點小的並彈掉右端點大的,因為這樣對後面的影響最小且不會影響前面的。。。
首先我們可以去掉一些永遠不可能構成答案的區間《即完整覆蓋了別的區間的區間,選被他覆蓋的區間顯然不差於選他自己》
通過這一步操作之後《可以用單調佇列實現》我們可以發現變成了一堆左端點小的右端點也一定小的區間;
類似這樣:
那麼我們從乙個區間出發的最優策略就是每次走到左端點大於該區間右端點的第乙個區間,然後一直執行此操作;
然後我們考慮詢問區間,那麼肯定是找第乙個左端點大於等於l的區間開始(因為這個區間同時意味著右端點最小)
在保證不跳出區間的範圍內盡量的移動,這種帶條件的序列上的快速移動一般用倍增優化,然後就可以ac
// made by qt666#include#include#include#include#include#define rg register
using namespace std;
typedef long long ll;
const int n=200050;
int gi()
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}struct dataq[n],p[n];
inline bool check(rg int l,rg int r,rg int l,rg int r)
inline bool cmp(const data &a,const data &b)
}int main()
q[n+1].l=1e9+1,q[n+1].r=1e9+2;
sort(q+1,q+1+n+1,cmp);pre();
for(rg int i=1;i<=tail;i++) l[i]=p[i].l;
for(rg int i=1;i=0;j--)}}
printf("%d\n",ans);
} return 0;
}
t4:兩種方法:
1.f[i][j]表示從1到i這個位置花費j次合併為乙個不降序列的最後乙個元素的最小值《最後乙個元素最小對後面的轉移更優》
然後加乙個字首和優化;
轉移:f[i][k+i-j-1]=min(sum[i]-sum[j]>=f[j][k]時轉移,即把j+1到i合併後加到以j結尾的不降序列上,合併了i-(j+1)次)
2.f[i][j]表示從1到i這個位置不降序列長度為j的最後乙個元素的最小值《同理》
轉移:f[i][k+1]=min(sum[i]-sum[j]>=f[j][k],即把j+1到i合併後加入到以j結尾的長度為k的不降序列上,不降序列的長度加了1)
對於這種方法,f[i][j]表示的合併次數為i-j;
這兩種方法通過巧妙的設計把不降序列的最後一位記錄了下來,方便轉移
// made by qt666#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int n=100050;
const int inf=19260817;
int gi()
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}int a[n],f[350][350],sum[n],n;
int main()
}for(int i=0;i<=n;i++)
if(f[n][i]!=inf)
return 0;
}
一夜不歸 二
她走到水窪邊,蹲下身,掬一捧水撲在臉上,頓時 一股清新沁涼直入心底。這個水窪大約有北方農家小院那般大小,水窪邊長滿豐茂的水草,在上面打個滾也不會弄髒衣服。顏蕊脫掉涼鞋,脫掉 一雙精美漂亮的纖足踩在水草上,晶瑩的腳趾像粒粒珍珠般可愛。顏蕊踩著水草圍水窪走了一圈,水草柔韌細滑,搔得她的腳心癢癢的真舒服。...
那一夜寧靜
前面是夜幕下的松花江 後面是霓虹下的 大街 獨自駐立在兩者之間 那是兩個世界的交合處 寧靜與喧鬧 未知與已知 偉岸與偉大 我在苦思 向前還是向後?我是向住那安逸,抑或不捨這壯美?手捧江水,已不那麼冰寒。春水緩緩東逝 安靜無聲,唯有遠處的防洪紀念碑的浮雕 記錄了它當年的瘋狂 以前也曾來過 但從不在夜裡...
又是一夜未眠
可能每個週末都習慣了通宵,今天也不例外,聽了乙個通宵的歌,看了乙個通宵關於 的帖子,也想起了許許多多曾經熟悉和喜愛的歌。記得小時候買的第一盤磁帶就是周華健的,從此以後就一發不可收拾,只要看到沒有聽過的他的 就必定買下。在論壇上又看到這麼多的人討論華健的歌,好久好久沒聽的老歌都又從記憶裡跳出來了,看到...