ACM訓練日記

2021-08-18 10:08:54 字數 2834 閱讀 2797

下午打了一場練習賽,從做d題來看讀題不認真,複雜**實現起來還是太慢。e題我的思路並不夠靈活。一直糾結於de兩題,其實f題和h題都應該做出來的。    還有英語qaq。

整理下今天的練習賽。

zoj—3939

題意:當周一是在乙個月的1,11,21日時被稱為幸運日。給出乙個日期是第乙個幸運日,求第k個幸運日的日期。

因為資料量k<=1e9,所以必定是打表找規律。

這個題打下表就能發現400年一迴圈的規律。

**來自:

typedef long long ll;  

struct point  

};  

point a[10000];  

int n;  

int cnt;  

int d1[13] = ;  

int d2[13] = ;  

bool check(int x)  

void init()  

day += 7;  

}  day -= tmp;  

}  }  

}  int main()  

//printf("y = %d mid = %d tmp = %d\n", y, mid, tmp);  

ll t1 = 0, t2 = 0, t3 = 0;  

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

t1 = (ll)a[g].year + (ll)(mid + ind) * 400;  

t2 = (ll)a[g].month;  

t3 = (ll)a[g].day;  

break;  

}  }  

printf("%lld %lld %lld\n", t1, t2, t3);  

}  return 0;  

}  

zoj3940—modulo query

題意:f(1, x) = x mod a1.

f(i, x) = f(i - 1, x) mod ai (2 ≤i≤n)

求f(n,x)=y,給出y,求有多少個x(x<=m)滿足f(n,x)=y。

其實這道題就是求((x mod a1)mod a2)...)mod an=y。求x有多少個x(x<=m)滿足條件。

這道題思路絕對是腦洞清奇。開拓思路。就是0到m這每個區間進行疊加,比如(1,m)的區間上所有數對a1取模,所得數必定在(0,a1-1)之間,下面可以快速算出大約有多少個區間變成了(0,a1-1),繼續依次取模a2...。

這是官方題解:

可以觀察到乙個區間對乙個數取模後的結果也可以用區間來表示,並且這些區間的左端點都是0。於是直接用乙個map存每次取模之後的區間和這個區間出現次數,要取模的時候,找出所有右端點大於等於當前模數的所有區間,暴力算一下結果即可。對於查詢,二分下位置,求個字尾和就好了。下面分析下複雜度為什麼是對的。

眾所周知:乙個數對一堆數取模,最多會有\log

log次值的改變。對於這題每對乙個新數取模,最多隻會增加乙個區間。考慮當前區間是[0,v_i][0

,v​i

​​],要對x

x取模,那麼對於v_i < xv​

i​​<

x的區間沒有變化,對於v_i \ge xv​

i​​≥

x的那些區間會變成[0,v_i \text x][0

,v​i

​​mo

dx],並且可能會新增區間[0,x-1][0

,x−1

]。這個過程其實相當於每個a_ia​

i​​對後面所有數依次取模,那麼總共會有o(n \log n)o(

nlogn)

次值的改變,每次改變需要在map上修改一下,總複雜度是o(n\log^2n)o(

nlog​2

​​n)

的。

**:#define maxn 500005  

const int mod = 1e9+7;  

int sum[maxn];  

int ans[maxn];  

struct node// 區間[0, right]以及該區間出現的次數cnt  

bool operator<(const node &a) const  

}tp[100005];  

int main()  

}  int cnt = 1;  

while(!que.empty()) //將最後得到的所有區間存在乙個陣列中  

sort(tp+1,tp+cnt); //將各個區間進行從小到大排序  

memset(sum, 0, sizeof sum);  //初始化為0  

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

int q;  

cin>>q;  

long long out=0;  

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

cout題意:給出k是持續興奮的天數,給出若干個區間作為可以選擇的開始點,求怎麼樣選可以興奮總天數最多。

思路1:先合併區間,從第乙個區間的第乙個點開始放,放1,k+1,,當下乙個點放的區間右端在區間中不用管,繼續向後放。如果不在,記錄一下如果放可以得到多少。放完以後如果還有剩餘在把儲存的依次大到小拿出來。

思路2:當遇見右端點不在區間中時,dfs兩個方向,放前乙個的,放後乙個的左端。

推薦部落格:

zoj—3944

就是大暴力,暴力找該點不是「.」的就消一下周圍滿足條件的。

ACM訓練日記 8月4日

今天雖然只a了三個題,但感覺也算是扎扎實實的三道題,分別是數獨,塗顏色,分兩組。數獨這道題很明顯是深搜,9 9的方格填滿數,使得橫排,豎排,和9個3 3的小方塊只有1到9不重複的九個數,該題的關鍵就是做好數字使用過的標記,要做三個vis i j 然後就只需要吧空著的方塊填入判斷填數字,遞迴到填滿為止...

ACM訓練日記 8月8日

經過今天的訓練,還真有點累,主要因為是下午的訓練賽,前兩道題特別的簡單,可到了第三題就直接麼懵了,最鬱悶的是賽後看題解還完全看不懂,是線性dp的問題,看了好幾篇部落格,還是半懂,甚至開始懷疑自己動態規劃怎麼學的,明天還是先了解下線性dp的事再看這道題吧。另外利用上午和晚上的時間,勉強a了三道題。第一...

ACM訓練日記 8月17日

今天除了上午繼續看樹狀陣列課件以外,下午進行了第一次團體訓練,雖然成績不怎麼理想,從中也找到自己許多的不足。做第一道題時其實就有些困難,雖然我們是第乙個做出來的,給了幾頭牛的重量與強壯度,要求把這些牛摞起來,每頭牛的風險是該頭牛上面的牛的重量相加減該牛的強壯度,求怎麼摞起來使最大風險最低,這道題很明...