額 今天題目還行不過我狀態很差什麼都沒寫出來... 今天得分80.T1 30 T2 10分 T3 40分ios
可是我不可否定的是 題目質量仍是很不錯的 暴露的一些問題:c++
1 我又又又讀錯題目了 2 我又又又剛題了 一個顯然的模型我一直寫qwq 3 剩下的還行.數組
此題 毒瘤 我嘗試了各類 行之無效的方法 思考2h 不斷嘗試 新的方法 各類種建邊 刪邊 建反圖 無向最短路樹 ...都被我思考了一番發現仍是不能解決複雜度高的問題。或者有環又回到本身的問題。ide
關於正解 我也並不認爲其複雜度是行之有效的 (好吧我最終接受了其時間複雜度 對於每一個點 bfs一次因此複雜度 nmui
服了自閉qwq.什麼動態spfa 什麼 LCA合併法...實際上是次短路罷了.我想到一個簡潔的方法 不知道對不對. 果真仍是錯誤的仍是可能發生不合法的狀況須要記錄一下某條邊是從哪裏過來的。spa
不妨再深刻思考一下。3d
此題注意讀題 求一個矩形和其餘矩形的交的和 注意這裏是和 也就是說一個矩形和其餘矩形進行交 而後求和 讀錯題變成了 一個矩形和全部矩形的交指針
瞬間變的不可作了 交的地方 須要取交 很複雜 我想到一個暴力 指針向右掃而後 線段樹區間取交 標記永久化來實現 線段樹太多不可能下放懶標記的。那麼咱們能夠直接樹套樹了。code
這裏不說錯誤的題了 考慮正確的讀題正確的思考 我真服了憑空給本身出了一道很是難寫的題目 我認爲 多個矩形取交必定又更優秀的作法 我想是樹套樹 還好我沒寫樹套樹 線段樹套線段樹我都不知道怎麼寫來着的了。blog
何況空間也開不下 。矩形的面積的交的和 考慮怎麼求 發現仍是相似於掃描的套路 掃一下便可。
沒想好 咕了。因爲某人當時A掉了此題事後仍是不太會無奈我不咕這道題好了 整理一下統計答案的方式 和 方法。
1 首先是面積交的和 而並不是交 2 暴力很顯然吧 對於30 分二維前綴和便可 數組開vector 對於60分 考慮樹套樹 難寫 對時間和空間 要求較高 還要標記永久化什麼的 。
3 正解 考慮將問題離線下來 ,將一個矩形分紅兩部分一個大矩形和一個小矩形 作差獲得答案 (強制降維 剩下的只要按照橫座標排序就能夠實現降維的操做了由於左邊有容斥 右邊有排序 都是y軸上的問題了。
一顆線段樹維護y軸 考慮如何維護答案?因爲查詢時 和 被查詢的矩形都 得被分且有關係 因此須要構造一種統計答案的方式便可。
方式可能有不少這裏我 想了一種很獨特的方式... 對於存在的矩形來看統計答案的時候 咱們考慮一條線出現以後帶來的貢獻 後面的 面積 減掉 而後維護縱座標的len長度便可。
和這條線相對的呢 線減掉加上面積便可。 至於 查詢矩形能夠直接作了 累加 len和麪積便可。
奉上寫了一下午的代碼 緣由是 y軸可能爲0 但我線段樹的值域是 1~L 因此掛了 源神一眼幫我看出來了 真強qwq.
//#include<bits/stdc++.h> #include<iomanip> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<deque> #include<cmath> #include<ctime> #include<cstdlib> #include<stack> #include<algorithm> #include<vector> #include<cctype> #include<utility> #include<set> #include<bitset> #include<map> #define INF 1000000000 #define ll long long #define min(x,y) ((x)>(y)?(y):(x)) #define max(x,y) ((x)>(y)?(x):(y)) #define RI register ll #define db double #define pii pair<ll,ll> #define mk make_pair #define l(p) s[p].l #define r(p) s[p].r #define sum(p) s[p].sum #define len(p) s[p].len #define tag(p) s[p].tag #define laz(p) s[p].laz #define zz p<<1 #define yy p<<1|1 using namespace std; char *fs,*ft,buf[1<<15]; inline char getc() { return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++; } inline ll read() { ll x=0,f=1;char ch=getc(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} return x*f; } const ll MAXN=500010; ll n,m,cnt; ll W,L; ll ans[MAXN]; struct wy { ll op; ll x,s1,s2; ll len,s; ll friend operator <(wy a,wy b) { return a.x==b.x?a.op<b.op:a.x<b.x; } }t[MAXN<<2]; struct jl { ll l,r; ll sum,len;//sum維護面積 len 維護長度 ll tag,laz;//tag維護面積lazy tag laz維護長度lazy tag }s[MAXN<<2]; inline void build(ll p,ll l,ll r) { l(p)=l;r(p)=r; if(l==r)return; ll mid=(l+r)>>1; build(zz,l,mid); build(yy,mid+1,r); } inline void pushup(ll p) { sum(p)=sum(zz)+sum(yy); len(p)=len(zz)+len(yy); return; } inline void pushdown(ll p) { ll mid=(l(p)+r(p))>>1; if(tag(p)) { sum(zz)+=(mid-l(p)+1)*tag(p); tag(zz)+=tag(p); sum(yy)+=(r(p)-mid)*tag(p); tag(yy)+=tag(p); tag(p)=0; } if(laz(p)) { len(zz)+=(mid-l(p)+1)*laz(p); laz(zz)+=laz(p); len(yy)+=(r(p)-mid)*laz(p); laz(yy)+=laz(p); laz(p)=0; } } inline void change(ll p,ll l,ll r,ll x,ll k)//修改長度和麪積 { if(l<=l(p)&&r>=r(p)) { sum(p)+=(r(p)-l(p)+1)*k; len(p)+=(r(p)-l(p)+1)*x; tag(p)+=k;laz(p)+=x; return; } ll mid=(l(p)+r(p))>>1; if(tag(p)||laz(p))pushdown(p); if(l<=mid)change(zz,l,r,x,k); if(r>mid)change(yy,l,r,x,k); pushup(p); } inline jl merge(jl a,jl b) { a.sum+=b.sum; a.len+=b.len; return a; } inline jl ask(ll p,ll l,ll r) { if(l<=l(p)&&r>=r(p))return s[p]; ll mid=(l(p)+r(p))>>1; if(tag(p)||laz(p))pushdown(p); if(l>mid)return ask(yy,l,r); if(r<=mid)return ask(zz,l,r); return merge(ask(zz,l,r),ask(yy,l,r)); } signed main() { freopen("intersec.in","r",stdin); freopen("intersec.out","w",stdout); n=read();m=read(); W=read();L=read();L=max(L,W); for(ll i=1;i<=n;++i) { ll x,y,w1,w2; x=read();y=read()+1; w1=read();w2=read(); t[++cnt]=(wy){0,x,y,w2,1,-x}; t[++cnt]=(wy){0,w1,y,w2,-1,w1}; } for(ll i=1;i<=m;++i) { ll x,y,w1,w2; x=read();y=read()+1; w1=read();w2=read(); t[++cnt]=(wy){i,x,y,w2,0,-1}; t[++cnt]=(wy){i,w1,y,w2,0,1}; } sort(t+1,t+1+cnt); build(1,1,L); for(ll i=1;i<=cnt;++i) { if(!t[i].op) { //cout<<t[i].s1<<' '<<t[i].s2<<endl; change(1,t[i].s1,t[i].s2,t[i].len,t[i].s); //cout<<t[i].len<<' '<<t[i].s<<endl; } else { jl w=ask(1,t[i].s1,t[i].s2); ans[t[i].op]+=t[i].s*(w.len*t[i].x+w.sum); } } for(ll i=1;i<=m;++i)printf("%lld\n",ans[i]); return 0; }
30分爆搜 40分爆搜+剪枝從大到小搜搜到即return 便可獲得40分。
另類的考慮狀壓 f[i][j] 表示集合i 此時餘數是j的方案數 轉移顯然。複雜度2^n*n*10.可輕鬆經過40分。
100 顯然 咱們是沒法狀壓的咱們還須要利用取模的這個斷定 咱們還須要知道集合的使用狀況 很是的不爽qwq
其實好像動態開數組應該也行吧 可是比max操做須要高精 因此仍是歇菜。複雜度仍是太高。
此時必然有一個 另類的判斷條件 指的是 更強有力的判斷是不是11的倍數。
因而有了一個 引理:一個數是11的倍數的充要條件是奇數位的和跟偶數位的和模11同餘。(我顯然是推不出來的。
這我很自閉... 可是證實其正確性仍是能夠的 設一個數字爲 abcde *11 觀察一下變化的特徵 a(a+b)(c+b)(d+c)(e+d)e 考慮都不進位 那麼顯然。
若是有進位 那麼要麼奇項-10 偶項+1 要麼偶項-10 奇項-1 因此是11的倍數 概括可證結論正確。
那麼咱們就能夠進行線性的dp了。仍是不太會 考慮本身想一個。
這裏放出題解 暫時咕了。