Time of Update: 2018-12-04
題意:給定一個括弧序列,可以對它進行set,對把一定範圍內的括弧變成某一種括弧,reverse把左右括弧互換,query一定範圍內的括弧序列是否合法。做法:一開始的想法,節點記錄未匹配的左右括弧數,然後進行操作,因為小看了reverse操作(本來以為簡單的把左右括弧的值改一下就好了,可是...),WA。然後百度大神,重要發現了一個好演算法。造成一我錯
Time of Update: 2018-12-04
hdu 2147 kiki's game根據最初的理論畫個圖,就可以把勝負的規律找出來了#include <iostream>#include <cstdio>using namespace std;int main(){ int n,m; while(~scanf("%d%d",&n,&m)&&(m||n)) { if(n%2&&m%2) printf("What a
Time of Update: 2018-12-04
題意:有一個賣麵包的姑娘,如果過了w分鐘仍舊沒有客人來的話,他就會睡著,如果客人在他睡著的時候來的話,客人會把她叫醒,然後離開。每個客人會以不同的價格買麵包,姑娘會買給第i個客人(i-1)%3+1塊麵包,求在收到的錢做多的情況下的最小的w.做法:唉,沒想到....只能看大神的。10W個人用線段樹是沒錯的。要求最小的w,可是為了可以讓客人買到麵包,這裡的w的值是離散的,即相鄰兩個客人之間的間隔。一開始還腦殘的以為可以2分答案...先對每個客人根據到來的時間進行排序,然後算出每個客人的w,然後再根據
Time of Update: 2018-12-04
做法:用個棧就過了,然後數組l[i]記錄,以這個點為終點的最長括弧序列。明白什麼是字串啊....#include <iostream>#include <utility>#include <stack>#include <cstdio>#define LMT 1000003using namespace std;int len,ans;char bra[LMT];int l[LMT];//沒有考慮到連續 ()()()()int main(){
Time of Update: 2018-12-04
題意:額,只要注意each的意思做法:基本的並查集技術,只要理解了each的意思...#include<cstdio>#define LMT 2002using namespace std;int get[LMT],fs,father[LMT];int work(int u){ int x=u; while(x!=father[x]) x=father[x]; father[u]=x; return x;}int main(void){
Time of Update: 2018-12-04
題意:一個樹狀圖一般的國家,有兩個王子要設立自己的首都,首都周圍的城市選擇裡他們近的那個首都效忠(即那個王子得到了那些城市,當距離一樣使,選大王子效忠),大王子先選擇首都。問在兩者的最優策略下,大王子最多能夠得到幾個城市。做法:枚舉大王子會選擇的城市。這種情況下,樹被分成了很多子樹,小王子必須離大王子足夠近才可獲得最多的城市。以後這種二元的貪心,就枚舉第一個,然後再貪心第二個。。 記得記得#include
Time of Update: 2018-12-04
題意:求兩棵二叉樹中同構的子樹對。做法:首先透徹什麼叫二叉樹的子樹!!然後,不要貿然就用hash,二叉的獨特性質使這道題可以很好的用map解決,記得記得!!最後,最重要的是ZOJ中可能只能識別%lld#include<utility>#include<cstdio>#include<map>#define LMT 100005#define LL long long//二叉樹同構要分左右的//雜湊還是少用比較好啊//map庫的作用using
Time of Update: 2018-12-04
題意:列車員要抓逃票的人。列車員在火車中來回巡邏,起點為cp,每分鐘移動一個車廂。逃票的人可以進入任一相鄰車廂,或者不動。火車停了的時候,逃票者下車,新的逃票者選擇一個車廂進入,問是否可以抓到這個人,何時抓到。做法:貪心。如果列車員面對逃票者,逃票者和售票員往相同的方向跑,否則,就原地不動。放置時一般可以放在列車員背後,可是有特殊情況(程式中有)。列車員會轉身,是方向改變(以開始寫成像迴圈鏈表一樣的東西了...)。類比一下就好了.這種小規模題,直接類比#include <iostream&
Time of Update: 2018-12-04
145C - Lucky Subsequence題意:在一串數中任取K個數,問有幾種情況是不含有兩個相同的luky number組合數計算模版,這個是超大型的組合數啊#include<cstdio>#include<iostream>#include<map>#define X 100010#define mod 1000000007using namespace std;typedef long long LL;map<int,int>
Time of Update: 2018-12-04
題意:在一個幾乎無限大的棋盤上,有一個起點和終點。有一些格子是不可走的,一個問一個王從起點走向終點所需要的最小步數。王可以向八個周圍的格子走。做法:最多才100W個點,BFS暴力。#include<iostream>#include<map>#include<deque>#include<cstdio>#define LMT 1000005using namespace std;//bfs,最短路也可用BFS暴力的//只有一百萬個點,而且行動單一,
Time of Update: 2018-12-04
題意:j老師分糖,給成績好的人糖多。輸入學生隊伍,LR=,來確定成績的增長方式,L代表左邊的人比自己高,R表示右邊的高,=表示左右相等。在保證分糖最少的情況下,輸出每個學生所分得的糖。做法:先假設每個同學都分了一顆糖,然後看左右學生的成績,LL,表示只考慮左邊同學成績的情況,RR表示只考慮右邊同學的情況,這樣,往左邊往右邊遍曆,看見比他低的就加一,去LL,RR中的最大值#include<cstdio>char s[1001];//只要兩邊可以對接int main(void){int
Time of Update: 2018-12-04
做法:其實只要過了13 5 4 2 這組資料基本沒什麼問題了。。。哎,早知道用樹狀數組了...題目中的裁判是要位置在兩個運動員之間,而且能力也在他們之間的,好在每個人的rank都不一樣。可以先記錄每個人的rank還有位置,然後按照rank進行排序。建立三棵線段樹,一棵的節點記錄每個人,還有兩棵是分別記錄某個人左邊比他rank低的人的數量,某個人右邊rank低的人的數量。然後就按照排序過後的順序進行插入、尋找#include<cstdio>#include<cstring>
Time of Update: 2018-12-04
做法:注意更新,其實重疊就是有一個地區下方有2條以上沒有被消除的線段。#include<cstdio>#include<algorithm>#include<cstring>#define eps 1e8#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=4002;using namespace std;struct line{ double x1,x2,y;
Time of Update: 2018-12-04
做法:歐拉路中要麼每個點的度數都是偶數,要麼,只有兩個度數為奇數的點。#include <iostream>#include <cstring>#include <cstdio>const int LMT=100003;using namespace std;int du[LMT];int main(){ int T,n,m; scanf("%d",&T); while(T--) {
Time of Update: 2018-12-04
95B - Lucky Numbers做法:要找出最小的數,可以貪心的先看這一位可否變成4,如果不可再換7,然後用DFS看每一種狀態是否可以存在。這種無法機械遞推,而且可以有明顯剪枝地方的題,要記得用DFS#include<cstdio>#include<cstring>/*******抽時間要細想想DFS啊*****/const int LMT=100005;int len;char num[LMT],ans[LMT];bool dfs(int pos,int
Time of Update: 2018-12-04
題意:重要的是求某個區間最長的1區間。#include<cstdio>#include<cstring>#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=100004;int ox[LMT<<2],lsum[2][LMT<<2],msum[2][LMT<<2],rsum[2][LMT<<2];void init(void){
Time of Update: 2018-12-04
這幾題基本一樣啊hdu 3911hdu 3997POJ 2892#include<cstdio>#include<cstring>#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=100005;int
Time of Update: 2018-12-04
題意:隨意設計n個顧客的排列順序,求其中餐廳內客人數量的期望。做法:求出i個客人在房內消耗t的情況數量。然後統計一下,這裡一定會注意其中的重複情況,其實一個重複x次的情況,正式因為這個情況中還有x個人。要仔細判斷重複的產生情況。#include <iostream>#include <cstdio>#define LMT 55//先把總的情況的個數算出來,然後再除以總情況using namespace std;double dp[LMT][LMT];int
Time of Update: 2018-12-04
題目意思:在一個序列只有O,X,分數為每個O 連塊長度的平方的和,輸入每個位置出現O 的機率,求分數期望.做法 參考: http://codeforces.com/blog/WJMZBMR#include<stdio.h>/*轉化題目,變為找出i,j對數,其中i<j,並且i,j之間沒有X,並計算出O的總數,最後的分數為O的總數+pair(i,j)的數量*///機率題盡量把機率值和權值分離int main(){double tem,pre=0.0,ans=0.0;int
Time of Update: 2018-12-04
題意:在一個無相圖中有N個長度為3 的迴路,輸出合格圖。注意此圖的節點數不得超過100做法:貪心手法。點最多一百個,那麼,要讓每個點的作用都發揮出來。所有,可以類比每次加入點所帶來的影響,來確定,兩個點是否要串連。#include <iostream>#include<cstdio>using namespace std;int c[103],have[103],ans,k,ss;bool gra[103][103];int main(){ int n,i,j,k;