全体的に、それはテストの失敗の多い、非常に短い、T3を書くために、残り未満40分、わずか2時間半のT1に死亡した、と0をバースト。いくつかのソリューションを考えているが偏在深刻な時間T3にその結果が、実装、デバッグする時間がありませんでした。
おそらく、審査プロセスは、3つの質問を見てT3は非常に簡単です見つけることですし、次に考えるようになった、3分の秒式オフ、およそ7時22彼は(それが特別な文に加えて、実際に切断していることが判明したカットオフ、そして、私は)表を見オープニング試験前の7分。次に、2つの半分の寄与に分割された第1の質問を見に戻って(1)$得られた、矩形を計算$ O(N ^ 2)$の間とすることができる$ Oであってもよい矩形内部矩形と内側の長方形との間に見出されたが厳密には$ O(N ^ 2)$は、長方形のプロのエッジの間に少しので、彼はそれに飛びついたていないとき。値が小さいほど、より非常に困惑私を矩形が、最終的にチューンアウト(実際には長方形の境界処理しないことがわかっデバッグするときの結果は、サンプルが必死だった大きすぎる20分のために書くことができない問題であり、負がありました)。だからT2を行い、第二は、(完璧ではないが、しかし、ほとんど不可欠と正ソリューション、合併に加えて)基本的なソリューションであり、その後、10分には、ちょうど小さなサンプル、または大きなトラブルの上に、2つのツリーを維持するために始めたノックとても幸せT3バースト0、試験の最後に転送されています。
次は、問題を解決するが、このことは、この調査の最も重要な成果ではない場合、私はそれは私が最後に言う考え方、上のいくつかの光を当てるべきだと思います。
T1:
ポイントは本当に暴力なしレベルです書くことは、私はあまりにも怠惰な。
二つの部分での貢献、
内部の貢献= $ 2(X2-X1)(Y2-Y1)$
貢献= $ 2境界(境界長)+ [終了座標が同じではない] + $ [座標の他端は、同じではありません]
あなたは$ブレーク$を入れ替えることができたときに暴力列挙は無境界まで追加することができます
T2:
質問比較的強い、いくつかのバイナリ検索トップ$サイズ$ $ kは$を考える、診察室のタイムラインの成果を考える合併の(偽のツリーライン合併、合併はヒューリスティックしなければならない)だと思います。
私は木のラインは、セキュリティの複雑さにすべてのノードをマージされていますが、合併を決定することはできません後にまだ貢献で何点横断していないので、それは私は非常に不快になり、何も結果がなかった長い時間のように、私は最終的に暴力を取りましたこの方法は、ノードが二重カウントされ、寄与は0に設定されているが、計算を繰り返すであろう、例えば、一定時間サブツリーに役に立たない計算された暴力、合併処理の後、次のサブツリーをチェック彼はその後、あなたがチェックすることはできませんが、私はテストにそれを考えていなかったので、多分私はアイデアをマージ枯れ木ラインを保存することができ、有用であることが継続することはありません。
残りは合併ヒューリスティックです。合併とは何でしょうか?私たちは、おそらくあなたは、これは非常に暴力的だと思う、ツリーライン、マージ操作をマージしていないが、彼は、特定の複雑保証$(O(nlog_2n))$を持っています。
ヒューリスティック合併は、実際には非常に簡単です、あなたが来てどのようにコスト、複雑さを、最小限に抑えるために作ることができれば、大きな、その内側に詰め、小さなを入れているのですか?私たちは、それぞれ合併の複雑さは、(O(n))は$、最悪の場合は、私はあなたとあなたのようなぬいぐるみの大きなを取るたびに、私は倍増しそうたびに、つまり、増加していること$をされていると仮定します(log_2n)$回、その後、総複雑さは$ O(nlog_2n)$ $です
複雑さが保証され、その後、どのようにそれをマージするには?木を考えてみましょう「大」を意味します。退廃的な非常に詳細な説明を理解するだろう。はい、それは重い息子です。ヘビープロセスが完了した後、あなたの息子は最大のサブツリー、他のサブツリーマーキング直接オンラインセグメントツリーを除去することが可能であり、あなたは操作が彼の息子の重量に基づいて動作を確立したいので重い息子は削除しないでくださいそれは、その複雑性を確保することができます。
私は、このような暴力的な方法ツリーラインを維持するために期待していませんでした。。。
自分の息子の再挿入操作は$ベクトル$(再息子の操作は私以上のものにする、すべての後、私は一般的にノードを持っている)してから位置を切り替え、私の息子の操作$ベクター$に、他の光なので、ヒューリスティック合併の数の完了は、保証の複雑さは$ O(nlog_2n)$です。
ただ、突然、一瞬考えて、分裂の深刻度はバイトサイズ分割の基準としてポイントにすべきではない、と$ベクトル$の子ノードのサイズを使用する必要があり、彼はほとんど$ 100ミリ秒$でした。
セグメントツリーに対応する各操作が最後に変更又は削除されました。
総複雑さは$(nlog_2 ^ 2N)O $です
このプロセスは、すべての再帰的に行われ、この質問は完璧な解決策になることができます。
彼は比較的ずさんな、コメント欄を理解していないと述べました。
1 #include<cstdio> 2 #include<cmath> 3 #include<vector> 4 #include<iostream> 5 #include<map> 6 using namespace std; 7 const int maxn=1e5+5,INF=0x3f3f3f3f; 8 map<int,int> mp; 9 vector<int> bl[maxn],dr[maxn]; 10 int n,m,q,cnt,tot,x,y,a[maxn],first[maxn],ans[maxn],sz[maxn],son[maxn],t[maxn]; 11 struct road{ 12 int u,t,nxt; 13 }eage[maxn<<1]; 14 void add(int x,int y) 15 { 16 eage[++tot].u=x; 17 eage[tot].t=y; 18 eage[tot].nxt=first[x]; 19 first[x]=tot; 20 } 21 struct SegmentTree{ 22 int tot,data[maxn<<2],sz[maxn<<2],f[maxn<<2]; 23 void FoundData(int x) 24 { 25 data[x]=data[x<<1]+data[x<<1|1]; 26 sz[x]=sz[x<<1]+sz[x<<1|1]; 27 } 28 void LazyDown(int x) 29 { 30 if(!f[x]) return ; 31 f[x<<1]=f[x<<1|1]=1; 32 data[x<<1]=data[x<<1|1]=sz[x<<1]=sz[x<<1|1]=0; 33 f[x]=0; 34 } 35 void Updata(int x,int l,int r,int p,int d,int num) 36 { 37 data[x]+=d;sz[x]+=num; 38 if(l==r) return ; 39 int mid=(l+r)>>1; 40 LazyDown(x); 41 if(p<=mid) Updata(x<<1,l,mid,p,d,num); 42 else Updata(x<<1|1,mid+1,r,p,d,num); 43 FoundData(x); 44 } 45 void Sectiondin(int x) 46 { 47 data[x]=sz[x]=0;f[x]=1; 48 } 49 int SectionQuery(int x,int l,int r,int sum) 50 { 51 // cout<<l<<" "<<r<<"==="<<sz[x]<<" "<<data[x]<<" "<<sum<<endl; 52 if(sum<=0) return 0; 53 if(l==r) return data[x]; 54 int mid=(l+r)>>1,ans=0; 55 LazyDown(x); 56 if(sz[x<<1]<=sum) 57 { 58 ans+=data[x<<1]; 59 ans+=SectionQuery(x<<1|1,mid+1,r,sum-sz[x<<1]); 60 return ans; 61 } 62 else return SectionQuery(x<<1,l,mid,sum); 63 } 64 void init(int x) 65 { 66 // cout<<x<<"##init"<<endl; 67 for(int i=0;i<bl[x].size();i++) 68 { 69 int col=bl[x][i],r=dr[x][i]; 70 // cout<<col<<" "<<sz[1]<<endl; 71 if(!t[col]) Updata(1,1,m,r,1,0),t[col]=r; 72 else if(t[col]>r) 73 { 74 Updata(1,1,m,t[col],-1,0); 75 Updata(1,1,m,r,1,0); 76 t[col]=r; 77 } 78 Updata(1,1,m,r,0,1); 79 } 80 } 81 void dinit(int x) 82 { 83 Sectiondin(1); 84 for(int i=0;i<bl[x].size();i++) t[bl[x][i]]=0; 85 } 86 }zt; 87 void insert(int x,int y) 88 { 89 for(int i=0;i<bl[y].size();i++) 90 { 91 bl[x].push_back(bl[y][i]); 92 dr[x].push_back(dr[y][i]); 93 } 94 bl[y].clear();dr[y].clear(); 95 } 96 void dfs1(int x,int fa) 97 { 98 sz[x]=bl[x].size(); 99 for(int i=first[x];i;i=eage[i].nxt) 100 if(eage[i].t!=fa) 101 { 102 dfs1(eage[i].t,x); 103 sz[x]+=sz[eage[i].t]; 104 if(sz[son[x]]<sz[eage[i].t]) son[x]=eage[i].t; 105 } 106 } 107 void dfs(int x,int fa) 108 { 109 for(int i=first[x];i;i=eage[i].nxt) 110 if(eage[i].t!=fa&&eage[i].t!=son[x]) 111 { 112 dfs(eage[i].t,x); 113 zt.dinit(eage[i].t); 114 } 115 if(son[x]) dfs(son[x],x); 116 zt.init(x); 117 for(int i=first[x];i;i=eage[i].nxt) 118 if(eage[i].t!=fa&&eage[i].t!=son[x]) 119 zt.init(eage[i].t); 120 // cout<<x<<":"<<endl; 121 ans[x]=zt.SectionQuery(1,1,m,a[x]); 122 if(son[x]) 123 { 124 insert(son[x],x); 125 swap(bl[son[x]],bl[x]); 126 swap(dr[son[x]],dr[x]); 127 for(int i=first[x];i;i=eage[i].nxt) 128 if(eage[i].t!=fa) 129 insert(x,eage[i].t); 130 } 131 } 132 int main() 133 { 134 scanf("%d",&n); 135 for(int i=1;i<n;i++) 136 { 137 scanf("%d%d",&x,&y); 138 add(x,y);add(y,x); 139 } 140 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 141 scanf("%d",&m); 142 for(int i=1;i<=m;i++) 143 { 144 scanf("%d%d",&x,&y); 145 if(mp[y]==0) mp[y]=++cnt,y=cnt; 146 else y=mp[y]; 147 bl[x].push_back(y); 148 dr[x].push_back(i); 149 } 150 sz[0]=-1; 151 dfs1(1,0); 152 dfs(1,0); 153 scanf("%d",&q); 154 while(q--) 155 { 156 scanf("%d",&x); 157 printf("%d\n",ans[x]); 158 } 159 return 0; 160 }
T3:
说实话真的很水,三分钟秒掉式子。大概说一下。
设$dp[i][j]$为前$i$题最高难度为$j$的概率,$w[i]$为每种难度的劳累值。
初始化:
$dp[0][0]=1$
转移:
$dp[i][j]=inv_m(\sum \limits_{k=0}^j dp[i-1][k]+(j-1)dp[i-1][j])$
解释一下,我当前的最大难度是$j$的可能性有两个:
1.我之前某些点或者达到或者没达到,但是在我这里都达到了,也就有了前面那个$\sum$
2.我之前某些点达到了而我没有达到,那就是我有$(j-1)$种情况,所以乘上$(j-1)$。
然后就切掉了。
下面说些心态的问题:
我当时秒切T3觉得自己可厉害了可厉害了我心想这次稳了啊,爷要AK了啊,结果结果还是T1一调不出来心态就崩了,心想我怎么就调不出来。
心态这个东西很微妙,你永远不知道他怎么调整或者有什么影响。我之前能做到的是考前不对这次考试报任何希望,可是在答题过程中却犯了这些禁忌,期望过高了,导致一但有什么波折就死心态。如果你是真的强三道题都全秒掉的话其实也没啥问题,但是我这种一般人做不到全秒,而且喜欢自负的觉得自己能做到全秒。虽然真的基本都正解了,可是还是能力不足没有拿到分数。
那再立个$flag$下次要做到的是不在考前有任何期望,不再考试的时候有任何期望,心如止水。
还有另外一个东西叫舍得。
有舍才有得,考场上很多东西都要懂得取舍,不是文化课那两下子,直接从头做就行了的,可能丢失掉这一部分会换来更大的成绩,这时候应当不再优柔寡断,不要在侥幸的以为在过五分钟你就能调出来,事实上到考试结束你也调不出来。舍得出去才能有得到,这是毋庸置疑的,考场上就那么多时间,拿到做多得分是最重要的,而不是去作出一道你耗费了大量心血或者一眼正解的题,没有意义,这是考试不是刷题,刷题刷一天也没人管你,但考试就三个半钟头,考的出来是他,考不出来也是他了。
但是有时候并非有舍一定会有得,可能舍弃的是一个重要的作出某道题机会。但是考场时间非常紧迫,不管对错的选择,都没有时间回头想。
为自己的选择决定,决定了就去做,为决定负责,即使即将要为他后悔,在所不辞。
什么都无法舍弃的人什么也无法改变。
想起来之前看到的一句话,虽然没什么关系,但至少教会你负责任。
你是个小人物,一生难得做几件大事,这个机会很宝贵。死一个人不要紧,自己死了也不要紧。你可以偶尔发个疯,可是有些事不能逃避,该做的事情必须要做,树要开花,人要长大。
——江洋
以上。