首页 > 其他分享 >Codeforces Round 966 (Div. 3)

Codeforces Round 966 (Div. 3)

时间:2024-09-03 19:26:17浏览次数:13  
标签:966 cout int cin Codeforces maxn mkp Div define

ab略...

C:

map嵌套水过去的,复杂度\(nlog^2n\),感觉不如正解

#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说明对数据结构有一些基本掌握而且代码熟练,我这种菜狗也是做不到的,还得加练。

标签:966,cout,int,cin,Codeforces,maxn,mkp,Div,define
From: https://www.cnblogs.com/lyrrr/p/18395241

相关文章

  • Codeforces Round 970 (Div. 3)(VP)
    A.Sakurako'sExam总结:一看n<=20,直接暴力+剪枝即可inlinevoidsolve(){ inta,b; cin>>a>>b; vector<int>d; d.reserve(a+b); while(a--){ d.push_back(1); } while(b--){ d.push_back(2); } autodfs=[&](auto&......
  • Codeforces Round 968 (Div. 2)
    vp的,老规矩跳过abC:根据题意我们知道三个不一样的字母连续放一定可以,然后观察样例发现好像把两个不同的字母轮流放也可以。进一步猜测(瞎猜的)发现这个好像只要把不同的挨个放进去就行了(本来以为可能要按数量排序但是似乎根本不用),最后剩下的全放一起也没事。然后就过了。#includ......
  • Codeforces Round 970 div3
    CodeforcesRound970div3错过的一场比赛,第二天早晨VP,题目的通过率还挺奇怪A.Sakurako'sExamhttps://codeforces.com/contest/2008/problem/A题意:有a个1和b个2的数组,在1和2前面增添加减号,判断是否能让结果为0思路:1个2需要2个1进行填补,不如先让2自己进行消去,如......
  • Codeforces Round 969 Div.2+Div.1
    A.Dora'sSet注意到任意两个偶数的\(\gcd\)都大于\(1\),因此选择的三个数中至多一个偶数,而注意到相邻的奇数一定互质,因此每次选两个奇数一个偶数,答案=奇数的个数÷2点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsigned......
  • codeforces做题记录(1924B)& 回顾线段树
    1924B.SpaceHarbour题意:n个点排成一行,其中某些点上面建有港湾,港湾有一个权值,对每个点我们定义点的权值为“左边(包括自己)第一个港湾上的权值\(\times\)到右边(包括自己)第一个港湾的距离”(保证在一开始1号和n号点上都有港湾)。有q次操作:操作1给定x和v,表示在x点上建立权值为v的......
  • Codeforces Round 969 (Div. 2)
    ab题没啥好说的,b题一开始看题错成线段树了,后面发现维护最大值就过了(我就说b怎么会有线段树)。。。C:DoraandC++卡的我死死的,好久没卡c了,数论果然是最短板。。。我有两个推论,但是一个都不会用:1.翡蜀定理。(但是这题只有正数)(处理两个数的情况)2.断环为链。(但是我只会n方,即以每个......
  • codeforces写题随录 ##1
    菜鸡刷题比赛日记之数学知识相关[https://codeforces.com/contest/2007/problem/C](C.DoraandC++)这题包含加A和加B,此处应该先考虑特殊情况a=b,若不进行如何操作的话,初始答案应该是res=a[n]-a[1](排序之后),然后进行操作,想想该如何最小化极差。为了便于计算,先将数组中每个数字......
  • Diffusion反馈强势助力CLIP秒变火眼金睛:北京智源研究院、中科院自动化所联合推出DIVA
    前言 本文分享论文DiffusionFeedbackHelpsCLIPSeeBetter,专注于通过自监督学习范式解决CLIP无法区分细粒度视觉细节的问题。欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。本文转载自我爱计算机视觉仅用于学术分享,若侵权......
  • Codeforces Round 873 (Div. 2)
    ABC都很简单,但是D1写起来有些麻烦,就没写,D2应该是一个分治的思路,后面想不出来了。D1的思路非常好出,n只有5e3的范围,意味着\((n^2)\)可过,可以直接枚举所有的子区间,也就是题目所说的子数组,然后尝试统计答案。考虑一个子区间的答案是什么样的,发现只有逆序的数字才需要排序,我们直接找......
  • CF1980F1 & F2 Field Division
    前言纪念一下独立做出来的\(2400\)的题Easyversion思路先说\(Easy\)版本的我们走路的方式只有可能是这种样子:(出处:luoguuserFiraCode)不想手绘图了即对列排序后,所形成的一个行编号上升的序列所以\(Easy\)就很简单了,对于每一列的最大值,如果大于当前前缀最大值,则......