11月下旬题解

(压根就没做几道题,无地自容QAQ)

gym101138 J

直接上树链剖分+线段树,注意处理好端点问题(其实有(Q+N)logN的做法)

  1 #include<bits/stdc++.h>
  2
  3 using namespace std;
  4 typedef long long ll;
  5 struct way{int po,next;} e[200010];
  6 struct node{ll lm,rm,s,mx;} tr[100010*4];
  7 int s[100010],a[100010],b[100010],c[100010],be[100010],d[100010],p[100010],fa[100010];
  8 int n,m,len,t,q;
  9 const ll mi=-1000000000ll*100001ll;
 10 const node inf={mi,mi,0,mi};
 11 void add(int x, int y)
 12 {
 13      e[++len].po=y;
 14      e[len].next=p[x];
 15      p[x]=len;
 16 }
 17
 18 void dfs1(int x)
 19 {
 20      s[x]=1;
 21      for (int i=p[x]; i; i=e[i].next)
 22      {
 23          int y=e[i].po;
 24          if (fa[x]!=y)
 25          {
 26             fa[y]=x; d[y]=d[x]+1;
 27             dfs1(y);
 28             s[x]+=s[y];
 29          }
 30      }
 31 }
 32
 33 void dfs2(int x)
 34 {
 35      c[x]=++t;
 36      b[t]=x;
 37      int q=0;
 38      for (int i=p[x]; i; i=e[i].next)
 39      {
 40          int y=e[i].po;
 41          if (c[y]==0&&s[q]<s[y]) q=y;
 42      }
 43      if (q)
 44      {
 45         be[q]=be[x];
 46         dfs2(q);
 47      }
 48      for (int i=p[x]; i; i=e[i].next)
 49      {
 50          int y=e[i].po;
 51          if (fa[x]!=y&&y!=q)
 52          {
 53             be[y]=y;
 54             dfs2(y);
 55          }
 56      }
 57 }
 58
 59 void update(node &a,node b,node c)
 60 {
 61     a.s=b.s+c.s;
 62     a.lm=max(b.lm,b.s+c.lm);
 63     a.rm=max(c.rm,c.s+b.rm);
 64     a.mx=max(b.rm+c.lm,max(b.mx,c.mx));
 65     a.mx=max(a.mx,max(a.rm,a.lm));
 66 }
 67
 68 void build(int i,int l,int r)
 69 {
 70     if (l==r) tr[i].mx=tr[i].s=tr[i].lm=tr[i].rm=a[b[l]];
 71     else {
 72         int m=(l+r)>>1;
 73         build(i*2,l,m);
 74         build(i*2+1,m+1,r);
 75         update(tr[i],tr[i*2],tr[i*2+1]);
 76     }
 77 }
 78
 79 node ask(int i,int l,int r,int x,int y)
 80 {
 81     if (x<=l&&y>=r) return tr[i];
 82     else {
 83         int m=(l+r)>>1;
 84         if (x<=m&&y>m)
 85         {
 86             node s,a=ask(i*2,l,m,x,y),b=ask(i*2+1,m+1,r,x,y);
 87             update(s,a,b);
 88             return s;
 89         }
 90         else if (x<=m) return ask(i*2,l,m,x,y);
 91         else if (y>m) return ask(i*2+1,m+1,r,x,y);
 92     }
 93 }
 94
 95 ll work(int x,int y)
 96 {
 97     node sx=inf,sy=inf,s;
 98     while (be[x]!=be[y])
 99     {
100           if (d[be[x]]>=d[be[y]])
101           {
102              update(sx,ask(1,1,n,c[be[x]],c[x]),sx);
103              x=fa[be[x]];
104           }
105           else {
106              update(sy,ask(1,1,n,c[be[y]],c[y]),sy);
107              y=fa[be[y]];
108           }
109     }
110     swap(sx.lm,sx.rm);
111     if (c[x]>c[y])
112     {
113         s=ask(1,1,n,c[y],c[x]); swap(s.lm,s.rm);
114         update(sx,sx,s);
115     }
116     else update(sy,ask(1,1,n,c[x],c[y]),sy);
117     update(s,sx,sy);
118     return s.mx;
119 }
120
121 int main()
122 {
123     scanf("%d",&n);
124     int x,y;
125     for (int i=1; i<n; i++)
126     {
127         scanf("%d%d",&x,&y);
128         add(x,y);
129         add(y,x);
130     }
131     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
132     dfs1(1);
133     t=0; be[1]=1;
134     dfs2(1);
135     build(1,1,n);
136     scanf("%d",&q);
137     for (int i=1; i<=q; i++)
138     {
139         scanf("%d%d",&x,&y);
140         printf("%I64d\n",work(x,y));
141     }
142 }

cf739 c

先差分,把差为0处理掉,就相当于拼接单调不下降序列,线段树维护之

 1 #include<bits/stdc++.h>
 2
 3 using namespace std;
 4 typedef long long ll;
 5 struct node{int lm,rm,mx;} tr[300010*4];
 6 int a[300010],n,q;
 7 ll b[300010];
 8
 9 int dcmp(ll a)
10 {
11     if (a>0) return 1;
12     if (a<0) return -1;
13     return 0;
14 }
15
16 void update(int i,int l,int r)
17 {
18     int m=(l+r)>>1;
19     tr[i].mx=max(tr[i*2].mx,tr[i*2+1].mx);
20     if (dcmp(b[m])<=dcmp(b[m+1])) tr[i].mx=max(tr[i].mx,tr[i*2].rm+tr[i*2+1].lm);
21     tr[i].lm=tr[i*2].lm;
22     if (tr[i].lm==m-l+1&&dcmp(b[m])<=dcmp(b[m+1])) tr[i].lm=tr[i].lm+tr[i*2+1].lm;
23     tr[i].rm=tr[i*2+1].rm;
24     if (tr[i].rm==r-m&&dcmp(b[m])<=dcmp(b[m+1])) tr[i].rm=tr[i].rm+tr[i*2].rm;
25 }
26
27 void build(int i,int l,int r)
28 {
29     if (l==r)
30     {
31         int w=dcmp(b[l])!=0;
32         tr[i]=(node){w,w,w};
33     }
34     else {
35         int m=(l+r)>>1;
36         build(i*2,l,m);
37         build(i*2+1,m+1,r);
38         update(i,l,r);
39     }
40 }
41
42 void work(int i,int l,int r,int x,int z)
43 {
44     if (l==r)
45     {
46         b[l]+=z;
47         int w=dcmp(b[l])!=0;
48         tr[i]=(node){w,w,w};
49     }
50     else {
51         int m=(l+r)>>1;
52         if (x<=m) work(i*2,l,m,x,z); else work(i*2+1,m+1,r,x,z);
53         update(i,l,r);
54     }
55 }
56
57 int main()
58 {
59     scanf("%d",&n);
60     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
61     for (int i=1; i<n; i++) b[i]=a[i]-a[i+1];
62     if (n>1) build(1,1,n-1);
63     scanf("%d",&q);
64     for (int i=1; i<=q; i++)
65     {
66         int l,r,z;
67         scanf("%d%d%d",&l,&r,&z);
68         if (n==1) puts("1");
69         else {
70             if (l>1) work(1,1,n-1,l-1,-z);
71             if (r<n) work(1,1,n-1,r,z);
72             printf("%d\n",tr[1].mx+1);
73         }
74
75     }
76 }

gym101138h

表示1~b意味着选出的面额从小到大排列后,任意s(i-1)+1>=di,然后可以用meet in middle加速(细节颇多)

 1 #include<bits/stdc++.h>
 2
 3 using namespace std;
 4 typedef long long ll;
 5 struct node{
 6     ll d,a;int id;
 7     friend bool operator <(node a,node b)
 8     {
 9         return a.d<b.d;
10     }
11 } a[50],c[(1<<21)+5];
12 int t,n1,n2,n,s1,s2,b,mi[(1<<21)+5],w[50];
13 ll ans;
14 const ll inf=9223372036854775807ll;
15
16 void pdf(int i,int st, ll sd, ll sa)
17 {
18     if (i==n1+1)
19     {
20         c[++t]=(node){sd,sa,st};
21         if (sd>=b&&ans>sa)
22         {
23             ans=sa;
24             s1=st; s2=0;
25         }
26         return;
27     }
28     pdf(i+1,st,sd,sa);
29     if (sd+1>=a[i].d) pdf(i+1,st|(1<<(i-1)),sd+a[i].d,sa+a[i].a);
30 }
31
32 void dfs(int i,int st,ll sd,ll sa,ll key)
33 {
34     if (i==n2+1)
35     {
36         node x=(node){max(key,b-sd),0,0};
37         int pos=lower_bound(c+1,c+1+t,x)-c;
38         if (pos==t+1) return;
39         if (c[mi[pos]].a+sa<ans)
40         {
41             s1=c[mi[pos]].id; s2=st;
42             ans=c[mi[pos]].a+sa;
43         }
44         return;
45     }
46     dfs(i+1,st,sd,sa,key);
47     dfs(i+1,st|(1<<(i-1)),sd+a[n1+i].d,sa+a[n1+i].a,max(key,a[i+n1].d-sd-1));
48 }
49
50 int main()
51 {
52     scanf("%d%d",&n,&b);
53     for (int i=1; i<=n; i++)
54     {
55         int x,y;
56         scanf("%d%d",&x,&y);
57         a[i]=(node){x,y,i};
58     }
59     sort(a+1,a+1+n);
60     ans=inf,s1=0,s2=0;
61     n1=n/2+(n%2),n2=n-n1,t=0;
62     pdf(1,0,0,0);
63     sort(c+1,c+1+t);
64     mi[t]=t;
65     for (int i=t-1; i; i--)
66       mi[i]=c[mi[i+1]].a>=c[i].a?i:mi[i+1];
67     dfs(1,0,0,0,0);
68     if (ans<inf)
69     {
70         int s=0;
71         for (int i=0; i<n1; i++)
72             if (s1&(1<<i)) w[++s]=a[i+1].id;
73         for (int i=0; i<n2; i++)
74             if (s2&(1<<i)) w[++s]=a[i+n1+1].id;
75         printf("%d\n",s);
76         for (int i=1; i<=s; i++)
77         {
78             printf("%d",w[i]);
79             if (i<s) printf(" "); else puts("");
80         }
81     }
82     else puts("-1");
83 }

之前还有些题有意思的以后再放吧

时间: 2024-10-06 10:25:34

11月下旬题解的相关文章

我做的网站www.lxggzz.cn 2018年11月下旬上线-枣庄立行广告装饰

经过精心的策划和筹备2018年11月枣庄市市中区立行广告部装修装饰专题网站上线了,域名:www.lxggzz.cn枣庄市市中区立行广告部,位于山东省枣庄市市中区君山中路300号,枣庄市君山小学向西50米路北,专注家庭 · 办公室 · 写字楼 · 店铺装修设计施工一条龙服务. 页面模块展示: 网站首页:工程案例多标签展示新闻动态及友情链接商业装修案例图片展示家庭装修效果图展示地址导航及联系方式 新闻文章显示页12月上旬搜索收录情况及排名 原文地址:http://blog.51cto.com/mfl

FOJ 11月月赛题解

抽空在vjudge上做了这套题.剩下FZU 2208数论题不会. FZU 2205 这是个想法题,每次可以在上一次基础上加上边数/2的新边. 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <queue

csu-2018年11月月赛Round2-div2题解

csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0=<X<=20,1<=Y<=20,X=<Z<=50 Input 单组数据 x,y,z的数值 Output 过Z个月以后,共有成虫对

csu-2018年11月月赛Round2-div1题解

csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党,所以每次只能取出一块积木放在积木顶层 现在Wells想知道至少需要操作几次可以把积木堆成从顶至底标号升序 不论什么都很菜的Wells显然不知道怎么做 所以作为人生赢家的你义不容辞的决定帮助可怜的Wells Input 第一行一个正整数N 接下来N行,从顶至底描述每块积木的标号 Output 输出一行

北京新房成交10月下旬暴增 二手房均价年内首次微涨

北京新房成交10月下旬暴增 二手房均价年内首次微涨 行业动态北京晨报[微博]杨奕2014-11-04 07:19 我要分享 4 [摘要]新政出台,无论是新房还是二手房,成交量肯定会上升.不过对于一手房的价格来讲,9万多套的库存依然是摆在开发商面前的严峻问题,因此目前价格还是以稳定为主. 晨报讯(记者杨奕)“银十”过去,房贷新政出台已经满月,一系列利好政策带动楼市回暖.10月份,北京新房和二手房成交量均有明显回升,二手房成交均价今年内首次出现微幅上涨. 10月,北京商品住宅成交经历了“过山车”式的

机构称11月京二手房网签环比增47% 降息春风渐暖楼市

机构称11月京二手房网签环比增47% 降息春风渐暖楼市 行业动态每日经济新闻[微博]胡健2014-12-01 00:59 我要分享 0 每经记者 胡健 发自北京 今年楼市的冬天因为降息等一系列利好政策而变得不那么寒冷. 据伟业我爱我家统计,11月前29日,北京全市二手住宅网签总量为10863套,环比增长47.2%,.11月全月二手房网签量约在11000套左右. 伟业我爱我家副总裁胡景晖告诉<每日经济新闻>记者,这一数值为本年度以来的月度最高点,同时也是今年以来二手住宅网签首次突破万套.市场的向

4月下旬国内网站流量统计5强:360安全中心跃居首位

IDC评述网(idcps.com)05月03日报道:根据中国互联网协会-中国网站排名公布的最新数据显示,截至2016年4月28日,国内网站独立访问量五强排名依次为:360安全中心.百度.腾讯网.搜狗.火狐中文网.具体情况请看下图: 通过上图,可清晰了解到,4月下旬,国内五大网站独立访问量排名发生明显变化.360安全中心一改上半月颓靡之态,流量一路猛蹿,排名不断上升,直至超越百度霸占首位,其流量上升势头依然不减. 正是360安全中心的后来居上,导致百度.腾讯网.搜狗与火狐中文网的排名均下降1位,分

USACO银组12月月赛题解

USACO银组12月月赛题解 Convention 题面 一场别开生面的牛吃草大会就要在Farmer John的农场举办了! 世界各地的奶牛将会到达当地的机场,前来参会并且吃草.具体地说,有N头奶牛到达了机场(1≤N≤105),其中奶牛i在时间ti(0≤ti≤109)到达.Farmer John安排了M(1≤M≤105)辆大巴来机场接这些奶牛.每辆大巴可以乘坐C头奶牛(1≤C≤N).Farmer John正在机场等待奶牛们到来,并且准备安排到达的奶牛们乘坐大巴.当最后一头乘坐某辆大巴的奶牛到达的

WINDOWS 10 企业版LTSB 2015年11月补丁更新情况

WINDOWS 10 企业版LTSB 2015年11月补丁与其他WINDOWS 10版本自动更新KB3105213,按微软对LTSB的规划,LTSB不会轻易增加新功能,所以不会收到其他版本推送的1511更新包,安装这个KB3105213不会改变LTSB内部版本号,LTSB目前内部版本号还是10240, 不会更新到10586版本. LTSB的内部版本按以前的官方说明,一年只会升级一次