Noip模擬35 2021.8.9

T1 Merchant

一眼二分,而後想了想維護凸包,好像並無什麼關係,html

而後又想了想維護一個棧,發現跳指針細節過多不想打c++

最後直接打了二分,大點跑的飛快,感受比較穩,出來$78$分ide

是沒用神奇的$\textit{nth_element}$致使排序時間長了,加上就$A$了spa

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 const int NN=1e6+5;
 5 int n,m,S,tmp1,zhi[NN];
 6 struct SNOW{int k,b;}p[NN];
 7 inline bool cmp1(SNOW a,SNOW b){return a.b==b.b?a.k>b.k:a.b>b.b;}
 8 inline bool cmp(int a,int b){return a>b;}
 9 inline bool check(int t){
10     int ans=0;
11     for(int i=1;i<=n;i++) zhi[i]=p[i].k*t+p[i].b;
12     nth_element(zhi+1,zhi+m+1,zhi+n+1,cmp);
13     for(int i=1;i<=m;i++){
14         if(zhi[i]<=0) continue;
15         ans+=zhi[i];
16         if(ans>=S) return 1;
17     }
18     if(ans<S) return 0;
19     else return 1;
20 }
21 namespace WSN{
22     inline short main(){
23 //        freopen("merchant3.in","r",stdin);
24         scanf("%lld%lld%lld",&n,&m,&S);
25         for(int i=1;i<=n;i++){
26             scanf("%lld%lld",&p[i].k,&p[i].b);
27             if(p[i].k<=0) ++tmp1;
28         }
29         if(tmp1==n){puts("0");return 0;}
30         sort(p+1,p+n+1,cmp1);int tot=0;
31         for(int i=1;i<=m;i++){
32             tot+=p[i].b;
33             if(tot>=S){puts("0");return 0;}
34         }
35         int l=0,r=1e9,ans=l;
36         while(l<=r){
37             int mid=l+r>>1;
38             if(check(mid)) ans=mid,r=mid-1;
39             else l=mid+1;
40         }printf("%lld\n",ans);
41         return 0;
42     }
43 }
44 signed main(){return WSN::main();}
沒有鴨行的優秀代碼

 

T2 Equation

大力的進行跳爹,指望加上個$spj$能多拿幾分,只是由於思想太清奇把題想難了。。指針

直接用柿子等量帶換往下推,能推出來加入的方程用$x_1$怎麼表示,code

而後發現能夠直接預處理出來任意一個點的只關於$x_1$一個未知數的表達式裏邊的常量htm

用線段樹維護這個常量便可實現對$x_1$的$log$級求解blog

發現對於一個深度爲偶數的點,他知足奇加偶減(奇偶對於深度)的關係(就是那個求$x_1$的表達式)排序

那麼咱們只把全部的點看成偶點,進行維護,每次查詢的時候判斷一下新加入方程兩點的深度奇偶性,適當進行反轉便可element

線段樹要卡一下常,建議快讀。。。

 1 #include<bits/stdc++.h>
 2 #define lid (id<<1)
 3 #define rid (id<<1|1)
 4 #define LL long long
 5 #define rint register int
 6 using namespace std;
 7 inline LL read(){
 8     int x=0,f=1; char ch=getchar();
 9     while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10     while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11     return x*f;
12 }
13 int n,q,w[1000001],sm[1000001],opt,uu,vv,xx,cha,dfn[1000001],dep[1000001],siz[1000001],cnt,head[1000001],rp;
14 LL ss,ans1,ans2;
15 struct SNOW{int to,next;};SNOW e[1000001];
16 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]}; head[x]=rp;}
17 struct SNOWtree{
18     LL sum[1000001<<2],laz[1000001<<2];
19     inline void pushdown(int id){
20         if(!laz[id]) return;
21         laz[lid]+=laz[id]; laz[rid]+=laz[id];
22         sum[lid]+=laz[id]; sum[rid]+=laz[id];
23         laz[id]=0;
24     }
25     inline void insert(int id,int l,int r,int pos,LL v){
26         if(l==r){sum[id]=v;return;}
27         int mid=l+r>>1;
28         if(pos<=mid) insert(lid,l,mid,pos,v);
29         else insert(rid,mid+1,r,pos,v);
30     }
31     inline void update(int id,int l,int r,int L,int R,int v){
32         if(L<=l&&r<=R){
33             sum[id]+=v*1ll;laz[id]+=v*1ll;
34             return;
35         }pushdown(id); int mid=l+r>>1;
36         if(R<=mid) update(lid,l,mid,L,R,v);
37         else if(L>mid) update(rid,mid+1,r,L,R,v);
38         else update(lid,l,mid,L,mid,v),update(rid,mid+1,r,mid+1,R,v);
39     }
40     inline LL query(int id,int l,int r,int pos){
41         if(l==r) return sum[id];
42         pushdown(id);int mid=l+r>>1;
43         if(pos<=mid) return query(lid,l,mid,pos);
44         else return query(rid,mid+1,r,pos);
45     }
46 }tr;
47 inline void dfs(int f,int x){
48     dep[x]=dep[f]+1; dfn[x]=++cnt; siz[x]=1;
49     (dep[x]&1)?(sm[x]=sm[f]-w[x]):(sm[x]=sm[f]+w[x]); tr.insert(1,1,n,dfn[x],sm[x]);
50     for(rint i=head[x];i;i=e[i].next) dfs(x,e[i].to),siz[x]+=siz[e[i].to];
51 }
52 namespace WSN{
53     inline short main(){
54 //        freopen("1.in","r",stdin);
55         n=read();q=read();
56         if(!q) return 0;
57         for(rint i=1,u;i<n;++i){
58             u=read(); w[i+1]=read();
59             add(u,i+1);
60         }dfs(0,1);
61         while(q--){
62             opt=read();
63             if(opt==2){
64                 uu=read();vv=read();
65                 cha=w[uu]-vv;w[uu]=vv;
66                 tr.update(1,1,n,dfn[uu],dfn[uu]+siz[uu]-1,(dep[uu]&1)?cha:-cha);
67                 continue;
68             }
69             if(opt==1){
70                 uu=read();vv=read();ss=read();
71                 ans1=tr.query(1,1,n,dfn[uu]),ans2=tr.query(1,1,n,dfn[vv]);
72                 if(dep[uu]&1) ans1=-ans1;
73                 if(dep[vv]&1) ans2=-ans2;
74                 ss-=ans1+ans2;
75                 xx=((dep[uu]&1)?1:-1)+((dep[vv]&1)?1:-1);
76                 if(!xx&&!ss){puts("inf");continue;}
77                 if(!xx||(ss*1.0/xx*1.0-ss/xx!=0)){puts("none");continue;}
78                 printf("%lld\n",ss/(xx*1ll));continue;
79             }
80         }
81         return 0;
82     }
83 }
84 signed main(){return WSN::main();}
View Code

 

T3 Rectangle

 

 若是題解看不明白就看

再不明白就看

再再不明白就看:

 1 #include<bits/stdc++.h>
 2 #define rin register int
 3 #define pii pair<int,int>
 4 #define mp make_pair
 5 #define val first
 6 #define num second
 7 using namespace std;
 8 inline int read(){
 9     int x=0,f=1; char ch=getchar();
10     while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
11     while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
12     return x*f;
13 }
14 const int p=1e9+7;
15 int n,maxn;
16 long long ans;
17 pii bin[5005];
18 bool vis[2505];
19 struct SNOW{int x,y;}s[10005];
20 vector<int> pos[2505];
21 struct tree{
22     pii tr[2505];
23     inline int lowbit(int x){return x&(-x);}
24     inline void update(int x,pii v){for(rin i=x;i<=2501;i+=lowbit(i)) tr[i].val+=v.val,tr[i].num+=v.num;}
25     inline pii query(int x){pii ans=mp(0,0);for(rin i=x;i;i-=lowbit(i)) ans.val+=tr[i].val,ans.num+=tr[i].num;return ans;}
26 }S[2505];
27 namespace WSN{
28     inline short main(){
29         n=read();
30         for(rin i=1;i<=n;++i){
31             s[i].x=read(),s[i].y=read();
32             pos[s[i].x].push_back(s[i].y);
33             maxn=max(maxn,s[i].x);
34         }
35         for(rin i=1;i<=maxn;++i) sort(pos[i].begin(),pos[i].end());
36         for(rin i=1;i<=maxn;++i){
37             memset(vis,0,sizeof(vis));
38             for(rin j=0;j<pos[i].size();++j) if(!vis[pos[i][j]]){
39                 S[i].update(pos[i][j],mp(pos[i][j],1));
40                 vis[pos[i][j]]=1;
41             }
42             for(rin j=i-1;j>=1;--j){
43                 int it1=0,it=0;
44                 for(rin k=0;k<pos[j].size();++k){
45                     if(!vis[pos[j][k]]){
46                         S[i].update(pos[j][k],mp(pos[j][k],1));
47                         vis[pos[j][k]]=1;
48                     }
49                     while(it1<pos[i].size()&&pos[i][it1]<pos[j][k]) bin[++it]=mp(pos[i][it1],0),++it1;
50                     bin[++it]=mp(pos[j][k],1);
51                 }
52                 while(it1<pos[i].size()) bin[++it]=mp(pos[i][it1],0),++it1;
53                 it1=it-1; int it0=2501;
54                 if(it1>=1){
55                     for(rin k=it;k>=it1;--k){
56                         while(it1>=1&&bin[k].num==bin[it1].num) --it1;
57                         if(it1){
58                             pii sum1,sum3=S[i].query(it0),sum4=S[i].query(bin[k].val-1);
59                             sum1=mp(sum3.val-sum4.val,sum3.num-sum4.num);
60                             pii sum2=S[i].query(bin[it1].val);
61                             (ans+=1ll*(i-j)*(sum1.val*sum2.num-sum2.val*sum1.num))%=p;
62                             it0=bin[k].val-1;
63                         }
64                         else break;
65                     }
66                 }
67             }
68         }
69         printf("%lld\n",ans);
70         return 0;
71     }
72 }
73 signed main(){return WSN::main();}
View Code
相關文章
相關標籤/搜索