暑假集训test-8-31(pm)

本文解析了三道编程题目:玩具装箱问题采用动态规划解决;铁路运费问题使用了图论与搜索算法;城墙问题则结合了二维数组处理与树状数组优化查询效率。

以为可以AK,结果t3没有调出来,然后被林巨踩了。

everyday被踩,很开心。

林巨真的好巨啊,这么多天已经总计虐我75分了。

 

1.玩具装箱

第一眼还以为是那道斜率优化dp,结果是个签到水题。

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=20007;
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 int n,m;
20 LL k,f[N],a[N];
21 
22 template<typename T>void read(T &x)  {
23     char ch=getchar(); x=0; T f=1;
24     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
25     if(ch=='-') f=-1,ch=getchar();
26     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
27 }
28 
29 #define ANS
30 int main() {
31 #ifdef ANS
32     freopen("toy.in","r",stdin);
33     freopen("toy.out","w",stdout);
34 #endif
35     read(n); read(m); read(k);
36     For(i,1,n) read(a[i]);
37     memset(f,127/3,sizeof(f));
38     f[0]=0;
39     For(i,1,n) {
40         LL mi=a[i],mx=a[i];
41         Rep(j,i-1,max(0,i-m)) {
42             f[i]=min(f[i],f[j]+k+(mx-mi)*(i-j));
43             mi=min(mi,a[j]);
44             mx=max(mx,a[j]);
45         }
46     }
47     printf("%lld\n",f[n]);
48     Formylove;
49 }
View Code

 

2.铁路运费

林巨写的比较优美,我比较傻就用set水过去了。

边权从1到2等于删边。

bfs树上树边和指向深度比它小的点的边有用,分别用set存一下。每次删树边的时候在另一个set里找还有没有可以用的父亲,有就连成新的树边,退出,没有就把它标记了然后删除它到它儿子的边,递归操作它儿子。

  1 //Achen
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<vector>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<cmath>
 10 #include<set>
 11 #include<map>
 12 #define Formylove return 0
 13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
 14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
 15 const int N=2e5+7;
 16 typedef long long LL;
 17 typedef double db;
 18 using namespace std;
 19 int n,m,q,ans,no[N];
 20 
 21 template<typename T>void read(T &x)  {
 22     char ch=getchar(); x=0; T f=1;
 23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
 24     if(ch=='-') f=-1,ch=getchar();
 25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
 26 }
 27 
 28 struct edge {
 29     int u,v;
 30 }e[N];
 31 
 32 int ecnt,fir[N],nxt[N<<1],to[N<<1];
 33 void init() { ecnt=0; memset(fir,0,sizeof(fir)); }
 34 void add(int u,int v) {
 35     nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
 36     nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
 37 }
 38 
 39 int d[N],fid[N];
 40 queue<int>que;
 41 set<int>s[N],son[N];
 42 
 43 void bfs(int s) {
 44     For(i,1,n) d[i]=n;
 45     d[s]=0;
 46     que.push(s);
 47     while(!que.empty()) {
 48         int x=que.front();
 49         que.pop();
 50         for(int i=fir[x];i;i=nxt[i]) if(d[to[i]]==n) {
 51             d[to[i]]=d[x]+1;
 52 
 53             son[x].insert(to[i]);
 54             que.push(to[i]); 
 55         }
 56     } 
 57 }
 58 
 59 void solve(int x,int fa) {
 60     son[fa].erase(x);
 61     s[x].erase(fa); 
 62     while(s[x].size()) {
 63         int y=*s[x].begin();
 64         if(!no[y]) { son[y].insert(x); return; }
 65         s[x].erase(y); 
 66     }
 67     ans++;
 68     no[x]=1;
 69     while(son[x].size()) {
 70         int y=*son[x].begin();
 71         solve(y,x);
 72     } 
 73 }
 74 
 75 #define ANS
 76 int main() {
 77 #ifdef ANS
 78     freopen("train.in","r",stdin);
 79     freopen("train.out","w",stdout);
 80 #endif
 81     read(n); read(m); read(q);
 82     For(i,1,m) {
 83         read(e[i].u); read(e[i].v); 
 84         add(e[i].u,e[i].v);
 85     }
 86     bfs(1);
 87     For(x,1,n) {
 88         for(int i=fir[x];i;i=nxt[i]) if(d[to[i]]+1==d[x]) 
 89             s[x].insert(to[i]);
 90     }
 91     For(ti,1,q) {
 92         int id;
 93         read(id);
 94         int u=e[id].u,v=e[id].v;
 95         if(son[u].find(v)!=son[u].end()||son[v].find(u)!=son[v].end()) {
 96             if(d[u]+1==d[v]) solve(v,u);
 97             else solve(u,v);
 98         }
 99         else {
100             if(s[v].find(u)!=s[v].end()) s[v].erase(u); 
101             else if(s[u].find(v)!=s[u].end()) s[u].erase(v);  
102         }
103         printf("%d\n",ans); 
104     }
105     Formylove;
106 }
107 /*
108 5 6 5
109 1 2
110 1 3
111 4 2
112 3 2
113 2 5
114 5 3
115 5
116 2
117 4
118 1
119 3
120 */
View Code

 

3.城墙

对于每个点维护它往右往下能到的最长没有x的长度记作a[i][j],往左往上能到达的没有x的最长长度b[i][j]。沿着对角线扫,用树状数组维护一下,把a放进树状数组,用b和L限制查询范围。

  1 //Achen
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<vector>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<cmath>
 10 #include<set>
 11 #include<map>
 12 #define Formylove return 0
 13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
 14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
 15 const int N=3007;
 16 typedef long long LL;
 17 typedef double db;
 18 using namespace std;
 19 int n,m,L,tot; 
 20 int mp[N][N],s[N][N],x[N][N],z[N][N],y[N][N],a[N][N],b[N][N];
 21 
 22 template<typename T>void read(T &x)  {
 23     char ch=getchar(); x=0; T f=1;
 24     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
 25     if(ch=='-') f=-1,ch=getchar();
 26     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
 27 }
 28 
 29 void pre() {
 30     For(i,1,n) {
 31         For(j,1,m) z[i][j]=mp[i][j]?0:z[i][j-1]+1; 
 32         Rep(j,m,1) y[i][j]=mp[i][j]?0:y[i][j+1]+1;
 33     }
 34     For(j,1,m) {
 35         For(i,1,n) s[i][j]=mp[i][j]?0:s[i-1][j]+1;
 36         Rep(i,n,1) x[i][j]=mp[i][j]?0:x[i+1][j]+1;
 37     }
 38     For(i,1,n) For(j,1,m) {
 39         a[i][j]=min(y[i][j],x[i][j]);
 40         b[i][j]=min(z[i][j],s[i][j]);
 41     }
 42 }
 43 
 44 int sum[N],up;
 45 void add(int x,int v) {
 46     if(!x) return; 
 47     for(int i=x;i<=up;i+=(i&(-i)))
 48         sum[i]+=v;
 49 }
 50 
 51 int qry(int x) {
 52     int rs=0;
 53     for(int i=x;i;i-=(i&(-i)))
 54         rs+=sum[i];
 55     return rs;
 56 }
 57 
 58 vector<int>vc[N],vc2[N];
 59 void solve() {
 60     LL ans=0;
 61     For(ty,1,m) {
 62         int x=1,y=ty;
 63         memset(sum,0,sizeof(sum));
 64         For(i,0,up) vc[i].clear(),vc2[i].clear(); 
 65         For(i,0,up) {
 66             if(x+i>n||y+i>m) break;
 67             if(i-L+1>=0&&i-L+1>i-b[x+i][y+i]) {
 68                 vc2[i-L+1].push_back(i);  
 69                 if(i-b[x+i][y+i]>=0) 
 70                     vc[i-b[x+i][y+i]].push_back(i);
 71             } 
 72         }
 73         For(i,0,up) {
 74             if(x+i>n||y+i>m) break;
 75             add(a[x+i][y+i]+i,1);
 76             int upp=vc[i].size();
 77             For(j,0,upp-1) 
 78                 ans-=qry(up)-qry(vc[i][j]);
 79             upp=vc2[i].size();
 80             For(j,0,upp-1)
 81                 ans+=qry(up)-qry(vc2[i][j]);
 82         }
 83     }
 84     For(tx,2,n) {
 85         int x=tx,y=1;
 86         memset(sum,0,sizeof(sum));
 87         For(i,0,up) vc[i].clear(),vc2[i].clear(); 
 88         For(i,0,up) {
 89             if(x+i>n||y+i>m) break;
 90             if(i-L+1>=0&&i-L+1>i-b[x+i][y+i]) {
 91                 vc2[i-L+1].push_back(i);  
 92                 if(i-b[x+i][y+i]>=0) 
 93                     vc[i-b[x+i][y+i]].push_back(i);
 94             } 
 95         }
 96         For(i,0,up) {
 97             if(x+i>n||y+i>m) break;
 98             add(a[x+i][y+i]+i,1);
 99             int upp=vc[i].size();
100             For(j,0,upp-1) 
101                 ans-=qry(up)-qry(vc[i][j]);
102             upp=vc2[i].size();
103             For(j,0,upp-1)
104                 ans+=qry(up)-qry(vc2[i][j]);
105         }
106     }
107     printf("%lld\n",ans);
108 }
109 
110 #define ANS
111 int main() {
112 #ifdef ANS
113     freopen("rampart.in","r",stdin);
114     freopen("rampart.out","w",stdout);
115 #endif
116     read(n); read(m); read(L); read(tot);
117     up=max(n,m);
118     For(i,1,tot) {
119         int x,y;
120         read(x); read(y);
121         mp[x][y]=1;
122     }
123     pre(); 
124     solve();
125     Formylove;
126 }
View Code

 

转载于:https://www.cnblogs.com/Achenchen/p/9571927.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值