今天考了一場51nod
的比賽,感受很自閉。或許是由於我太菜了node
連接ide
題意: 給定一張有向圖,對於每一條邊,求刪去該邊後兩端點最短路長度。ui
這題仍是比較水的,感受沒啥好說的。圖論?idea
具體看代碼吧spa
namespace Sol{ struct node{ int v,net; }e[maxn<<1]; int head[maxm],dis[maxm],tot; int a[maxn],b[maxn]; bool vis[maxm]; queue<int> q; inline void add(int x,int y){ e[++tot].v=y; e[tot].net=head[x]; head[x]=tot; } inline int bfs(int st,int ed){//處理並求解 mem(vis,false); while(q.size()) q.pop(); q.push(st); dis[st]=0; vis[st]=1; for(int i=head[st];i;i=e[i].net){//處理邊權 int y=e[i].v; if(y==ed) continue; q.push(y); dis[y]=1; vis[y]=1; } q.pop(); while(q.size()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=e[i].net){ int y=e[i].v; if(vis[y]) continue; if(y==ed) return dis[x]+1; dis[y]=dis[x]+1; vis[y]=1; q.push(y); } } return -1; } inline void Main(){ int n=read(),m=read(); for(int i=1;i<=m;i++){ a[i]=read(); b[i]=read(); add(a[i],b[i]); } for(int i=1;i<=m;i++) printf("%d ",bfs(a[i],b[i])); } }
連接.net
2code
因爲數據過大,這裏又開了個題ci
這道題看到題目我就想起線段樹。。。get
由於矩形的面積並就是線段樹寫的it
因此這就是一道 線段樹+前綴和?
因此在我看來,這是一道噁心人的題
考場上調出來了,可是隻有\(10\ pts\),還不如爆搜的\(20\ pts\)
namespace Sol{ ll ans[maxn]; struct data{ int h,l,r,k,id;//h爲高度,l,r爲區間,k爲係數,id爲編號 bool operator<(const data&x)const{return h<x.h;} }e[maxn<<2]; struct node{ int l,r; ll add,sum;//表示長度和總和,原諒我不寫len, int s,t; int lenth(){return r-l+1;} inline node operator+=(const node x){add+=x.add; sum+=x.sum;} #define l(x) tree[x].l #define r(x) tree[x].r #define s(x) tree[x].s #define t(x) tree[x].t #define add(x) tree[x].add #define sum(x) tree[x].sum//define它不香麼? }tree[maxn<<2]; inline void update(int o){ int lson=o<<1,rson=lson|1; sum(o)=sum(lson)+sum(rson); add(o)=add(lson)+add(rson); } inline void build(int o,int l,int r){ l(o)=l; r(o)=r; if(l==r) return; int lson=o<<1,rson=lson|1; int mid=l+r>>1; build(lson,l,mid); build(rson,mid+1,r); } inline void pushdown(int o){ if(s(o)){ int lson=o<<1,rson=lson|1; s(lson)+=s(o); s(rson)+=s(o); sum(lson)+=s(o)*tree[lson].lenth(); sum(rson)+=s(o)*tree[rson].lenth(); s(o)=0; } if(t(o)){ int lson=o<<1,rson=lson|1; t(lson)+=t(o); t(rson)+=t(o);//考場上寫成了+=s(o)..... add(lson)+=t(o)*tree[lson].lenth(); add(rson)+=t(o)*tree[rson].lenth(); t(o)=0; } } inline void change(int o,int l,int r,int x,int k){ if(l<=l(o)&&r(o)<=r){ s(o)+=x*k; t(o)+=k; sum(o)+=x*k*tree[o].lenth(); add(o)+=k*tree[o].lenth(); return; } pushdown(o); int lson=o<<1,rson=lson|1; int mid=l(o)+r(o)>>1; if(l<=mid) change(lson,l,r,x,k); if(r> mid) change(rson,l,r,x,k); update(o); } node ask(int o,int l,int r){ if(l<=l(o)&&r(o)<=r) return tree[o]; pushdown(o); int lson=o<<1,rson=lson|1; int mid=l(o)+r(o)>>1; node res=(node){0,0,0,0,0,0}; if(l<=mid) res+=ask(lson,l,r); if(r> mid) res+=ask(rson,l,r); return res; } inline void Main(){ int n=read(),m=read(),W=read(),L=read(),cnt=0; for(int i=1;i<=n;i++){ int x=read(),y=read(),a=read(),b=read(); e[++cnt]=(data){x,y+1,b, 1,0}; e[++cnt]=(data){a,y+1,b,-1,0}; } for(int i=1;i<=m;i++){ int x=read(),y=read(),a=read(),b=read(); e[++cnt]=(data){x,y+1,b,-1,i}; e[++cnt]=(data){a,y+1,b, 1,i}; } build(1,1,L); sort(e+1,e+cnt+1); for(int i=1;i<=cnt;i++){ if(!e[i].id) change(1,e[i].l,e[i].r,e[i].h,e[i].k); else{ node x=ask(1,e[i].l,e[i].r); ans[e[i].id]+=e[i].k*(x.add*e[i].h-x.sum); } } for(int i=1;i<=m;i++) printf("%lld\n",ans[i]); } }
只須要奇數位和偶數位對11 同餘。
咱們能夠預處理\(f[i][j]\)表示\(i\)個數字和模\(11\) 爲\(j\)的方案數。
若增長一個數\(x\),有:
\(f[i+1][(j+x)\bmod 11]+=f[i][j]\)
若減去一個數,有:
\(f[i+1][(j+x)\bmod 11]−=f[i][j]\)
如今咱們依次填入數字。
對於當前還剩下\(pos\)位,數字和爲\(S\) ,咱們能夠從高到低枚舉\(x\),並刪除\(x\),若是存在$f[pos][S]>0$0就意味有解;不然加上這個數字,考慮下一個數字。
因爲方案數較大,咱們須要考慮取模。我這裏對988244353
取模。(你找個喜歡的數字就行
namespace Sol{//namespace 真香 int cnt[maxn],f[maxn][20]; int n,sum,Max; char a[maxn]; inline void add(int x){ for(int i=Max;i>=0;i--) for(int j=0;j<11;j++) (f[i+1][(j+x)%11]+=f[i][j])%=mod; Max++; cnt[x]++; return; } inline void del(int x){ for(int i=0;i<=Max;i++) for(int j=0;j<11;j++) (f[i+1][(j+x)%11]+=mod-f[i][j])%=mod; Max--; cnt[x]--; return; } inline void Main(){ cin>>a+1; n=strlen(a+1); f[0][0]=1; for(int i=1;i<=n;i++){ sum=(sum+a[i]-48)%11; add(a[i]-48); } int half=sum*6%11; int s0=half,s1=half; for(int i=1;i<=n;i++){ int S,pos; if(i&1) pos=n/2-i/2,S=s0; if(!(i&1)) pos=(n+1)/2-(i+1)/2,S=s1; int j; for(j=9;j>=0;j--){ if(cnt[j]==0) continue; del(j); if(f[pos][S]) break; add(j); } if(i&1) s1=(s1+11-j)%11; if(!(i&1)) s0=(s0+11-j)%11; putchar('0'+j); } } }
\[ The \quad End \]
\[ \text{You better know one little thing the only thing;}\\ \text{You're gonna sling is a wedding ring.}\\ \text{《Cause You're My Zing》 - Becky G} \]