Codeforces Round 966 (Div. 3)
ab略...
C:
map嵌套水过去的,复杂度
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second #define pb push_back const int maxn = 2e5+100; int a[maxn];bool vis[maxn]; signed main() { ios::sync_with_stdio(false); // 解除cin和cout的默认绑定,来降低IO的负担使效率提升 cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int n;cin>>n; map<int,int>mp,mp2; for(int i=1;i<=n;i++){ cin>>a[i]; } int x=1; int m;cin>>m;string s; while(m--){ x=1;cin>>s; mp.clear();mp2.clear(); if(s.size()==n){ for(int i=0;i<n;i++){ //cout<<a[i+1]<<' '; if(mp[a[i+1]]==0){ mp[a[i+1]]=(s[i]-'0')+1e9+7; if(mp2[mp[a[i+1]]]==0){ mp2[mp[a[i+1]]]=a[i+1]+1e9+7; } else{ x=0;break; } } else if((mp[a[i+1]]-1e9-7)!=(s[i]-'0')){ x=0;break; } } } else x=0; if(x)cout<<"YES"<<"\n"; else cout<<"NO"<<"\n"; } } }
D:
猜结论猜了一个每次选左右最大的区间,然后双指针结束。还是比较好理解的吧,因为存在大区间可取的情况下取小区间一定不优。
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second #define pb push_back const int maxn = 2e5+100; int pre[maxn]; int a[maxn];bool vis[maxn]; signed main() { ios::sync_with_stdio(false); // 解除cin和cout的默认绑定,来降低IO的负担使效率提升 cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int n;cin>>n; for(int i=1;i<=n;i++){ cin>>a[i];pre[i]=pre[i-1]+a[i]; } string s;cin>>s; int l=0,r=n-1;bool x=1; for(int i=1;i<n;i++){ if(s[i]!=s[i-1])x=0; } if(x){ cout<<0<<"\n"; continue; } int ans=0; while(l<r){ if(s[l]=='L'&&s[r]=='R'){ ans+=pre[r+1]-pre[l]; l++;r--; } if(s[l]!='L')l++; if(s[r]!='R')r--; } cout<<ans<<"\n"; } }
E:
一开始以为复杂度是2e5*2e5,后来发现只有2e5...一个星星最多会算k^2次,但是因为只有2e5所以可以直接暴力求每个格子的次数然后分配给星星(排序两次即可。。
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second #define pb push_back const int maxn = 2e5+10; int pre[maxn]; int a[maxn],p[maxn],tot; signed main() { ios::sync_with_stdio(false); // ½â³ýcinºÍcoutµÄĬÈϰ󶨣¬À´½µµÍIOµÄ¸ºµ£Ê¹Ð§ÂÊÌáÉý cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int n,m,k;cin>>n>>m>>k; int w;cin>>w;tot=0; for(int i=1;i<=w;i++){ cin>>a[i]; } sort(a+1,a+w+1);reverse(a+1,a+w+1); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int lu=min(i,n-k+1),ru=max(1LL*0,i-k); int lm=min(j,m-k+1),rm=max(1LL*0,j-k); p[++tot]=(ru-lu)*(rm-lm); } } sort(p+1,p+tot+1);reverse(p+1,p+tot+1); int sum=0; for(int i=1;i<=w;i++){ sum+=p[i]*a[i]; } cout<<sum<<"\n"; } }
F:
一开始以为选短的边最优,写完了最后一个样例没过,才发现思路假了,应该dp(看数据范围就应该知道但是我每次都看错数据范围)。
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second #define pb push_back const int maxn = 1005; int pre[maxn]; int a[maxn],dp[maxn][105],g[maxn]; signed main() { ios::sync_with_stdio(false); // ½â³ýcinºÍcoutµÄĬÈϰ󶨣¬À´½µµÍIOµÄ¸ºµ£Ê¹Ð§ÂÊÌáÉý cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int n,k;cin>>n>>k; for(int j=1;j<=k;j++) dp[0][j]=0x3f3f3f3f; for(int i=1;i<=n;i++){ int x,y;cin>>x>>y; int c=x,r=y; for(int j=1;j<=x+y;j++){ if(c<=r){ g[j]=g[j-1]+c; r--; } else{ g[j]=g[j-1]+r;c--; } } for(int j=1;j<=k;j++){ dp[i][j]=0x3f3f3f3f; for(int nw=0;nw<=min(j,x+y);nw++){ dp[i][j]=min(dp[i][j],dp[i-1][j-nw]+g[nw]); } //cout<<dp[i][j]<<"\n"; } } if(dp[n][k]==0x3f3f3f3f)cout<<-1<<"\n"; else cout<<dp[n][k]<<"\n"; } }
G:
很普通的最短路题,dijkstra就跑过了,以n为起点然后往1跑(因为终止时间是确定的,起始时间不确定),过程中判断一下是否在打电话即可。
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second #define pb push_back const int maxn = 1e5+10; vector<pair<int,pii> >g[maxn]; int dis[maxn];bool vis[maxn]; signed main() { ios::sync_with_stdio(false); // 解除cin和cout的默认绑定,来降低IO的负担使效率提升 cin.tie(NULL); cout.tie(NULL); int t; cin >> t; while (t--) { int n,m;cin>>n>>m; int t0,t1,t2;cin>>t0>>t1>>t2; for(int i=0;i<=max(n,m);i++)dis[i]=-1e9,vis[i]=0,g[i].clear(); while(m--){ int u,v,l1,l2;cin>>u>>v>>l1>>l2; g[u].push_back(mkp(v,mkp(l1,l2))); g[v].push_back(mkp(u,mkp(l1,l2))); } set<pii>q; dis[n]=t0;q.insert(mkp(t0,n)); while(!q.empty()){ pii p=*q.rbegin();q.erase(p); int u=p.sec,d=p.fir; if(vis[u])continue; vis[u]=1; for(auto i:g[u]){ int v=i.fir,l1=i.sec.fir,l2=i.sec.sec; int d1; if(d<=t1||d-l1>=t2)d1=d-l1; else d1=max(d-l2,t1-l1); if(d1>dis[v]){ dis[v]=d1; q.insert(mkp(dis[v],v)); } } } if(dis[1]>=0)cout<<dis[1]<<"\n"; else cout<<-1<<"\n"; } }
H:
还没看
总结:div3还是div3,但是能ak div3说明对数据结构有一些基本掌握而且代码熟练,我这种菜狗也是做不到的,还得加练。
分类:
G-Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端